292):
293 """
294 Compare the in-file metadata in two given files. Uses PyUtils.MetaReader
295 to obtain file content. Generates list of string that show difference.
296 Returns empty list if no difference is found
297
298 Keyword arguments:
299 files -- Names of two files to compare
300 verbose -- toggle to get debug information
301 ordered -- whether to check order of lists in the metadata
302 drop -- keys to drop from metadata retrieved by MetaReader
303 mode -- MetaReader argument setting amount of content (default 'lite').
304 Allowed values are: tiny, lite, peeker, and full
305 meta_key_filter -- MetaReader argument selecting keys to retrieve (default
306 get all)
307 file_type -- Type of files, POOL or BS (default: auto-configure)
308 promote -- MetaReader argument (default: False)
309 diff_format -- Return 'simple' or 'diff' style string (default: 'simple')
310 regex -- Use regex for the drop filter (default: False)
311 key_only -- Show only the keys instead of their value (default: False)
312 """
313 if len(files) != 2:
314 raise ValueError("Wrong number of files passes, need two")
315
316 reader_msg = logging.getLogger("MetaReader")
317 reader_msg.setLevel(logging.INFO if verbose else logging.WARNING)
318
319 msg = logging.getLogger("MetaDiff")
320 msg.setLevel(logging.DEBUG if verbose else logging.INFO)
321
322 msg.debug("Reading from %s and %s", files[0], files[1])
323
324 metadata = read_metadata(
325 files,
326 file_type,
327 mode=mode,
328 meta_key_filter=meta_key_filter,
329 promote=promote,
330 )
331
332 if drop is not None and regex:
333 for i in range(len(drop)):
334 drop[i] = re.compile( drop[i] )
335
336 def filter_key(key):
337 key_str = str(key)
338
339 if drop is not None:
340 for drop_key in drop:
341 if not regex:
342 if key_str.startswith(drop_key):
343 return False
344 else:
345 if drop_key.match(key_str):
346 return False
347
348 if ignore_trigger:
349 for trigger_key in trigger_keys:
350 if key_str.startswith(trigger_key):
351 return False
352
353 return True
354
355 result = compare_dicts(
356 metadata[files[0]],
357 metadata[files[1]],
358 ordered=ordered,
359 diff_format=diff_format,
360 filter_key=filter_key,
361 key_only=key_only
362 )
363
364 if not result:
365 msg.info("No differences found")
366
367 return list(sorted([r for r in result if r is not None ]))