Mercurial > hg
diff hgext/histedit.py @ 26763:50fc80e46786
histedit: make histedit prune when obsolete is enabled
Back in June we made histedit use obsolete markers to cleanup when possible.
This was rolled back as part of 54f9561088c7 (which should have only rolled back
the --abort stuff, but rolled back everything). This caused a nasty bug when
used in conjuction with the inhibit+directaccess extensions where histedit would
leave old nodes around even after they had been squashed away.
The root of the problem is that we first clean up old nodes, and then we clean
up temp nodes. In the first pass, when we obsoleted old nodes, some would become
unobsolete because they had temp nodes on top of them, thus making them stick
around even after the histedit finished.
The fix is to A) move the temp node cleanup to be before the old node cleanup
(since they are topological on top of the old nodes), and B) use obsolete
markers instead of stripping.
author | Durham Goode <durham@fb.com> |
---|---|
date | Sat, 17 Oct 2015 12:32:23 -0700 |
parents | 78aa4392c261 |
children | 38dcb85f9370 |
line wrap: on
line diff
--- a/hgext/histedit.py Sat Oct 17 11:23:54 2015 -0700 +++ b/hgext/histedit.py Sat Oct 17 12:32:23 2015 -0700 @@ -925,6 +925,13 @@ for n in succs[1:]: ui.debug(m % node.short(n)) + if supportsmarkers: + # Only create markers if the temp nodes weren't already removed. + obsolete.createmarkers(repo, ((repo[t],()) for t in sorted(tmpnodes) + if t in repo)) + else: + cleanupnode(ui, repo, 'temp', tmpnodes) + if not state.keep: if mapping: movebookmarks(ui, repo, mapping, state.topmost, ntm) @@ -941,7 +948,6 @@ else: cleanupnode(ui, repo, 'replaced', mapping) - cleanupnode(ui, repo, 'temp', tmpnodes) state.clear() if os.path.exists(repo.sjoin('undo')): os.unlink(repo.sjoin('undo'))