Class: FileDigests::Checker
- Inherits:
-
Object
- Object
- FileDigests::Checker
- Defined in:
- lib/file-digests.rb
Instance Method Summary collapse
- #check ⇒ Object
- #get_file_digest(filename) ⇒ Object
-
#initialize(files_path, digest_database_path) ⇒ Checker
constructor
A new instance of Checker.
- #process_file(filename) ⇒ Object
- #walk_files ⇒ Object
Constructor Details
#initialize(files_path, digest_database_path) ⇒ Checker
Returns a new instance of Checker.
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/file-digests.rb', line 156 def initialize files_path, digest_database_path @counters = {good: 0, updated: 0, new: 0, missing: 0, renamed: 0, likely_damaged: 0, exceptions: 0} @files_path = files_path @prefix_to_remove = @files_path.to_s + '/' unless digest_database_path digest_database_path = @files_path + '.file-digests.sqlite' @skip_file_digests_sqlite = true end FileDigests::ensure_dir_exists @files_path FileDigests::ensure_dir_exists digest_database_path.dirname @digest_database = DigestDatabase.new digest_database_path end |
Instance Method Details
#check ⇒ Object
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/file-digests.rb', line 172 def check FileDigests::measure_time do walk_files do |filename| process_file filename end end @digest_database.process_missing_files @counters if @counters[:likely_damaged] > 0 || @counters[:exceptions] > 0 STDERR.puts "ERRORS WERE OCCURRED" end puts @counters.inspect end |
#get_file_digest(filename) ⇒ Object
225 226 227 228 229 230 231 232 233 234 |
# File 'lib/file-digests.rb', line 225 def get_file_digest filename File.open(filename, 'rb') do |io| digest = Digest::SHA512.new buffer = "" while io.read(40960, buffer) digest.update(buffer) end return digest.hexdigest end end |
#process_file(filename) ⇒ Object
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/file-digests.rb', line 194 def process_file filename return if File.symlink? filename stat = File.stat filename return if stat.blockdev? return if stat.chardev? return if stat.directory? return if stat.pipe? unless stat.readable? raise "File is not readable" end return if stat.socket? if @skip_file_digests_sqlite return if filename == '.file-digests.sqlite' return if filename == '.file-digests.sqlite-wal' return if filename == '.file-digests.sqlite-shm' end @digest_database.insert_or_update( filename.delete_prefix(@prefix_to_remove).unicode_normalize(:nfkc), stat.mtime.utc.strftime('%Y-%m-%d %H:%M:%S'), get_file_digest(filename), @counters ) rescue => exception @counters[:exceptions] += 1 STDERR.puts "EXCEPTION: #{filename}: #{exception.}" end |
#walk_files ⇒ Object
188 189 190 191 192 |
# File 'lib/file-digests.rb', line 188 def walk_files Dir.glob(@files_path + '**' + '*', File::FNM_DOTMATCH) do |filename| yield filename end end |