module FsCache::Attributes::Crc::Helpers

Add helpers to the cache

Public Instance Methods

diff_dirs(dir1, dir2) click to toggle source

Provide info on the differences between 2 directories.

Parameters
  • dir1 (String): First directory

  • dir2 (String): Second directory

Result
  • Hash<Symbol,Object>: Difference between the 2 directories (dir2 - dir1):

    • same (Array<String>): Same files

    • renamed (Array<>): Renamed files (from dir1 to dir2: [file_base1, file_base2])

    • added (Array<String>): Added files

    • deleted (Array<String>): Deleted files

    • different (Array<String>): Different files

# File lib/fs_cache/attributes/crc.rb, line 55
def diff_dirs(dir1, dir2)
  files1 = Hash[files_in(dir1).map { |file| [file, "#{dir1}/#{file}"] }]
  files2 = Hash[files_in(dir2).map { |file| [file, "#{dir2}/#{file}"] }]
  same = []
  different = []
  renamed = []
  # First process files having the same names
  files1.delete_if do |file_base1, file1|
    if files2.key?(file_base1)
      # A file with same name exists in dir2
      if crc_for(files2[file_base1]) == crc_for(file1)
        same << file_base1
      else
        different << file_base1
      end
      files2.delete(file_base1)
      true
    else
      false
    end
  end
  # Then process files having the same CRC among the remaining ones
  files1.delete_if do |file_base1, file1|
    crc1 = crc_for(file1)
    found_file_base2, _found_file2 = files2.find { |_file_base2, file2| crc_for(file2) == crc1 }
    if found_file_base2.nil?
      false
    else
      renamed << [file_base1, found_file_base2]
      files2.delete(found_file_base2)
      true
    end
  end
  remaining_files1 = files1.keys
  remaining_files2 = files2.keys
  {
    same: same,
    renamed: renamed,
    added: remaining_files2 - remaining_files1,
    deleted: remaining_files1 - remaining_files2,
    different: different
  }
end