directory-digest 1.0.10 → 1.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/directory-digest/digest.rb +37 -20
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fba379a6e0a6dc1ee8244f4706327f7c4d52a2fc
4
- data.tar.gz: 2d63dd3b5ad5be5ee33fad0fc9b5efa00bc6b427
3
+ metadata.gz: bab866137fa3d9bef2079f75a248c731bbf3374e
4
+ data.tar.gz: be7f3c5e0e3f79f5500689299a1eac6ec1907725
5
5
  SHA512:
6
- metadata.gz: de9514f76d276e2213cb8d6e76b527a49d07a198d652e0f4c45ad1631cf54928e1c16c67f9bbb5f2b198ad7dd8215bb0c82c810ed04e4a997b71e59368a17971
7
- data.tar.gz: f3cd4b27d636ebe3ae22cf65a1361962c468e7767faf3dcc852b6611552c86a1e1db9f961d77668ebb3fe80cd0265614f29784136dc260ac1fef35ac5489e6f5
6
+ metadata.gz: 1359d90362fb8453ab4a84a35a763c41f4f2854135beaf98b488cd39eeb0c65565faa3363199a9f537ce085e45f4692a209b8fefc90d24f63931ed14b5b39827
7
+ data.tar.gz: 79cdea96956c5732923c8ea67c525128a7cb19642015a443b73eecfd0e6afe949ac9982d5794e74f8ebe19caab0eeff085a0aa04b15555abcb82f456442c0023
@@ -8,11 +8,13 @@ module DirectoryDigest
8
8
  attr_reader :directory
9
9
  attr_reader :directory_digest
10
10
  attr_reader :file_digests
11
+ attr_reader :files_excluded
11
12
 
12
- def initialize(directory, directory_digest, file_digests)
13
+ def initialize(directory, directory_digest, file_digests, files_excluded)
13
14
  @directory = directory.freeze
14
15
  @directory_digest = directory_digest.freeze
15
16
  @file_digests = file_digests.freeze
17
+ @files_excluded = files_excluded.freeze
16
18
  end
17
19
 
18
20
  def self.sha256(directory, glob = '**/*', include = proc { true })
@@ -25,20 +27,25 @@ module DirectoryDigest
25
27
  end
26
28
  directory_digest = OpenSSL::Digest::SHA256.new
27
29
  file_digests = {}
30
+ files_excluded = []
28
31
  Dir["#{directory}/#{glob}"].each do |filename|
32
+ next unless File.file?(filename)
29
33
  path = filename[directory.size..-1]
30
- next unless File.file?(filename) && include.call(path)
31
- file_digest = OpenSSL::Digest::SHA256.new
32
- File.open(filename, 'rb') do |file|
33
- until file.eof?
34
- chunk = file.read(4096)
35
- directory_digest << chunk
36
- file_digest << chunk
34
+ if include.call(path)
35
+ file_digest = OpenSSL::Digest::SHA256.new
36
+ File.open(filename, 'rb') do |file|
37
+ until file.eof?
38
+ chunk = file.read(4096)
39
+ directory_digest << chunk
40
+ file_digest << chunk
41
+ end
37
42
  end
43
+ file_digests[path] = file_digest.hexdigest
44
+ else
45
+ files_excluded << path
38
46
  end
39
- file_digests[path] = file_digest.hexdigest
40
47
  end
41
- Digest.new(directory, directory_digest.hexdigest, file_digests)
48
+ Digest.new(directory, directory_digest.hexdigest, file_digests, files_excluded)
42
49
  end
43
50
 
44
51
  def ==(other)
@@ -54,36 +61,46 @@ module DirectoryDigest
54
61
  added: file_digests.select { |path, _| !other.file_digests.key?(path) },
55
62
  removed: other.file_digests.select { |path, _| !file_digests.key?(path) },
56
63
  changed: other.file_digests.select { |path, digest| file_digests.key?(path) && digest != file_digests[path] },
57
- unchanged: other.file_digests.select { |path, digest| file_digests.key?(path) && digest == file_digests[path] }
64
+ unchanged: other.file_digests.select { |path, digest| file_digests.key?(path) && digest == file_digests[path] },
65
+ excluded: files_excluded | other.files_excluded
58
66
  }
59
67
  end
60
68
 
61
69
  def mirror_from(other, actions = MirrorActions.new)
62
- files_copied = 0
63
- files_deleted = 0
64
70
  changes = changes_relative_to(other)
65
- changes[:removed].merge(changes[:changed]).each do |path, _|
71
+ to_copy = changes[:removed].merge(changes[:changed])
72
+ to_copy.keys.each do |path|
66
73
  source_path = "#{other.directory}#{path}"
67
74
  destination_path = "#{directory}#{path}"
68
75
  destination_directory = File.dirname(destination_path)
69
76
  actions.create_directory(destination_directory) unless Dir.exist?(destination_directory)
70
77
  actions.copy_file(source_path, destination_path)
71
- files_copied += 1
72
78
  end
73
- changes[:added].each do |path, _|
79
+ to_delete = changes[:added]
80
+ to_delete.keys.each do |path|
74
81
  actions.delete_file("#{directory}#{path}")
75
- files_deleted += 1
76
82
  end
77
- { files_copied: files_copied, files_deleted: files_deleted }
83
+ {
84
+ copied: to_copy,
85
+ deleted: to_delete,
86
+ unchanged: changes[:unchanged],
87
+ excluded: changes[:excluded]
88
+ }
78
89
  end
79
90
 
80
91
  def to_json
81
- JSON.pretty_generate(directory: directory, directory_digest: directory_digest, file_digests: file_digests)
92
+ JSON.pretty_generate(directory: directory,
93
+ directory_digest: directory_digest,
94
+ file_digests: file_digests,
95
+ files_excluded: files_excluded)
82
96
  end
83
97
 
84
98
  def self.from_json(json)
85
99
  json = JSON.parse(json)
86
- Digest.new(json['directory'], json['directory_digest'], json['file_digests'])
100
+ Digest.new(json['directory'],
101
+ json['directory_digest'],
102
+ json['file_digests'],
103
+ json['files_excluded'])
87
104
  end
88
105
  end
89
106
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: directory-digest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.10
4
+ version: 1.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Heald
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-23 00:00:00.000000000 Z
11
+ date: 2016-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -85,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
85
  version: '0'
86
86
  requirements: []
87
87
  rubyforge_project:
88
- rubygems_version: 2.5.1
88
+ rubygems_version: 2.4.8
89
89
  signing_key:
90
90
  specification_version: 4
91
91
  summary: Creates a SHA256 digest of all of the files in a directory.