obsolete: do not exchange extinct changesets
authorPierre-Yves David <pierre-yves.david@ens-lyon.org>
Fri, 13 Jul 2012 14:38:49 +0200
changeset 17206 70ebb4bd8083
parent 17205 97eff00046de
child 17207 62c56c94c77e
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.
mercurial/discovery.py
tests/test-obsolete.t
--- a/mercurial/discovery.py	Tue Jul 17 01:22:31 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 = visibleheads(repo)
+        # 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
@@ -266,9 +269,10 @@
     """return the set of visible head of this repo"""
     # XXX we want a cache on this
     sroots = repo._phasecache.phaseroots[phases.secret]
-    if sroots:
-        # XXX very slow revset. storing heads or secret "boundary" would help.
-        revset = repo.set('heads(not (%ln::))', sroots)
+    if sroots or repo.obsstore:
+        # XXX very slow revset. storing heads or secret "boundary"
+        # would help.
+        revset = repo.set('heads(not (%ln:: + extinct()))', sroots)
 
         vheads = [ctx.node() for ctx in revset]
         if not vheads:
@@ -277,12 +281,13 @@
         vheads = repo.heads()
     return vheads
 
+
 def visiblebranchmap(repo):
     """return a branchmap for the visible set"""
     # XXX Recomputing this data on the fly is very slow.  We should build a
     # XXX cached version while computin the standard branchmap version.
     sroots = repo._phasecache.phaseroots[phases.secret]
-    if sroots:
+    if sroots or repo.obsstore:
         vbranchmap = {}
         for branch, nodes in  repo.branchmap().iteritems():
             # search for secret heads.
@@ -290,12 +295,12 @@
                 if repo[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 = repo.set('heads(branch(%s) - secret())', branch)
+                s = repo.set('heads(branch(%s) - secret() - extinct())',
+                             branch)
                 nodes = [c.node() for c in s]
             vbranchmap[branch] = nodes
     else:
         vbranchmap = repo.branchmap()
     return vbranchmap
-
--- a/tests/test-obsolete.t	Tue Jul 17 01:22:31 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'}
@@ -254,26 +249,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
@@ -289,21 +273,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
@@ -315,18 +312,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]