| #!/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() |