summaryrefslogtreecommitdiff
path: root/ungone_series.py
diff options
context:
space:
mode:
Diffstat (limited to 'ungone_series.py')
-rw-r--r--ungone_series.py70
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))