File: file_stat.rb

package info (click to toggle)
ruby-zip 3.2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,120 kB
  • sloc: ruby: 9,958; makefile: 23
file content (110 lines) | stat: -rw-r--r-- 2,262 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# frozen_string_literal: true

module Zip
  module FileSystem
    class File # :nodoc:all
      class Stat # :nodoc:all
        class << self
          def delegate_to_fs_file(*methods)
            methods.each do |method|
              class_exec do
                define_method(method) do
                  @zip_fs_file.__send__(method, @entry_name)
                end
              end
            end
          end
        end

        def initialize(zip_fs_file, entry_name)
          @zip_fs_file = zip_fs_file
          @entry_name = entry_name
        end

        def kind_of?(type)
          super || type == ::File::Stat
        end

        delegate_to_fs_file :file?, :directory?, :pipe?, :chardev?, :symlink?,
                            :socket?, :blockdev?, :readable?, :readable_real?, :writable?, :ctime,
                            :writable_real?, :executable?, :executable_real?, :sticky?, :owned?,
                            :grpowned?, :setuid?, :setgid?, :zero?, :size, :size?, :mtime, :atime

        def blocks
          nil
        end

        def gid
          e = find_entry
          if e.extra.member? :iunix
            e.extra[:iunix].gid || 0
          else
            0
          end
        end

        def uid
          e = find_entry
          if e.extra.member? :iunix
            e.extra[:iunix].uid || 0
          else
            0
          end
        end

        def ino
          0
        end

        def dev
          0
        end

        def rdev
          0
        end

        def rdev_major
          0
        end

        def rdev_minor
          0
        end

        def ftype
          if file?
            'file'
          elsif directory?
            'directory'
          else
            raise StandardError, 'Unknown file type'
          end
        end

        def nlink
          1
        end

        def blksize
          nil
        end

        def mode
          e = find_entry
          if e.fstype == FSTYPE_UNIX
            e.external_file_attributes >> 16
          else
            0o100_666 # Equivalent to -rw-rw-rw-.
          end
        end

        private

        def find_entry
          @zip_fs_file.find_entry(@entry_name)
        end
      end
    end
  end
end