[PATCH] changegroup: do not count closed new heads (issue2697)

Adrian Buehlmann adrian at cadifra.com
Wed Apr 27 15:55:32 CDT 2011


# HG changeset patch
# User Adrian Buehlmann <adrian at cadifra.com>
# Date 1303668665 -7200
# Node ID 43b3d084e115f22c3f78b799b2c7764ddcbfc4fe
# Parent  98f79a5c308665e1ce1b020bb66ed37f47f102e6
changegroup: do not count closed new heads (issue2697)

If a closed head gets pulled, we currently see (example):

  $ hg pull
  pulling from $TESTTMP/repo2
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 1 changes to 1 files (+1 heads)
  (run 'hg heads' to see heads, 'hg merge' to merge)

A subsequent 'hg heads' doesn't show that head because it is closed.

This patch improves the UI response texts for that same use case to:

  $ hg pull
  pulling from $TESTTMP/repo2
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 1 changes to 1 files
  (run 'hg update' to get a working copy)

That is, the part "(+1 heads)" is not shown in that case any longer.

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1690,7 +1690,7 @@
         # inconsistent view
         cl = self.changelog
         cl.delayupdate()
-        oldheads = len(cl.heads())
+        oldheads = cl.heads()
 
         tr = self.transaction("\n".join([srctype, urlmod.hidepassword(url)]))
         try:
@@ -1781,14 +1781,20 @@
                             _('missing file data for %s:%s - run hg verify') %
                             (f, hex(n)))
 
-            newheads = len(cl.heads())
-            heads = ""
-            if oldheads and newheads != oldheads:
-                heads = _(" (%+d heads)") % (newheads - oldheads)
+            dh = 0
+            if oldheads:
+                heads = cl.heads()
+                dh = len(heads) - len(oldheads)
+                for h in heads:
+                    if h not in oldheads and 'close' in self[h].extra():
+                        dh -= 1
+            htext = ""
+            if dh:
+                htext = _(" (%+d heads)") % dh
 
             self.ui.status(_("added %d changesets"
                              " with %d changes to %d files%s\n")
-                             % (changesets, revisions, files, heads))
+                             % (changesets, revisions, files, htext))
 
             if changesets > 0:
                 p = lambda: cl.writepending() and self.root or ""
@@ -1817,11 +1823,10 @@
                           source=srctype, url=url)
 
         # never return 0 here:
-        if newheads < oldheads:
-            return newheads - oldheads - 1
+        if dh < 0:
+            return dh - 1
         else:
-            return newheads - oldheads + 1
-
+            return dh + 1
 
     def stream_in(self, remote, requirements):
         lock = self.lock()
diff --git a/tests/test-pull-r.t b/tests/test-pull-r.t
--- a/tests/test-pull-r.t
+++ b/tests/test-pull-r.t
@@ -27,6 +27,36 @@
   summary:     add foo
   
   $ cd ..
+
+don't show "(+1 heads)" message when pulling closed head
+
+  $ hg clone -q repo repo2
+  $ hg clone -q repo2 repo3
+  $ cd repo2
+  $ hg up -q 0
+  $ echo hello >> foo
+  $ hg ci -mx1
+  created new head
+  $ hg ci -mx2 --close-branch
+  $ cd ../repo3
+  $ hg heads -q --closed
+  2:effea6de0384
+  1:ed1b79f46b9a
+  $ hg pull
+  pulling from $TESTTMP/repo2
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 1 changes to 1 files
+  (run 'hg update' to get a working copy)
+  $ hg heads -q --closed
+  4:996201fa1abf
+  2:effea6de0384
+  1:ed1b79f46b9a
+
+  $ cd ..
+
   $ hg init copy
   $ cd copy
 


More information about the Mercurial-devel mailing list