Class: Build::Files::State

Inherits:
Object
  • Object
show all
Defined in:
lib/build/files/state.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(files) ⇒ State

Returns a new instance of State.

Raises:

  • (ArgumentError)


45
46
47
48
49
50
51
52
53
# File 'lib/build/files/state.rb', line 45

def initialize(files)
  raise ArgumentError.new("Invalid files list: #{files}") unless Files::List === files

  @files = files
    
  @times = {}

  update!
end

Instance Attribute Details

#addedObject (readonly)

Returns the value of attribute added.



57
58
59
# File 'lib/build/files/state.rb', line 57

def added
  @added
end

#changedObject (readonly)

Returns the value of attribute changed.



59
60
61
# File 'lib/build/files/state.rb', line 59

def changed
  @changed
end

#filesObject (readonly)

Returns the value of attribute files.



55
56
57
# File 'lib/build/files/state.rb', line 55

def files
  @files
end

#missingObject (readonly)

Returns the value of attribute missing.



60
61
62
# File 'lib/build/files/state.rb', line 60

def missing
  @missing
end

#newest_timeObject (readonly)

Returns the value of attribute newest_time.



118
119
120
# File 'lib/build/files/state.rb', line 118

def newest_time
  @newest_time
end

#oldest_timeObject (readonly)

Returns the value of attribute oldest_time.



117
118
119
# File 'lib/build/files/state.rb', line 117

def oldest_time
  @oldest_time
end

#removedObject (readonly)

Returns the value of attribute removed.



58
59
60
# File 'lib/build/files/state.rb', line 58

def removed
  @removed
end

#timesObject (readonly)

Returns the value of attribute times.



62
63
64
# File 'lib/build/files/state.rb', line 62

def times
  @times
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/build/files/state.rb', line 131

def empty?
  @files.to_a.empty?
end

#inspectObject



135
136
137
# File 'lib/build/files/state.rb', line 135

def inspect
  "<State Added:#{@added} Removed:#{@removed} Changed:#{@changed} Missing:#{@missing}>"
end

#intersects?(outputs) ⇒ Boolean

Outputs is a list of full paths and must not include any patterns/globs.

Returns:

  • (Boolean)


127
128
129
# File 'lib/build/files/state.rb', line 127

def intersects?(outputs)
  @files.intersects?(outputs)
end

#missing?Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/build/files/state.rb', line 122

def missing?
  !@missing.empty?
end

#update!Object



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
# File 'lib/build/files/state.rb', line 64

def update!
  last_times = @times
  @times = {}

  @added = []
  @removed = []
  @changed = []
  @missing = []

  file_times = []
  
  @files.each do |path|
    # When processing the same path twice (perhaps by accident), we should skip it otherwise it might cause issues when being deleted from last_times multuple times.
    next if @times.include? path
    
    if File.exist?(path)
      modified_time = File.mtime(path)
    
      if last_time = last_times.delete(path)
        # Path was valid last update:
        if modified_time != last_time
          @changed << path
          
          # puts "Changed: #{path}"
        end
      else
        # Path didn't exist before:
        @added << path
        
        # puts "Added: #{path}"
      end
    
      @times[path] = modified_time
    
      unless File.directory?(path)
        file_times << FileTime.new(path, modified_time)
      end
    else
      @missing << path
      
      # puts "Missing: #{path}"
    end
  end
  
  @removed = last_times.keys
  # puts "Removed: #{@removed.inspect}" if @removed.size > 0
  
  @oldest_time = file_times.min
  @newest_time = file_times.max
  
  return @added.size > 0 || @changed.size > 0 || @removed.size > 0 || @missing.size > 0
end