Module: FsCache::Attributes::Crc::Helpers

Defined in:
lib/fs_cache/attributes/crc.rb

Overview

Add helpers to the cache

Instance Method Summary collapse

Instance Method Details

#diff_dirs(dir1, dir2) ⇒ Object

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



55
56
57
58
59
60
61
62
63
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
# 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