[PATCH 8 of 8] obsolete: do not exchange extinct changesets

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Jul 5 19:27:30 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1341534252 -7200
# Node ID ea8a189541e71bef23f3a84aa2f4cef133a8595a
# Parent  edbb77b7fb7832d00e41059618a69b9fb9e7eb82
obsolete: do not exchange extinct changesets

Extinct changesets are excluded from all exchange operations. This is a silent
exclusion because the user should not need to be aware of them.

There is no reason to strongly enforce this exclusion except implementation
simplicity. User should be able to explicitly request an extinct changeset in
the future.

diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -109,11 +109,13 @@
     og.commonheads, _any, _hds = commoninc
 
     # compute outgoing
-    if not repo._phasecache.phaseroots[phases.secret]:
+    mayexclude = (repo._phasecache.phaseroots[phases.secret] or repo.obsstore)
+    if not mayexclude:
         og.missingheads = onlyheads or repo.heads()
     elif onlyheads is None:
         # use visible heads as it should be cached
         og.missingheads = repo.visibleheads()
+        # extinct changesets are silently ignored
         og.excluded = [ctx.node() for ctx in repo.set('secret()')]
     else:
         # compute common, missing and exclude secret stuff
@@ -122,17 +124,18 @@
         og._missing = missing = []
         og.excluded = excluded = []
         for node in allmissing:
-            if repo[node].phase() >= phases.secret:
-                excluded.append(node)
-            else:
-                missing.append(node)
-        if excluded:
-            # update missing heads
+            ctx = repo[node]
+            if not ctx.extinct():
+                # extinct changesets are silently ignored
+                if ctx.phase() >= phases.secret:
+                    excluded.append(node)
+                else:
+                    missing.append(node)
+        if len(missing) == len(allmissing):
+            missingheads = onlyheads
+        else: # update missing heads
             missingheads = phases.newheads(repo, onlyheads, excluded)
-        else:
-            missingheads = onlyheads
         og.missingheads = missingheads
-
     if portable:
         # recompute common and missingheads as if -r<rev> had been given for
         # each head of missing, and --base <rev> for each head of the proper
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -519,7 +519,7 @@
         # XXX Recomputing this data on the fly is very slow.  We should build a
         # XXX cached version while computin the standard branchmap version.
         sroots = self._phasecache.phaseroots[phases.secret]
-        if sroots:
+        if sroots or self.obsstore:
             vbranchmap = {}
             for branch, nodes in  self.branchmap().iteritems():
                 # search for secret heads.
@@ -527,9 +527,10 @@
                     if self[n].phase() >= phases.secret:
                         nodes = None
                         break
-                # if secreat heads where found we must compute them again
+                # if secret heads were found we must compute them again
                 if nodes is None:
-                    s = self.set('heads(branch(%s) - secret())', branch)
+                    s = self.set('heads(branch(%s) - secret() - extinct())',
+                                 branch)
                     nodes = [c.node() for c in s]
                 vbranchmap[branch] = nodes
         else:
@@ -1587,10 +1588,10 @@
         """return the set of visible head of this self"""
         # XXX we want a cache on this
         sroots = self._phasecache.phaseroots[phases.secret]
-        if sroots:
+        if sroots or self.obsstore:
             # XXX very slow revset. storing heads or secret "boundary"
             # would help.
-            revset = self.set('heads(not (%ln::))', sroots)
+            revset = self.set('heads(not (%ln:: + extinct()))', sroots)
 
             vheads = [ctx.node() for ctx in revset]
             if not vheads:
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -152,6 +152,7 @@
 ---------------------------------------
 
 Try to pull markers
+(extinct changeset are excluded but marker are pushed)
 
   $ hg init tmpc
   $ cd tmpc
@@ -161,7 +162,7 @@
   adding changesets
   adding manifests
   adding file changes
-  added 6 changesets with 6 changes to 6 files (+3 heads)
+  added 4 changesets with 4 changes to 4 files (+1 heads)
   (run 'hg heads' to see heads, 'hg merge' to merge)
   $ hg debugobsolete
   ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
@@ -177,12 +178,6 @@
   $ hg -R tmpb push tmpd
   pushing to tmpd
   searching for changes
-  abort: push includes an obsolete changeset: ca819180edb9!
-  [255]
-  $ hg -R tmpd debugobsolete
-  $ hg -R tmpb push tmpd --rev 'not obsolete()'
-  pushing to tmpd
-  searching for changes
   adding changesets
   adding manifests
   adding file changes
@@ -208,7 +203,7 @@
   adding changesets
   adding manifests
   adding file changes
-  added 6 changesets with 6 changes to 6 files (+3 heads)
+  added 4 changesets with 4 changes to 4 files (+1 heads)
   (run 'hg heads' to see heads, 'hg merge' to merge)
   $ hg debugobsolete
   2448244824482448244824482448244824482448 1339133913391339133913391339133913391339 0 {'date': '1339 0', 'user': 'test'}
@@ -234,26 +229,15 @@
 detect outgoing obsolete and unstable
 ---------------------------------------
 
+
   $ hg glog
-  o  changeset:   5:5601fb93a350
+  o  changeset:   3:5601fb93a350
   |  tag:         tip
   |  parent:      1:7c3bad9141dc
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     add new_3_c
   |
-  | x  changeset:   4:ca819180edb9
-  |/   parent:      1:7c3bad9141dc
-  |    user:        test
-  |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     add new_2_c
-  |
-  | x  changeset:   3:cdbce2fbb163
-  |/   parent:      1:7c3bad9141dc
-  |    user:        test
-  |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     add new_c
-  |
   | o  changeset:   2:245bde4270cd
   |/   user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
@@ -269,21 +253,34 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     add a
   
-  $ hg up -q 'desc("new_2_c")'
+  $ hg up 'desc("new_3_c")'
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ mkcommit original_d
+  $ mkcommit original_e
+  $ hg debugobsolete `getid original_d` -d '0 0'
+  $ hg log -r 'obsolete()'
+  changeset:   4:7c694bff0650
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add original_d
+  
   $ hg glog -r '::unstable()'
-  @  changeset:   6:7878242aeece
+  @  changeset:   5:6e572121998e
   |  tag:         tip
-  |  parent:      4:ca819180edb9
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add original_e
+  |
+  x  changeset:   4:7c694bff0650
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     add original_d
   |
-  x  changeset:   4:ca819180edb9
+  o  changeset:   3:5601fb93a350
   |  parent:      1:7c3bad9141dc
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     add new_2_c
+  |  summary:     add new_3_c
   |
   o  changeset:   1:7c3bad9141dc
   |  user:        test
@@ -295,18 +292,77 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     add a
   
+
+refuse to push obsolete changeset
+
+  $ hg push ../tmpc/ -r 'desc("original_d")'
+  pushing to ../tmpc/
+  searching for changes
+  abort: push includes an obsolete changeset: 7c694bff0650!
+  [255]
+
+refuse to push unstable changeset
+
   $ hg push ../tmpc/
   pushing to ../tmpc/
   searching for changes
-  abort: push includes an unstable changeset: 7878242aeece!
+  abort: push includes an unstable changeset: 6e572121998e!
   [255]
 
 Test that extinct changeset are properly detected
 
   $ hg log -r 'extinct()'
-  changeset:   3:cdbce2fbb163
+
+Don't try to push extinct changeset
+
+  $ hg init ../tmpf
+  $ hg out  ../tmpf
+  comparing with ../tmpf
+  searching for changes
+  changeset:   0:1f0dee641bb7
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add a
+  
+  changeset:   1:7c3bad9141dc
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add b
+  
+  changeset:   2:245bde4270cd
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add original_c
+  
+  changeset:   3:5601fb93a350
   parent:      1:7c3bad9141dc
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     add new_c
+  summary:     add new_3_c
   
+  changeset:   4:7c694bff0650
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add original_d
+  
+  changeset:   5:6e572121998e
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add original_e
+  
+  $ hg push ../tmpf -f # -f because be push unstable too
+  pushing to ../tmpf
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 6 changesets with 6 changes to 6 files (+1 heads)
+
+no warning displayed
+
+  $ hg push ../tmpf
+  pushing to ../tmpf
+  searching for changes
+  no changes found
+  [1]


More information about the Mercurial-devel mailing list