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

current[R]

Set of files as they appear on disk.

ignore[R]

Instance of Ignore is used to filter “boring files”.

Returns [Ignore]

name[R]

Name of digest, which corresponds to the rule bookmark.

Returns [Ignore]

saved[R]

Set of files as saved in the digest.

Public Class Methods

clear_digests() click to toggle source

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
latest(*names) click to toggle source

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
new(options={}) click to toggle source

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(name) click to toggle source

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

checksum(file) click to toggle source

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
filename() click to toggle source

The digest file’s path.

Returns [String]

# File lib/ergo/digest.rb, line 81
def filename
  File.join(DIRECTORY, "#{name}.digest")
end
filter(list) click to toggle source

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
read() click to toggle source

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
refresh() click to toggle source

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() click to toggle source

Remove digest.

# File lib/ergo/digest.rb, line 148
def remove
  if File.exist?(filename)
    FileUtils.rm(filename)
  end
end
save() click to toggle source

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
to_s() click to toggle source

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