[PATCH rebased] obsolete: do not exchange extinct changesets

Pierre-Yves David pierre-yves.david at ens-lyon.org
Fri Jul 13 07:47:23 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1342183129 -7200
# Node ID de13ccd4ef8d1ed1abc052a57a88b757c17a0594
# Parent  3befd22091cdb3302da5c2969f337c6ac9c86fe1
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 -r 3befd22091cd -r de13ccd4ef8d mercurial/discovery.py
--- a/mercurial/discovery.py	Fri Jul 06 01:58:55 2012 +0200
+++ b/mercurial/discovery.py	Fri Jul 13 14:38:49 2012 +0200
@@ -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 -r 3befd22091cd -r de13ccd4ef8d mercurial/localrepo.py
--- a/mercurial/localrepo.py	Fri Jul 06 01:58:55 2012 +0200
+++ b/mercurial/localrepo.py	Fri Jul 13 14:38:49 2012 +0200
@@ -520,7 +520,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.
@@ -528,9 +528,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:
@@ -1578,10 +1579,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 -r 3befd22091cd -r de13ccd4ef8d tests/test-obsolete.t
--- a/tests/test-obsolete.t	Fri Jul 06 01:58:55 2012 +0200
+++ b/tests/test-obsolete.t	Fri Jul 13 14:38:49 2012 +0200
@@ -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
   245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
@@ -179,9 +180,9 @@
   1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 {'date': '1340 0', 'user': 'test'}
   $ hg rollback -n
-  repository tip rolled back to revision 5 (undo debugobsolete)
+  repository tip rolled back to revision 3 (undo debugobsolete)
   $ hg rollback
-  repository tip rolled back to revision 5 (undo debugobsolete)
+  repository tip rolled back to revision 3 (undo debugobsolete)
   $ hg debugobsolete
   245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
   cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
@@ -196,12 +197,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
@@ -227,7 +222,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'}
@@ -253,26 +248,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
@@ -288,21 +272,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
@@ -314,18 +311,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