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

liscju piotr.listkiewicz at gmail.com
Wed Apr 13 07:29:57 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 a8cc72ea2f5d5d73bf51447eb18d1ccba48afdee
# Parent  f5f2ade3ad9fa5ce6f4c908273c74d1228b03e0c
update: fix bare --clean to work on new branch (issue5003) (BC)

Before this commit bare update --clean on newly created branch
updates to the parent commit, even if there are later commits
on the parent commit's branch. Update to the latest head on the
parent commit's branch instead.

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

diff -r f5f2ade3ad9f -r a8cc72ea2f5d 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(_('uncommitted 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 f5f2ade3ad9f -r a8cc72ea2f5d 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 expect 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
+  uncommitted 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