| #!/usr/bin/env python3 | |
| import os, sys | |
| from utils import util | |
| def run(fn_ins, fn_out, strict=False, track_origin=False, verbose=False): | |
| # tag to bits | |
| entries = {} | |
| # tag to (bits, line) | |
| tags = dict() | |
| # bits to (tag, line) | |
| bitss = dict() | |
| for fn_in in fn_ins: | |
| for line, (tag, bits, mode, origin) in util.parse_db_lines(fn_in): | |
| line = line.strip() | |
| assert mode is not None or mode != "always", "strict: got ill defined line: %s" % ( | |
| line, ) | |
| if tag in tags: | |
| orig_bits, orig_line, orig_origin = tags[tag] | |
| if orig_bits != bits: | |
| print( | |
| "WARNING: got duplicate tag %s" % (tag, ), | |
| file=sys.stderr) | |
| print(" Orig line: %s" % orig_line, file=sys.stderr) | |
| print(" New line : %s" % line, file=sys.stderr) | |
| assert not strict, "strict: got duplicate tag" | |
| origin = os.path.basename(os.getcwd()) | |
| if track_origin and orig_origin != origin: | |
| origin = orig_origin + "," + origin | |
| if bits in bitss: | |
| orig_tag, orig_line = bitss[bits] | |
| if orig_tag != tag: | |
| print( | |
| "WARNING: got duplicate bits %s" % (bits, ), | |
| file=sys.stderr) | |
| print(" Orig line: %s" % orig_line, file=sys.stderr) | |
| print(" New line : %s" % line, file=sys.stderr) | |
| assert not strict, "strict: got duplicate bits" | |
| if track_origin and origin is None: | |
| origin = os.path.basename(os.getcwd()) | |
| entries[tag] = (bits, origin) | |
| tags[tag] = (bits, line, origin) | |
| if bits != None: | |
| bitss[bits] = (tag, line) | |
| util.write_db_lines(fn_out, entries, track_origin) | |
| def main(): | |
| import argparse | |
| parser = argparse.ArgumentParser(description="Combine multiple .db files") | |
| util.db_root_arg(parser) | |
| parser.add_argument('--verbose', action='store_true', help='') | |
| parser.add_argument('--track_origin', action='store_true', help='') | |
| parser.add_argument('--out', help='') | |
| parser.add_argument('ins', nargs='+', help='Last takes precedence') | |
| args = parser.parse_args() | |
| run(args.ins, | |
| args.out, | |
| strict=int(os.getenv("MERGEDB_STRICT", "1")), | |
| track_origin=args.track_origin, | |
| verbose=args.verbose) | |
| if __name__ == '__main__': | |
| main() |