class Ergo::Digest
Digest
class is used to read and write lists of files with their associated checksums. This class uses SHA1.
Constants
- DIRECTORY
The digest file to use if the root directory has a ‘log/` directory.
- MASTER_NAME
The name of the master digest.
Attributes
Set of files as they appear on disk.
Instance of Ignore
is used to filter “boring files”.
Returns [Ignore]
Name of digest, which corresponds to the rule bookmark.
Returns [Ignore]
Set of files as saved in the digest.
Public Class Methods
Remove all digests.
# File lib/ergo/digest.rb, line 31 def self.clear_digests Dir.glob(File.join(DIRECTORY, "*.digest")).each do |file| FileUtils.rm(file) end end
Get the name of the most recent digest given a selection of names from which to choose.
names - Selection of names. [Array<String>]
Returns the digests name. [String]
# File lib/ergo/digest.rb, line 21 def self.latest(*names) names = names.select do |name| File.exist?(File.join(DIRECTORY, "#{name}.digest")) end names.max do |name| File.mtime(File.join(DIRECTORY, "#{name}.digest")) end end
Initialize new instance of Digest
.
Options
ignore - Instance of Ignore for filtering unwanted files. [Ignore] mark - Name of digest to load. [String]
# File lib/ergo/digest.rb, line 67 def initialize(options={}) @ignore = options[:ignore] @name = options[:name] || MASTER_NAME @current = {} @saved = {} read refresh end
Remove digest by name.
# File lib/ergo/digest.rb, line 38 def self.remove_digest(name) file = File.join(DIRECTORY, "#{name}.digest") if file.exist?(file) FileUtils.rm(file) end end
Public Instance Methods
Compute the sha1 identifer for a file.
file - path to a file
Returns [String] SHA1 digest string.
# File lib/ergo/digest.rb, line 170 def checksum(file) sha = ::Digest::SHA1.new File.open(file, 'r') do |fh| fh.each_line do |l| sha << l end end sha.hexdigest end
The digest file’s path.
Returns [String]
# File lib/ergo/digest.rb, line 81 def filename File.join(DIRECTORY, "#{name}.digest") end
Filter files of those to be ignored.
Return [Array<String>]
# File lib/ergo/digest.rb, line 183 def filter(list) case ignore when Ignore ignore.filter(list) when Array list.reject{ |path| ignore.any?{ |ig| /^#{ig}/ =~ path } } else list end end
Load digest from file system.
Returns nothing.
# File lib/ergo/digest.rb, line 88 def read file = filename # if the digest doesn't exist fallback to master digest unless File.exist?(file) file = File.join(DIRECTORY, "#{MASTER_NAME}.digest") end return unless File.exist?(file) File.read(file).lines.each do |line| if md = /^(\w+)\s+(.*?)$/.match(line) @saved[md[2]] = md[1] end end end
Gather current digest for all files.
Returns nothing.
# File lib/ergo/digest.rb, line 124 def refresh list = Dir['**/*'] list = filter(list) list.each do |path| if File.directory?(path) # how to handle directories as a whole? elsif File.exist?(path) id = checksum(path) @current[path] = id end end end
Remove digest.
# File lib/ergo/digest.rb, line 148 def remove if File.exist?(filename) FileUtils.rm(filename) end end
Save current digest.
Returns nothing.
# File lib/ergo/digest.rb, line 140 def save FileUtils.mkdir_p(DIRECTORY) unless File.directory?(DIRECTORY) File.open(filename, 'w') do |f| f << to_s end end
Produce the test representation of the digest that is stored to disk.
Returns digest file format. [String]
# File lib/ergo/digest.rb, line 157 def to_s s = "" current.each do |path, id| s << "#{id} #{path}\n" end s end