import patchstate as ps import io, os, sys from import_series import lcs def parse_prev(info): if not info.startswith('(was ') or not info.endswith(')'): raise ValueError return info[5:-1] def main(args): args = iter(args) arg0 = next(args) @ps.argparse_all(args) def path(arg): raise RuntimeError(f'Invalid argument: {arg!r}') [repo_path] = path repo = ps.Repository(repo_path) with io.open(os.path.join(repo.path, 'series'), 'r') as f: pcur = ps.Series.parse(f.read()) gone_seq = [] new_seq = [] updated = {} def fix_seq(): s = lcs(gone_seq, new_seq, key=lambda p: p.patch_title) del gone_seq[:] del new_seq[:] for p_gone, p_new in s: if p_gone is None or p_new is None: continue updated[p_new] = parse_prev(p_gone.info[0]) updated[p_gone] = None for i,pi in enumerate(pcur.info): m = pi.mode if m == 'gone': gone_seq.append(pi) elif m == 'new': new_seq.append(pi) else: fix_seq() fix_seq() inf = [] for pi in pcur.info: try: mode = updated[pi] except KeyError: pass else: if mode is None: continue assert pi.mode == 'new' pi = pi.update(mode=mode) inf.append(pi) pnew = ps.Series(inf).fmt() with io.open(os.path.join(repo.path, 'series'), 'w') as f: f.write(pnew) return 0 if __name__ == '__main__': sys.exit(main(sys.argv))