File: change.rb

package info (click to toggle)
ruby-rsync 1.0.9-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 140 kB
  • sloc: ruby: 348; makefile: 3
file content (187 lines) | stat: -rw-r--r-- 3,470 bytes parent folder | download | duplicates (2)
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
module Rsync
  # Provides details about changes made to a specific file.
  #
  # Change Flags:
  #
  #  :no_change
  #  :identical
  #  :new
  #  :unknown
  #  :changed
  class Change
    def initialize(data)
      @data = data
    end

    # The filename associated with this change.
    # @return [String]
    def filename
      @data[12..-1]
    end

    # Whether the file was changed or not.
    # @return [Boolean]
    def changed?
      if update_type == :no_change
        false
      else
        true
      end
    end

    # Simple description of the change.
    # @return [String]
    def summary
      if update_type == :message
        message
      elsif update_type == :recv and @data[2,9] == "+++++++++"
        "creating local"
      elsif update_type == :recv
        "updating local"
      elsif update_type == :sent and @data[2,9] == "+++++++++"
        "creating remote"
      elsif update_type == :sent
        "updating remote"
      else
        changes = []
        [:checksum, :size, :timestamp, :permissions, :owner, :group, :acl].each do |prop|
          changes << prop if send(prop) == :changed
        end
        changes.join(", ")
      end
    end

    # @!group Change Flags

    # The change, if any, to the checksum of the file.
    # @return [Symbol]
    def checksum
      attribute_prop(2)
    end

    # The change, if any, to the size of the file.
    # @return [Symbol]
    def size
      attribute_prop(3)
    end

    # The change, if any, to the timestamp of the file.
    # @return [Symbol]
    def timestamp
      attribute_prop(4)
    end

    # The change, if any, to the file permissions.
    # @return [Symbol]
    def permissions
      attribute_prop(5)
    end

    # The change, if any, to the owner of the file.
    # @return [Symbol]
    def owner
      attribute_prop(6)
    end

    # The change, if any, to the group of the file.
    # @return [Symbol]
    def group
      attribute_prop(7)
    end

    # The change, if any, to the file ACL.
    # @return [Symbol]
    def acl
      attribute_prop(9)
    end

    # The change, if any, to the file's extended attributes.
    # @return [Symbol]
    def ext_attr
      attribute_prop(10)
    end

    # @!endgroup

    # The type of update made to the file.
    #
    #  :sent
    #  :recv
    #  :change
    #  :hard_link
    #  :no_update
    #  :message
    #
    # @return [Symbol]
    def update_type
      case raw_update_type
        when '<'
          :sent
        when '>'
          :recv
        when 'c'
          :change
        when 'h'
          :hard_link
        when '.'
          :no_update
        when '*'
          :message
      end
    end

    # The type of file.
    #
    #  :file
    #  :directory
    #  :symlink
    #  :device
    #  :special
    #
    # @return [Symbol]
    def file_type
      case raw_file_type
        when 'f'
          :file
        when 'd'
          :directory
        when 'L'
          :symlink
        when 'D'
          :device
        when 'S'
          :special
      end
    end

private

    def message
      @data[1..10].strip
    end

    def raw_update_type
      @data[0,1]
    end

    def raw_file_type
      @data[1,1]
    end

    def attribute_prop(index)
      case @data[index,1]
        when '.'
          :no_change
        when ' '
          :identical
        when '+'
          :new
        when '?'
          :unknown
        else
          :changed
      end
    end

  end
end