76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| from __future__ import print_function
 | |
| 
 | |
| desc = '''Generate the difference of two YAML files into a new YAML file (works on
 | |
| pair of directories too).  A new attribute 'Added' is set to True or False
 | |
| depending whether the entry is added or removed from the first input to the
 | |
| next.
 | |
| 
 | |
| The tools requires PyYAML.'''
 | |
| 
 | |
| import yaml
 | |
| # Try to use the C parser.
 | |
| try:
 | |
|     from yaml import CLoader as Loader
 | |
| except ImportError:
 | |
|     from yaml import Loader
 | |
| 
 | |
| import optrecord
 | |
| import argparse
 | |
| from collections import defaultdict
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     parser = argparse.ArgumentParser(description=desc)
 | |
|     parser.add_argument(
 | |
|         'yaml_dir_or_file_1',
 | |
|         help='An optimization record file or a directory searched for optimization '
 | |
|              'record files that are used as the old version for the comparison')
 | |
|     parser.add_argument(
 | |
|         'yaml_dir_or_file_2',
 | |
|         help='An optimization record file or a directory searched for optimization '
 | |
|              'record files that are used as the new version for the comparison')
 | |
|     parser.add_argument(
 | |
|         '--jobs',
 | |
|         '-j',
 | |
|         default=None,
 | |
|         type=int,
 | |
|         help='Max job count (defaults to %(default)s, the current CPU count)')
 | |
|     parser.add_argument(
 | |
|         '--max-size',
 | |
|         '-m',
 | |
|         default=100000,
 | |
|         type=int,
 | |
|         help='Maximum number of remarks stored in an output file')
 | |
|     parser.add_argument(
 | |
|         '--no-progress-indicator',
 | |
|         '-n',
 | |
|         action='store_true',
 | |
|         default=False,
 | |
|         help='Do not display any indicator of how many YAML files were read.')
 | |
|     parser.add_argument('--output', '-o', default='diff{}.opt.yaml')
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     files1 = optrecord.find_opt_files(args.yaml_dir_or_file_1)
 | |
|     files2 = optrecord.find_opt_files(args.yaml_dir_or_file_2)
 | |
| 
 | |
|     print_progress = not args.no_progress_indicator
 | |
|     all_remarks1, _, _ = optrecord.gather_results(files1, args.jobs, print_progress)
 | |
|     all_remarks2, _, _ = optrecord.gather_results(files2, args.jobs, print_progress)
 | |
| 
 | |
|     added = set(all_remarks2.values()) - set(all_remarks1.values())
 | |
|     removed = set(all_remarks1.values()) - set(all_remarks2.values())
 | |
| 
 | |
|     for r in added:
 | |
|         r.Added = True
 | |
|     for r in removed:
 | |
|         r.Added = False
 | |
| 
 | |
|     result = list(added | removed)
 | |
|     for r in result:
 | |
|         r.recover_yaml_structure()
 | |
| 
 | |
|     for i in range(0, len(result), args.max_size):
 | |
|         with open(args.output.format(i / args.max_size), 'w') as stream:
 | |
|             yaml.dump_all(result[i:i + args.max_size], stream)
 |