# HG changeset patch # User Augie Fackler # Date 1569433848 14400 # Node ID 699102b1053054d32bc9b0d0e8aeb699c20765d2 # Parent f200bea8470bf9665139e6cb7ec6f83aeb2102a1 histedit: sniff-test for untracked file conflicts before prompting for rules This bug is as old as histedit, which is more than 10 years! I'm a little sad about the extra calculations here that we're just going to throw out, but I don't see any better way to look for untracked file conflicts and I want the bug fixed. Differential Revision: https://phab.mercurial-scm.org/D6882 diff -r f200bea8470b -r 699102b10530 hgext/histedit.py --- a/hgext/histedit.py Mon Sep 23 16:29:16 2019 -0400 +++ b/hgext/histedit.py Wed Sep 25 13:50:48 2019 -0400 @@ -1970,6 +1970,32 @@ node.short(root)) ctxs = [repo[r] for r in revs] + + wctx = repo[None] + # Please don't ask me why `ancestors` is this value. I figured it + # out with print-debugging, not by actually understanding what the + # merge code is doing. :( + ancs = [repo['.']] + # Sniff-test to make sure we won't collide with untracked files in + # the working directory. If we don't do this, we can get a + # collision after we've started histedit and backing out gets ugly + # for everyone, especially the user. + for c in [ctxs[0].p1()] + ctxs: + try: + mergemod.calculateupdates( + repo, wctx, c, ancs, + # These parameters were determined by print-debugging + # what happens later on inside histedit. + False, # branchmerge + False, # force + False, # acceptremote + False, # followcopies + ) + except error.Abort: + raise error.Abort( + _("untracked files in working directory conflict with files in %s") % ( + c)) + if not rules: comment = geteditcomment(ui, node.short(root), node.short(topmost)) actions = [pick(state, r) for r in revs] diff -r f200bea8470b -r 699102b10530 tests/test-histedit-non-commute-abort.t --- a/tests/test-histedit-non-commute-abort.t Mon Sep 23 16:29:16 2019 -0400 +++ b/tests/test-histedit-non-commute-abort.t Wed Sep 25 13:50:48 2019 -0400 @@ -162,55 +162,26 @@ summary: a -Early tree conflict doesn't leave histedit in a wedged state. +Early tree conflict doesn't leave histedit in a wedged state. Note +that we don't specify --commands here: we catch the problem before we +even prompt the user for rules, sidestepping any dataloss issues. + $ hg rm c $ hg ci -m 'remove c' $ echo collision > c - $ hg histedit e860deea161a --commands - 2>&1 < edit e860deea161a - > pick 652413bf663e - > pick bfa474341cc9 - > pick 1b0954ff00fc - > EOF + $ hg histedit e860deea161a c: untracked file differs - abort: untracked files in working directory differ from files in requested revision + abort: untracked files in working directory conflict with files in 055a42cdd887 [255] -BUG: we didn't actually change p1 of the working copy, but we're in a -histedit state. This confuses the process very badly and leads to -histedit stripping things it shouldn't (in obsmarker mode it inserts -bogus prune markers in this case.) +We should have detected the collision early enough we're not in a +histedit state, and p1 is unchanged. $ hg log -r 'p1()' -T'{node}\n' 1b0954ff00fccb15a37b679e4a35e9b01dfe685e $ hg status --config ui.tweakdefaults=yes ? c ? e.orig - # The repository is in an unfinished *histedit* state. - - # To continue: hg histedit --continue - # To abort: hg histedit --abort - - $ hg histedit --continue - 652413bf663e: skipping changeset (no changes) - bfa474341cc9: skipping changeset (no changes) - 1b0954ff00fc: skipping changeset (no changes) - saved backup bundle to $TESTTMP/r/.hg/strip-backup/e860deea161a-a0738322-histedit.hg - - $ hg log -GTcompact - warning: ignoring unknown working parent 1b0954ff00fc! - o 3[tip] 055a42cdd887 1970-01-01 00:00 +0000 test - | d - | - o 2 177f92b77385 1970-01-01 00:00 +0000 test - | c - | - o 1 d2ae7f538514 1970-01-01 00:00 +0000 test - | b - | - o 0 cb9a9f314b8b 1970-01-01 00:00 +0000 test - a - $ cd ..