diff options
Diffstat (limited to 'ungone_series.py')
-rw-r--r-- | ungone_series.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/ungone_series.py b/ungone_series.py new file mode 100644 index 0000000..065ed01 --- /dev/null +++ b/ungone_series.py @@ -0,0 +1,70 @@ +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)) |