D7786: update: add --abort option in hg update command (issue4404)
khanchi97 (Sushil khanchi)
phabricator at mercurial-scm.org
Fri Jan 3 15:06:35 UTC 2020
khanchi97 created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
Here is, what --abort option is basically doing:
1. hg resolve --unmark, then
2. hg resolve --all --tool :local
3. hg up <original ctx> --tool :local
Where,
step 1) is to mark all the files conflicted as unresolved (marking *all*
files to make sure that it also mark the files which might have been
resolved by user in meantime)
step 2) resolve all the conflicting files using `--tool :local`
step 3) update to the revision where it was checkedout before running the
hg update, using `--tool :local`
Use of `--tool :local` while updating to old revision (step3) make sure that
it will not hit merge conflict at the time of update. And since we are using
the same tool (:local) as we used at the time of resolution (step2) it makes
sure that we have exact changes in working directory as it was before IIUC.
Added tests demonstrate the behaviour of new flag.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D7786
AFFECTED FILES
mercurial/commands.py
tests/test-completion.t
tests/test-update-branches.t
CHANGE DETAILS
diff --git a/tests/test-update-branches.t b/tests/test-update-branches.t
--- a/tests/test-update-branches.t
+++ b/tests/test-update-branches.t
@@ -676,3 +676,80 @@
[255]
$ hg co --no-check 2
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ..
+
+Test hg update --abort option
+ $ hg init issue4404
+ $ cd issue4404
+ $ echo "before\nmiddle" > file
+ $ hg add file
+ $ hg commit -mbefore
+ $ echo "after\nmiddle" > file
+ $ hg commit -mafter
+ $ echo "edited\nmiddle\nlast" > file
+ $ echo foo > foo
+ $ hg add foo
+
+ $ hg diff
+ diff -r fd93e7c2e3ea file
+ --- a/file Thu Jan 01 00:00:00 1970 +0000
+ +++ b/file Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,2 +1,3 @@
+ -after
+ +edited
+ middle
+ +last
+ diff -r fd93e7c2e3ea foo
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +foo
+
+ $ hg update 0 --no-check
+ merging file
+ warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
+ $ hg diff
+ diff -r f013c8cc5b24 file
+ --- a/file Thu Jan 01 00:00:00 1970 +0000
+ +++ b/file Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,2 +1,7 @@
+ +<<<<<<< working copy: fd93e7c2e3ea - test: after
+ +edited
+ +=======
+ before
+ +>>>>>>> destination: f013c8cc5b24 - test: before
+ middle
+ +last
+ diff -r f013c8cc5b24 foo
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +foo
+
+ $ hg up --abort
+ update aborted
+
+Make sure diff is same as it was before running hg update
+ $ hg diff
+ diff -r fd93e7c2e3ea file
+ --- a/file Thu Jan 01 00:00:00 1970 +0000
+ +++ b/file Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,2 +1,3 @@
+ -after
+ +edited
+ middle
+ +last
+ diff -r fd93e7c2e3ea foo
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +foo
+
+Error out if there is no interrupted update
+ $ hg up --abort
+ abort: no interrupted update exists
+ [255]
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -357,7 +357,7 @@
tip: patch, git, style, template
unbundle: update
unshelve: abort, continue, interactive, keep, name, tool, date
- update: clean, check, merge, date, rev, tool
+ update: abort, clean, check, merge, date, rev, tool
verify: full
version: template
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -7590,6 +7590,7 @@
@command(
b'update|up|checkout|co',
[
+ (b'a', b'abort', None, _(b'abort the interrupted update')),
(b'C', b'clean', None, _(b'discard uncommitted changes (no backup)')),
(b'c', b'check', None, _(b'require clean working directory')),
(b'm', b'merge', None, _(b'merge uncommitted changes')),
@@ -7661,9 +7662,26 @@
clean = opts.get('clean')
check = opts.get('check')
merge = opts.get('merge')
+ abort = opts.get('abort')
if rev and node:
raise error.Abort(_(b"please specify just one revision"))
+ if abort:
+ overrides = {(b'ui', b'forcemerge'): b':local', (b'ui', 'quiet'): True}
+ with repo.wlock(), ui.configoverride(overrides, b'update'):
+ ms = mergemod.mergestate.read(repo)
+ if not ms.active():
+ raise error.Abort(_(b'no interrupted update exists'))
+ resolve(ui, repo, **{'unmark': True})
+ resolve(ui, repo, **{'all': True, 'tool':':local'})
+ # hg update to orig revision
+ local = ms.localctx
+ updatecheck = b'none'
+ hg.updatetotally(ui, repo, local, local, updatecheck=updatecheck)
+ ms.clean(repo)
+ ui.status(_(b'update aborted\n'))
+ return 0
+
if ui.configbool(b'commands', b'update.requiredest'):
if not node and not rev and not date:
raise error.Abort(
To: khanchi97, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list