12f2feebfSReid Kleckner#!/usr/bin/env python 22f2feebfSReid Kleckner 32f2feebfSReid Klecknerfrom __future__ import print_function 42f2feebfSReid Kleckner 5*b71edfaaSTobias Hietadesc = """Generate the difference of two YAML files into a new YAML file (works on 62f2feebfSReid Klecknerpair of directories too). A new attribute 'Added' is set to True or False 72f2feebfSReid Klecknerdepending whether the entry is added or removed from the first input to the 82f2feebfSReid Klecknernext. 92f2feebfSReid Kleckner 10*b71edfaaSTobias HietaThe tools requires PyYAML.""" 112f2feebfSReid Kleckner 122f2feebfSReid Klecknerimport yaml 13*b71edfaaSTobias Hieta 142f2feebfSReid Kleckner# Try to use the C parser. 152f2feebfSReid Klecknertry: 162f2feebfSReid Kleckner from yaml import CLoader as Loader 172f2feebfSReid Klecknerexcept ImportError: 182f2feebfSReid Kleckner from yaml import Loader 192f2feebfSReid Kleckner 202f2feebfSReid Klecknerimport optrecord 212f2feebfSReid Klecknerimport argparse 222f2feebfSReid Klecknerfrom collections import defaultdict 232f2feebfSReid Kleckner 24*b71edfaaSTobias Hietaif __name__ == "__main__": 252f2feebfSReid Kleckner parser = argparse.ArgumentParser(description=desc) 262f2feebfSReid Kleckner parser.add_argument( 27*b71edfaaSTobias Hieta "yaml_dir_or_file_1", 28*b71edfaaSTobias Hieta help="An optimization record file or a directory searched for optimization " 29*b71edfaaSTobias Hieta "record files that are used as the old version for the comparison", 30*b71edfaaSTobias Hieta ) 312f2feebfSReid Kleckner parser.add_argument( 32*b71edfaaSTobias Hieta "yaml_dir_or_file_2", 33*b71edfaaSTobias Hieta help="An optimization record file or a directory searched for optimization " 34*b71edfaaSTobias Hieta "record files that are used as the new version for the comparison", 35*b71edfaaSTobias Hieta ) 362f2feebfSReid Kleckner parser.add_argument( 37*b71edfaaSTobias Hieta "--jobs", 38*b71edfaaSTobias Hieta "-j", 392f2feebfSReid Kleckner default=None, 402f2feebfSReid Kleckner type=int, 41*b71edfaaSTobias Hieta help="Max job count (defaults to %(default)s, the current CPU count)", 42*b71edfaaSTobias Hieta ) 432f2feebfSReid Kleckner parser.add_argument( 44*b71edfaaSTobias Hieta "--max-size", 45*b71edfaaSTobias Hieta "-m", 462f2feebfSReid Kleckner default=100000, 472f2feebfSReid Kleckner type=int, 48*b71edfaaSTobias Hieta help="Maximum number of remarks stored in an output file", 49*b71edfaaSTobias Hieta ) 502f2feebfSReid Kleckner parser.add_argument( 51*b71edfaaSTobias Hieta "--no-progress-indicator", 52*b71edfaaSTobias Hieta "-n", 53*b71edfaaSTobias Hieta action="store_true", 542f2feebfSReid Kleckner default=False, 55*b71edfaaSTobias Hieta help="Do not display any indicator of how many YAML files were read.", 56*b71edfaaSTobias Hieta ) 57*b71edfaaSTobias Hieta parser.add_argument("--output", "-o", default="diff{}.opt.yaml") 582f2feebfSReid Kleckner args = parser.parse_args() 592f2feebfSReid Kleckner 602f2feebfSReid Kleckner files1 = optrecord.find_opt_files(args.yaml_dir_or_file_1) 612f2feebfSReid Kleckner files2 = optrecord.find_opt_files(args.yaml_dir_or_file_2) 622f2feebfSReid Kleckner 632f2feebfSReid Kleckner print_progress = not args.no_progress_indicator 642f2feebfSReid Kleckner all_remarks1, _, _ = optrecord.gather_results(files1, args.jobs, print_progress) 652f2feebfSReid Kleckner all_remarks2, _, _ = optrecord.gather_results(files2, args.jobs, print_progress) 662f2feebfSReid Kleckner 672f2feebfSReid Kleckner added = set(all_remarks2.values()) - set(all_remarks1.values()) 682f2feebfSReid Kleckner removed = set(all_remarks1.values()) - set(all_remarks2.values()) 692f2feebfSReid Kleckner 702f2feebfSReid Kleckner for r in added: 712f2feebfSReid Kleckner r.Added = True 722f2feebfSReid Kleckner for r in removed: 732f2feebfSReid Kleckner r.Added = False 742f2feebfSReid Kleckner 752f2feebfSReid Kleckner result = list(added | removed) 762f2feebfSReid Kleckner for r in result: 772f2feebfSReid Kleckner r.recover_yaml_structure() 782f2feebfSReid Kleckner 792f2feebfSReid Kleckner for i in range(0, len(result), args.max_size): 80*b71edfaaSTobias Hieta with open(args.output.format(i / args.max_size), "w") as stream: 812f2feebfSReid Kleckner yaml.dump_all(result[i : i + args.max_size], stream) 82