31
31
# - DirTree options to handle owner, hash, ...
32
32
33
33
#--- IMPORTS ------------------------------------------------------------------
34
+ import logging
34
35
import sys
35
36
36
37
# path module to easily handle files and dirs:
@@ -198,26 +199,76 @@ def compare_files(et1, et2):
198
199
return False
199
200
if et1 .tag == TAG_DIR :
200
201
if et1 .get (ATTR_NAME ) != et2 .get (ATTR_NAME ):
202
+ print ("Directory name verification failed: {0} != {1}" .format (et1 .get (ATTR_NAME ), et2 .get (ATTR_NAME )))
201
203
return False
202
204
else :
203
205
return True
204
206
elif et1 .tag == TAG_FILE :
205
207
if et1 .get (ATTR_NAME ) != et2 .get (ATTR_NAME ):
206
208
#Compare names
209
+ print ("File name verification failed: {0} != {1}" .format (et1 .get (ATTR_NAME ), et2 .get (ATTR_NAME )))
207
210
return False
208
211
if et1 .get (ATTR_SIZE ) != et2 .get (ATTR_SIZE ):
209
212
#Compare sizes
213
+ print ("File {0} failed size verification" .format (et1 .get (ATTR_NAME )))
210
214
return False
211
215
if et1 .get (ATTR_HASH ) != et2 .get (ATTR_HASH ):
212
216
#Compare file hash (if the one has a hash and the other does not, it'll return false)
217
+ print ("File {0} failed hash verification" .format (et1 .get (ATTR_NAME )))
213
218
return False
214
219
else :
215
220
return True
216
221
else :
217
222
raise TypeError
218
223
219
224
220
- def compare_DT (dirTree1 , dirTree2 ):
225
+ def comp_filesv2 (tree1 , tree2 , values = None , log = None ):
226
+ """
227
+ Compares 2 tree elements.
228
+
229
+ :param tree1:
230
+ :param tree2:
231
+ :param values: List of what to check.
232
+ Default: ATTR_NAME, ATTR_HASH, ATTR_SIZE
233
+ :param log: Logger. Defaults to logging.getLogger(__name__)
234
+ :return:
235
+ """
236
+ if log is None :
237
+ #Default to root logger.
238
+ log = logging .getLogger ()
239
+
240
+ if values is None :
241
+ #Default to checking name, size, and hash.
242
+ values = [ATTR_NAME , ATTR_HASH , ATTR_SIZE ]
243
+ else :
244
+ for value in values :
245
+ #Check to make sure that the list of values is valid.
246
+ if value not in [ATTR_SIZE , ATTR_HASH , ATTR_NAME , ATTR_MTIME , ATTR_OWNER , ATTR_TIME ]:
247
+ raise TypeError ("Checking value %s is INVALID" % value )
248
+
249
+ if tree1 .tag != tree2 .tag :
250
+ return False
251
+
252
+ if tree1 .tag == TAG_DIR :
253
+ #Means this is a directory, compare names.
254
+ if tree1 .get (ATTR_NAME ) != tree2 .get (ATTR_NAME ):
255
+ log .info ("Directory name verification failed: %s != %s" , tree1 .get (ATTR_NAME ), tree2 .get (ATTR_NAME ))
256
+ return False
257
+ else :
258
+ return True
259
+ elif tree1 .tag == TAG_FILE :
260
+ #Tagged as a file
261
+ ret_value = True
262
+ for value in values :
263
+ #If any one of these checks fails, the whole thing fails.
264
+ if tree1 .get (value ) != tree2 .get (value ):
265
+ log .info ("%s verification failed: %s != %s" , value , tree1 .get (value ), tree2 .get (value ))
266
+ ret_value = False
267
+
268
+ return ret_value
269
+
270
+
271
+ def compare_DT (dirTree1 , dirTree2 , values = None , log = None ):
221
272
"""
222
273
to compare two DirTrees, and report which files have changed.
223
274
returns a tuple of 4 lists of paths: same files, different files,
@@ -236,7 +287,7 @@ def compare_DT(dirTree1, dirTree2):
236
287
# path is in the 2 DT, we have to compare file info
237
288
f1 = dirTree1 .dict [p ]
238
289
f2 = dirTree2 .dict [p ]
239
- if compare_files (f1 , f2 ):
290
+ if comp_filesv2 (f1 , f2 , values , log ):
240
291
# files/dirs are the same
241
292
same .append (p )
242
293
else :
0 commit comments