moab-versioning 4.2.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/moab/bagger.rb +17 -19
- data/lib/moab/config.rb +5 -6
- data/lib/moab/deposit_bag_validator.rb +2 -4
- data/lib/moab/exceptions.rb +0 -5
- data/lib/moab/file_group.rb +13 -17
- data/lib/moab/file_group_difference.rb +15 -19
- data/lib/moab/file_group_difference_subset.rb +2 -4
- data/lib/moab/file_instance.rb +3 -8
- data/lib/moab/file_instance_difference.rb +2 -6
- data/lib/moab/file_inventory.rb +18 -22
- data/lib/moab/file_inventory_difference.rb +3 -7
- data/lib/moab/file_manifestation.rb +3 -6
- data/lib/moab/file_signature.rb +45 -33
- data/lib/moab/signature_catalog.rb +13 -16
- data/lib/moab/signature_catalog_entry.rb +3 -7
- data/lib/moab/storage_object.rb +28 -31
- data/lib/moab/storage_object_validator.rb +28 -70
- data/lib/moab/storage_object_version.rb +47 -50
- data/lib/moab/storage_repository.rb +17 -21
- data/lib/moab/storage_services.rb +12 -14
- data/lib/moab/utc_time.rb +18 -19
- data/lib/moab/verification_result.rb +26 -37
- data/lib/moab/version_metadata.rb +1 -5
- data/lib/moab/version_metadata_entry.rb +2 -6
- data/lib/moab/version_metadata_event.rb +2 -7
- data/lib/serializer/manifest.rb +6 -10
- data/lib/serializer/serializable.rb +23 -27
- data/lib/stanford/active_fedora_object.rb +0 -4
- data/lib/stanford/content_inventory.rb +49 -52
- data/lib/stanford/dor_metadata.rb +5 -8
- data/lib/stanford/storage_object_validator.rb +1 -2
- data/lib/stanford/storage_repository.rb +0 -4
- data/lib/stanford/storage_services.rb +6 -10
- metadata +2 -2
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A container for recording difference information at the file level
|
6
5
|
# * If there was no change, the change type is set to <i>identical</i>
|
7
6
|
# * If the signature is unchanged, but the path has moved, the change type is set to <i>renamed</i>
|
@@ -21,15 +20,14 @@ module Moab
|
|
21
20
|
#
|
22
21
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
23
22
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
24
|
-
class FileInstanceDifference
|
25
|
-
|
23
|
+
class FileInstanceDifference < Serializer::Serializable
|
26
24
|
include HappyMapper
|
27
25
|
|
28
26
|
# The name of the XML element used to serialize this objects data
|
29
27
|
tag 'file'
|
30
28
|
|
31
29
|
# (see Serializable#initialize)
|
32
|
-
def initialize(opts={})
|
30
|
+
def initialize(opts = {})
|
33
31
|
@signatures = Array.new
|
34
32
|
super(opts)
|
35
33
|
end
|
@@ -49,7 +47,5 @@ module Moab
|
|
49
47
|
# @attribute
|
50
48
|
# @return [Array<FileSignature>] The fixity data of the file manifestation(s) (plural if change was a content modification)
|
51
49
|
has_many :signatures, FileSignature, :tag => 'fileSignature'
|
52
|
-
|
53
50
|
end
|
54
|
-
|
55
51
|
end
|
data/lib/moab/file_inventory.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A structured container for recording information about a collection of related files.
|
6
5
|
#
|
7
6
|
# The <b>scope</b> of the file collection depends on inventory type:
|
@@ -29,14 +28,13 @@ module Moab
|
|
29
28
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
30
29
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
31
30
|
class FileInventory < Serializer::Manifest
|
32
|
-
|
33
31
|
include HappyMapper
|
34
32
|
|
35
33
|
# The name of the XML element used to serialize this object's data
|
36
34
|
tag 'fileInventory'
|
37
35
|
|
38
36
|
# (see Serializable#initialize)
|
39
|
-
def initialize(opts={})
|
37
|
+
def initialize(opts = {})
|
40
38
|
@groups = Array.new
|
41
39
|
@inventory_datetime = Time.now
|
42
40
|
super(opts)
|
@@ -106,7 +104,7 @@ module Moab
|
|
106
104
|
|
107
105
|
# @param non_empty [Boolean] if true, return group_id's only for groups having files
|
108
106
|
# @return [Array<String>] group identifiers contained in this file inventory
|
109
|
-
def group_ids(non_empty=nil)
|
107
|
+
def group_ids(non_empty = nil)
|
110
108
|
my_groups = non_empty ? self.non_empty_groups : groups
|
111
109
|
my_groups.map { |g| g.group_id }
|
112
110
|
end
|
@@ -114,7 +112,7 @@ module Moab
|
|
114
112
|
# @param [String] group_id The identifer of the group to be selected
|
115
113
|
# @return [FileGroup] The file group in this inventory for the specified group_id
|
116
114
|
def group(group_id)
|
117
|
-
groups.find { |group| group.group_id == group_id}
|
115
|
+
groups.find { |group| group.group_id == group_id }
|
118
116
|
end
|
119
117
|
|
120
118
|
# @param group_id [String] File group identifer (e.g. data, metadata, manifests)
|
@@ -183,7 +181,7 @@ module Moab
|
|
183
181
|
# if nil, then the directory is assumed to contain both content and metadata subdirectories
|
184
182
|
# @return [FileInventory] Traverse a directory and return an inventory of the files it contains
|
185
183
|
# @example {include:file:spec/features/inventory/harvest_inventory_spec.rb}
|
186
|
-
def inventory_from_directory(data_dir, group_id=nil)
|
184
|
+
def inventory_from_directory(data_dir, group_id = nil)
|
187
185
|
if group_id
|
188
186
|
groups << FileGroup.new(group_id: group_id).group_from_directory(data_dir)
|
189
187
|
else
|
@@ -202,7 +200,7 @@ module Moab
|
|
202
200
|
signatures_from_bag = signatures_from_bagit_manifests(bag_pathname)
|
203
201
|
bag_data_subdirs = bag_pathname.join('data').children
|
204
202
|
bag_data_subdirs.each do |subdir|
|
205
|
-
groups << FileGroup.new(:group_id=>subdir.basename.to_s).group_from_bagit_subdir(subdir, signatures_from_bag)
|
203
|
+
groups << FileGroup.new(:group_id => subdir.basename.to_s).group_from_bagit_subdir(subdir, signatures_from_bag)
|
206
204
|
end
|
207
205
|
self
|
208
206
|
end
|
@@ -219,7 +217,7 @@ module Moab
|
|
219
217
|
if manifest_pathname[type].exist?
|
220
218
|
manifest_pathname[type].each_line do |line|
|
221
219
|
line.chomp!
|
222
|
-
checksum,data_path = line.split(/\s+\**/,2)
|
220
|
+
checksum, data_path = line.split(/\s+\**/, 2)
|
223
221
|
if checksum && data_path
|
224
222
|
file_pathname = bag_pathname.join(data_path)
|
225
223
|
signature = signatures[file_pathname]
|
@@ -251,18 +249,18 @@ module Moab
|
|
251
249
|
# @api internal
|
252
250
|
# @param type [String] Specifies the type of inventory, and thus the filename used for storage
|
253
251
|
# @return [String] The standard name for the serialized inventory file of the given type
|
254
|
-
def self.xml_filename(type=nil)
|
252
|
+
def self.xml_filename(type = nil)
|
255
253
|
case type
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
254
|
+
when "version"
|
255
|
+
'versionInventory.xml'
|
256
|
+
when "additions"
|
257
|
+
'versionAdditions.xml'
|
258
|
+
when "manifests"
|
259
|
+
'manifestInventory.xml'
|
260
|
+
when "directory"
|
261
|
+
'directoryInventory.xml'
|
262
|
+
else
|
263
|
+
raise ArgumentError, "unknown inventory type: #{type}"
|
266
264
|
end
|
267
265
|
end
|
268
266
|
|
@@ -271,11 +269,9 @@ module Moab
|
|
271
269
|
# @param type [String] The inventory type, which governs the filename used for serialization
|
272
270
|
# @return [void] write the {FileInventory} instance to a file
|
273
271
|
# @example {include:file:spec/features/inventory/write_inventory_xml_spec.rb}
|
274
|
-
def write_xml_file(parent_dir, type=nil)
|
272
|
+
def write_xml_file(parent_dir, type = nil)
|
275
273
|
type = @type if type.nil?
|
276
274
|
self.class.write_xml_file(self, parent_dir, type)
|
277
275
|
end
|
278
|
-
|
279
276
|
end
|
280
|
-
|
281
277
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# Compares two {FileInventory} instances based primarily on file signatures and secondarily on file pathnames.
|
6
5
|
# Although the usual use will be to compare the content of 2 different temporal versions of the same object,
|
7
6
|
# it can also be used to verify an inventory document against an inventory harvested from a directory.
|
@@ -18,14 +17,13 @@ module Moab
|
|
18
17
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
19
18
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
20
19
|
class FileInventoryDifference < Serializer::Manifest
|
21
|
-
|
22
20
|
include HappyMapper
|
23
21
|
|
24
22
|
# The name of the XML element used to serialize this objects data
|
25
23
|
tag 'fileInventoryDifference'
|
26
24
|
|
27
25
|
# (see Serializable#initialize)
|
28
|
-
def initialize(opts={})
|
26
|
+
def initialize(opts = {})
|
29
27
|
@group_differences = Array.new
|
30
28
|
super(opts)
|
31
29
|
end
|
@@ -36,7 +34,7 @@ module Moab
|
|
36
34
|
|
37
35
|
# @attribute
|
38
36
|
# @return [Integer] the number of differences found between the two inventories that were compared (dynamically calculated)
|
39
|
-
attribute :difference_count, Integer, :tag=> 'differenceCount'
|
37
|
+
attribute :difference_count, Integer, :tag => 'differenceCount', :on_save => Proc.new { |i| i.to_s }
|
40
38
|
|
41
39
|
def difference_count
|
42
40
|
@group_differences.inject(0) { |sum, group| sum + group.difference_count }
|
@@ -74,7 +72,7 @@ module Moab
|
|
74
72
|
# @param [String] group_id The identifer of the group to be selected
|
75
73
|
# @return [FileGroupDifference] The subset of this report for the specified group_id (or nil if not found)
|
76
74
|
def group_difference(group_id)
|
77
|
-
@group_differences.find{ |group_difference| group_difference.group_id == group_id}
|
75
|
+
@group_differences.find { |group_difference| group_difference.group_id == group_id }
|
78
76
|
end
|
79
77
|
|
80
78
|
# @api external
|
@@ -126,7 +124,5 @@ module Moab
|
|
126
124
|
end
|
127
125
|
inv_diff
|
128
126
|
end
|
129
|
-
|
130
127
|
end
|
131
|
-
|
132
128
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A container for a file signature and all the physical file instances that have that signature
|
6
5
|
# This element has one child {FileSignature} element, and one or more {FileInstance} elements
|
7
6
|
# Regarding the class name, see
|
@@ -24,7 +23,7 @@ module Moab
|
|
24
23
|
tag 'file'
|
25
24
|
|
26
25
|
# (see Serializable#initialize)
|
27
|
-
def initialize(opts={})
|
26
|
+
def initialize(opts = {})
|
28
27
|
@instances = Array.new
|
29
28
|
super(opts)
|
30
29
|
end
|
@@ -48,7 +47,7 @@ module Moab
|
|
48
47
|
# @api internal
|
49
48
|
# @return [Array<String>] Create an array from all the file paths of the child {FileInstance} objects
|
50
49
|
def paths
|
51
|
-
instances.collect { |i| i.path}
|
50
|
+
instances.collect { |i| i.path }
|
52
51
|
end
|
53
52
|
|
54
53
|
# @api internal
|
@@ -69,7 +68,7 @@ module Moab
|
|
69
68
|
# (estimating du -k result)
|
70
69
|
def block_count
|
71
70
|
block_size = 1024
|
72
|
-
instance_blocks = (signature.size.to_i + block_size - 1)/block_size
|
71
|
+
instance_blocks = (signature.size.to_i + block_size - 1) / block_size
|
73
72
|
file_count * instance_blocks
|
74
73
|
end
|
75
74
|
|
@@ -80,7 +79,5 @@ module Moab
|
|
80
79
|
return false unless (other.respond_to?(:signature) && other.respond_to?(:instances)) # Cannot equal an incomparable type!
|
81
80
|
(self.signature == other.signature) && (self.instances == other.instances)
|
82
81
|
end
|
83
|
-
|
84
82
|
end
|
85
|
-
|
86
83
|
end
|
data/lib/moab/file_signature.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# The fixity properties of a file, used to determine file content equivalence regardless of filename.
|
6
5
|
# Placing this data in a class by itself facilitates using file size together with the MD5 and SHA1 checksums
|
7
6
|
# as a single key when doing comparisons against other file instances. The Moab design assumes that this file signature
|
@@ -40,17 +39,11 @@ module Moab
|
|
40
39
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
41
40
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
42
41
|
class FileSignature < Serializer::Serializable
|
43
|
-
|
44
42
|
include HappyMapper
|
45
43
|
|
46
44
|
# The name of the XML element used to serialize this objects data
|
47
45
|
tag 'fileSignature'
|
48
46
|
|
49
|
-
# (see Serializable#initialize)
|
50
|
-
def initialize(opts={})
|
51
|
-
super(opts)
|
52
|
-
end
|
53
|
-
|
54
47
|
# @attribute
|
55
48
|
# @return [Integer] The size of the file in bytes
|
56
49
|
attribute :size, Integer, :on_save => Proc.new { |n| n.to_s }
|
@@ -67,19 +60,47 @@ module Moab
|
|
67
60
|
# @return [String] The SHA256 checksum value of the file
|
68
61
|
attribute :sha256, String, :on_save => Proc.new { |n| n.nil? ? "" : n.to_s }
|
69
62
|
|
63
|
+
KNOWN_ALGOS = {
|
64
|
+
md5: proc { Digest::MD5.new },
|
65
|
+
sha1: proc { Digest::SHA1.new },
|
66
|
+
sha256: proc { Digest::SHA2.new(256) }
|
67
|
+
}.freeze
|
68
|
+
|
69
|
+
def self.active_algos
|
70
|
+
Moab::Config.checksum_algos
|
71
|
+
end
|
72
|
+
|
73
|
+
# Reads the file once for ALL (requested) algorithms, not once per.
|
74
|
+
# @param [Pathname] pathname
|
75
|
+
# @param [Array<Symbol>] one or more keys of KNOWN_ALGOS to be computed
|
76
|
+
# @return [Moab::FileSignature] object populated with (requested) checksums
|
77
|
+
def self.from_file(pathname, algos_to_use = active_algos)
|
78
|
+
raise 'Unrecognized algorithm requested' unless algos_to_use.all? { |a| KNOWN_ALGOS.include?(a) }
|
79
|
+
|
80
|
+
signatures = algos_to_use.map { |k| [k, KNOWN_ALGOS[k].call] }.to_h
|
81
|
+
|
82
|
+
pathname.open("r") do |stream|
|
83
|
+
while (buffer = stream.read(8192))
|
84
|
+
signatures.each_value { |digest| digest.update(buffer) }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
new(signatures.map { |k, digest| [k, digest.hexdigest] }.to_h.merge(size: pathname.size))
|
89
|
+
end
|
90
|
+
|
70
91
|
# @param type [Symbol,String] The type of checksum
|
71
92
|
# @param value [String] The checksum value
|
72
93
|
# @return [void] Set the value of the specified checksum type
|
73
|
-
def set_checksum(type,value)
|
94
|
+
def set_checksum(type, value)
|
74
95
|
case type.to_s.downcase.to_sym
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
96
|
+
when :md5
|
97
|
+
@md5 = value
|
98
|
+
when :sha1
|
99
|
+
@sha1 = value
|
100
|
+
when :sha256
|
101
|
+
@sha256 = value
|
102
|
+
else
|
103
|
+
raise ArgumentError, "Unknown checksum type '#{type}'"
|
83
104
|
end
|
84
105
|
end
|
85
106
|
|
@@ -141,24 +162,17 @@ module Moab
|
|
141
162
|
@size.to_i
|
142
163
|
end
|
143
164
|
|
144
|
-
# @
|
165
|
+
# @deprecated
|
166
|
+
# this method is a holdover from an earlier version. use the class method .from_file going forward.
|
167
|
+
# @api external
|
145
168
|
# @param pathname [Pathname] The location of the file to be digested
|
146
169
|
# @return [FileSignature] Generate a FileSignature instance containing size and checksums for a physical file
|
147
170
|
def signature_from_file(pathname)
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
while buffer = stream.read(8192)
|
154
|
-
md5_digest.update(buffer)
|
155
|
-
sha1_digest.update(buffer)
|
156
|
-
sha256_digest.update(buffer)
|
157
|
-
end
|
158
|
-
end
|
159
|
-
@md5 = md5_digest.hexdigest
|
160
|
-
@sha1 = sha1_digest.hexdigest
|
161
|
-
@sha256 = sha256_digest.hexdigest
|
171
|
+
file_signature = self.class.from_file(pathname)
|
172
|
+
self.size = file_signature.size
|
173
|
+
self.md5 = file_signature.md5
|
174
|
+
self.sha1 = file_signature.sha1
|
175
|
+
self.sha256 = file_signature.sha256
|
162
176
|
self
|
163
177
|
end
|
164
178
|
|
@@ -195,7 +209,5 @@ module Moab
|
|
195
209
|
end
|
196
210
|
type_for_name
|
197
211
|
end
|
198
|
-
|
199
212
|
end
|
200
|
-
|
201
213
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A digital object's Signature Catalog is derived from an filtered aggregation of the file inventories
|
6
5
|
# of a digital object's set of versions. (see {#update})
|
7
6
|
# It has an entry for every file (identified by {FileSignature}) found in any of the versions,
|
@@ -32,7 +31,7 @@ module Moab
|
|
32
31
|
tag 'signatureCatalog'
|
33
32
|
|
34
33
|
# (see Serializable#initialize)
|
35
|
-
def initialize(opts={})
|
34
|
+
def initialize(opts = {})
|
36
35
|
@entries = Array.new
|
37
36
|
@signature_hash = Hash.new
|
38
37
|
super(opts)
|
@@ -44,7 +43,7 @@ module Moab
|
|
44
43
|
|
45
44
|
# @attribute
|
46
45
|
# @return [Integer] The ordinal version number
|
47
|
-
attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => Proc.new {|n| n.to_s}
|
46
|
+
attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => Proc.new { |n| n.to_s }
|
48
47
|
|
49
48
|
# @return [String] The unique identifier concatenating digital object id with version id
|
50
49
|
def composite_key
|
@@ -56,7 +55,7 @@ module Moab
|
|
56
55
|
attribute :catalog_datetime, Time, :tag => 'catalogDatetime'
|
57
56
|
|
58
57
|
def catalog_datetime=(datetime)
|
59
|
-
@catalog_datetime=Moab::UtcTime.input(datetime)
|
58
|
+
@catalog_datetime = Moab::UtcTime.input(datetime)
|
60
59
|
end
|
61
60
|
|
62
61
|
def catalog_datetime
|
@@ -65,7 +64,7 @@ module Moab
|
|
65
64
|
|
66
65
|
# @attribute
|
67
66
|
# @return [Integer] The total number of data files (dynamically calculated)
|
68
|
-
attribute :file_count, Integer, :tag => 'fileCount', :on_save => Proc.new {|t| t.to_s}
|
67
|
+
attribute :file_count, Integer, :tag => 'fileCount', :on_save => Proc.new { |t| t.to_s }
|
69
68
|
|
70
69
|
def file_count
|
71
70
|
entries.size
|
@@ -73,7 +72,7 @@ module Moab
|
|
73
72
|
|
74
73
|
# @attribute
|
75
74
|
# @return [Integer] The total size (in bytes) of all data files (dynamically calculated)
|
76
|
-
attribute :byte_count, Integer, :tag => 'byteCount', :on_save => Proc.new {|t| t.to_s}
|
75
|
+
attribute :byte_count, Integer, :tag => 'byteCount', :on_save => Proc.new { |t| t.to_s }
|
77
76
|
|
78
77
|
def byte_count
|
79
78
|
entries.inject(0) { |sum, entry| sum + entry.signature.size.to_i }
|
@@ -81,11 +80,11 @@ module Moab
|
|
81
80
|
|
82
81
|
# @attribute
|
83
82
|
# @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
|
84
|
-
attribute :block_count, Integer, :tag => 'blockCount', :on_save => Proc.new {|t| t.to_s}
|
83
|
+
attribute :block_count, Integer, :tag => 'blockCount', :on_save => Proc.new { |t| t.to_s }
|
85
84
|
|
86
85
|
def block_count
|
87
|
-
block_size=1024
|
88
|
-
entries.inject(0) { |sum, entry| sum + (entry.signature.size.to_i + block_size - 1)/block_size }
|
86
|
+
block_size = 1024
|
87
|
+
entries.inject(0) { |sum, entry| sum + (entry.signature.size.to_i + block_size - 1) / block_size }
|
89
88
|
end
|
90
89
|
|
91
90
|
# @return [Array<String>] The data fields to include in summary reports
|
@@ -128,8 +127,8 @@ module Moab
|
|
128
127
|
# @param group [FileGroup] A group of the files from a file inventory
|
129
128
|
# @param group_pathname [Pathname] The location of the directory containing the group's files
|
130
129
|
# @return [void] Inspect and upgrade the group's signature data to include all desired checksums
|
131
|
-
def normalize_group_signatures(group, group_pathname=nil)
|
132
|
-
unless
|
130
|
+
def normalize_group_signatures(group, group_pathname = nil)
|
131
|
+
unless group_pathname.nil?
|
133
132
|
group_pathname = Pathname(group_pathname)
|
134
133
|
raise "Could not locate #{group_pathname}" unless group_pathname.exist?
|
135
134
|
end
|
@@ -162,7 +161,7 @@ module Moab
|
|
162
161
|
if file.signature.complete?
|
163
162
|
entry.signature = file.signature
|
164
163
|
else
|
165
|
-
file_pathname = data_pathname.join(group.group_id,entry.path)
|
164
|
+
file_pathname = data_pathname.join(group.group_id, entry.path)
|
166
165
|
entry.signature = file.signature.normalized_signature(file_pathname)
|
167
166
|
end
|
168
167
|
add_entry(entry)
|
@@ -179,20 +178,18 @@ module Moab
|
|
179
178
|
# containing only those files that were added in this version
|
180
179
|
# @example {include:file:spec/features/catalog/version_additions_spec.rb}
|
181
180
|
def version_additions(version_inventory)
|
182
|
-
version_additions = FileInventory.new(:type=>'additions')
|
181
|
+
version_additions = FileInventory.new(:type => 'additions')
|
183
182
|
version_additions.copy_ids(version_inventory)
|
184
183
|
version_inventory.groups.each do |group|
|
185
184
|
group_addtions = FileGroup.new(:group_id => group.group_id)
|
186
185
|
group.files.each do |file|
|
187
186
|
unless @signature_hash.has_key?(file.signature)
|
188
|
-
group_addtions.add_file_instance(file.signature,file.instances[0])
|
187
|
+
group_addtions.add_file_instance(file.signature, file.instances[0])
|
189
188
|
end
|
190
189
|
end
|
191
190
|
version_additions.groups << group_addtions if group_addtions.files.size > 0
|
192
191
|
end
|
193
192
|
version_additions
|
194
193
|
end
|
195
|
-
|
196
194
|
end
|
197
|
-
|
198
195
|
end
|