class Fire::Digest

Constants

DEFAULT_FILE

Attributes

current[R]
file[R]
ignore[R]
saved[R]

Public Class Methods

new(options={}) click to toggle source
# File lib/fire/digest.rb, line 26
def initialize(options={})
  @file   = options[:file]   || DEFAULT_FILE
  @ignore = options[:ignore] || []

  @current = {}
  @saved   = {}

  read
  refresh
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/fire/digest.rb, line 100
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
read() click to toggle source

Load saved digest.

# File lib/fire/digest.rb, line 38
def read
  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/fire/digest.rb, line 66
def refresh
  list = Dir['**/*']
  list = list.reject{ |path| ignore.any?{ |ig| /^#{ig}/ =~ path } }
  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
save() click to toggle source

Save current digest.

# File lib/fire/digest.rb, line 80
def save
  dir = File.dirname(file)
  FileUtils.mkdir(dir) unless File.directory?(dir)
  File.open(file, 'w'){ |f| f << to_s }      
end
to_s() click to toggle source

Returns [String] digest file format.

# File lib/fire/digest.rb, line 87
def to_s
  s = ""
  current.each do |path, id|
    s << "#{id} #{path}\n"
  end
  s
end