[PATCH 2 of 2 V7] update: fix bare --clean to work on new branch (issue5003) (BC)

liscju piotr.listkiewicz at gmail.com
Mon Apr 11 13:37:17 EDT 2016


# HG changeset patch
# User liscju <piotr.listkiewicz at gmail.com>
# Date 1459834201 -7200
#      Tue Apr 05 07:30:01 2016 +0200
# Node ID b7570c990ffb801db755c3e5d3e1502ca7ffd31f
# Parent  9b92231d66d9e4f41dd36bfc5f34264d8a8e9113
update: fix bare --clean to work on new branch (issue5003) (BC)

So far 'hg update --clean' on newly created branch results in abort
with branch not found error. After applying this commit bare
update --clean results in updating to the max head of the parents
branch.

This seems reasonable as clean should discard uncommited changes,
branch is one of them.

diff -r 9b92231d66d9 -r b7570c990ffb mercurial/destutil.py
--- a/mercurial/destutil.py	Tue Apr 05 06:53:33 2016 +0200
+++ b/mercurial/destutil.py	Tue Apr 05 07:30:01 2016 +0200
@@ -95,14 +95,24 @@ def _destupdatebranch(repo, clean, check
     wc = repo[None]
     movemark = node = None
     currentbranch = wc.branch()
-    if currentbranch in repo.branchmap():
-        heads = repo.branchheads(currentbranch)
+
+    if clean:
+        heads = repo.branchheads(repo['.'].branch())
         if heads:
             node = repo.revs('max(.::(%ln))', heads).first()
-        if bookmarks.isactivewdirparent(repo):
-            movemark = repo['.'].node()
+            if currentbranch not in repo.branchmap():
+                repo.ui.warn(_('uncommited branch %s does not exist, '
+                               'updating to the head of parent branch\n')
+                             % currentbranch)
     else:
-        node = repo['.'].node()
+        if currentbranch in repo.branchmap():
+            heads = repo.branchheads(currentbranch)
+            if heads:
+                node = repo.revs('max(.::(%ln))', heads).first()
+            if bookmarks.isactivewdirparent(repo):
+                movemark = repo['.'].node()
+        else:
+            node = repo['.'].node()
     return node, movemark, None
 
 def _destupdatebranchfallback(repo, clean, check):
diff -r 9b92231d66d9 -r b7570c990ffb tests/test-newbranch.t
--- a/tests/test-newbranch.t	Tue Apr 05 06:53:33 2016 +0200
+++ b/tests/test-newbranch.t	Tue Apr 05 07:30:01 2016 +0200
@@ -391,3 +391,58 @@ We expect that bare update on new branch
   commit: (new branch)
   update: (current)
   phases: 3 draft
+
+  $ cd ..
+
+We expects that update --clean discard changes in working directory,
+and updates to the head of parent branch.
+
+  $ hg init updatebareclean
+  $ cd updatebareclean
+  $ hg update --clean
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ touch a
+  $ hg commit -A -m "a"
+  adding a
+  $ touch b
+  $ hg commit -A -m "b"
+  adding b
+  $ touch c
+  $ hg commit -A -m "c"
+  adding c
+  $ hg log
+  changeset:   2:991a3460af53
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     c
+  
+  changeset:   1:0e067c57feba
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     b
+  
+  changeset:   0:3903775176ed
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     a
+  
+  $ hg update -r 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg branch new-branch
+  marked working directory as branch new-branch
+  (branches are permanent and global, did you want a bookmark?)
+  $ echo "aa" >> a
+  $ hg update --clean
+  uncommited branch new-branch does not exist, updating to the head of parent branch
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg status
+  $ hg branch
+  default
+  $ hg parent
+  changeset:   2:991a3460af53
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     c
+  


More information about the Mercurial-devel mailing list