changeset 214:a140d1857931

obsolete: do not warn about unpushed extinct changeset.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Wed, 25 Apr 2012 18:15:56 +0200
parents ea4aa1890b16
children 0eceb5a48485
files hgext/obsolete.py tests/test-corrupt.t tests/test-obsolete.t
diffstat 3 files changed, 157 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/obsolete.py	Tue Apr 24 15:56:31 2012 +0200
+++ b/hgext/obsolete.py	Wed Apr 25 18:15:56 2012 +0200
@@ -280,6 +280,30 @@
 
 pushkey.register('obsolete', pushobsolete, listobsolete)
 
+### Discovery wrapping
+#############################
+
+class blist(list, object):
+    """silly class to have non False but empty list"""
+
+    def __nonzero__(self):
+        return bool(len(self.orig))
+
+def wrapfindcommonoutgoing(orig, repo, *args, **kwargs):
+    """wrap mercurial.discovery.findcommonoutgoing to remove extinct changeset
+
+    Such excluded changeset are removed from excluded  and will *not* appear
+    are excluded secret changeset.
+    """
+    outgoing = orig(repo, *args, **kwargs)
+    orig = outgoing.excluded
+    outgoing.excluded = blist(n for n in orig if not repo[n].extinct())
+    # when no revision is specified (push everything) a shortcut is taken when
+    # nothign was exclude. taking this code path when extinct changeset have
+    # been excluded leads to repository corruption.
+    outgoing.excluded.orig = orig
+    return outgoing
+
 ### New commands
 #############################
 
@@ -307,6 +331,7 @@
 def uisetup(ui):
     extensions.wrapcommand(commands.table, "update", wrapmayobsoletewc)
     extensions.wrapcommand(commands.table, "pull", wrapmayobsoletewc)
+    extensions.wrapfunction(discovery, 'findcommonoutgoing', wrapfindcommonoutgoing)
 
 ### serialisation
 #############################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-corrupt.t	Wed Apr 25 18:15:56 2012 +0200
@@ -0,0 +1,122 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [defaults]
+  > amend=-d "0 0"
+  > [web]
+  > push_ssl = false
+  > allow_push = *
+  > [phases]
+  > publish = False
+  > [alias]
+  > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n'
+  > [diff]
+  > git = 1
+  > unified = 0
+  > [extensions]
+  > hgext.rebase=
+  > hgext.graphlog=
+  > EOF
+  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+  $ mkcommit() {
+  >    echo "$1" >> "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+  $ hg init local
+  $ hg init other
+  $ cd local
+  $ touch 1 2 3 4 5 6 7 8 9 0
+  $ hg add 1 2 3 4 5 6 7 8 9 0
+  $ mkcommit A
+  $ mkcommit B
+  $ mkcommit C
+  $ hg glog
+  @  changeset:   2:829b19580856
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add C
+  |
+  o  changeset:   1:97b8f02ab29e
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add B
+  |
+  o  changeset:   0:5d8dabd3961b
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add A
+  
+  $ hg push ../other
+  pushing to ../other
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 3 changesets with 13 changes to 13 files
+
+
+  $ hg -R ../other verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  13 files, 3 changesets, 13 total revisions
+  $ mkcommit D
+  $ mkcommit E
+  $ hg up -q .^^
+  $ hg revert -r tip -a -q
+  $ hg ci -m 'coin' -q
+  $ hg glog
+  @  changeset:   5:8313a6afebbb
+  |  tag:         tip
+  |  parent:      2:829b19580856
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     coin
+  |
+  | o  changeset:   4:076ec8ade1ac
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     add E
+  | |
+  | o  changeset:   3:824d9bb109f6
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     add D
+  |
+  o  changeset:   2:829b19580856
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add C
+  |
+  o  changeset:   1:97b8f02ab29e
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add B
+  |
+  o  changeset:   0:5d8dabd3961b
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add A
+  
+
+  $ hg kill -n -1 -- -2 -3
+  $ hg push ../other
+  pushing to ../other
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 2 changes to 2 files
+  $ hg -R ../other verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  15 files, 4 changesets, 15 total revisions
+
+
+
--- a/tests/test-obsolete.t	Tue Apr 24 15:56:31 2012 +0200
+++ b/tests/test-obsolete.t	Wed Apr 25 18:15:56 2012 +0200
@@ -124,6 +124,7 @@
   adding manifests
   adding file changes
   added 5 changesets with 5 changes to 5 files (+1 heads)
+  $ qlog -R ../other-new verify
   $ qlog -R ../other-new -r 'obsolete()'
   2
   - 0d3f46688ccc
@@ -178,6 +179,15 @@
   $ qlog -R ../other-new -r 'obsolete()'
   2
   - 0d3f46688ccc
+
+Pushing again does not advertise extinct changeset
+
+  $ hg push ../other-new
+  pushing to ../other-new
+  searching for changes
+  no changes found
+  [1]
+
   $ hg up -q .^ # 3
   Working directory parent is obsolete
   $ mkcommit "obsol_d'" # 7