changeset 3925:27230c29bfec 0.9.3

fix calculation of new heads added during push with -r fix issue450
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Sun, 17 Dec 2006 05:00:22 +0100
parents 5f0e00224cde
children b27f1da6ca88
files mercurial/localrepo.py mercurial/revlog.py tests/test-push-warn tests/test-push-warn.out
diffstat 4 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1392,7 +1392,7 @@ class localrepository(repo.repository):
                 newheads = list(heads)
                 for r in remote_heads:
                     if r in self.changelog.nodemap:
-                        desc = self.changelog.heads(r)
+                        desc = self.changelog.heads(r, heads)
                         l = [h for h in heads if h in desc]
                         if not l:
                             newheads.append(r)
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -717,15 +717,19 @@ class revlog(object):
         assert heads
         return (orderedout, roots, heads)
 
-    def heads(self, start=None):
+    def heads(self, start=None, stop=None):
         """return the list of all nodes that have no children
 
         if start is specified, only heads that are descendants of
         start will be returned
-
+        if stop is specified, it will consider all the revs from stop
+        as if they had no children
         """
         if start is None:
             start = nullid
+        if stop is None:
+            stop = []
+        stoprevs = dict.fromkeys([self.rev(n) for n in stop])
         startrev = self.rev(start)
         reachable = {startrev: 1}
         heads = {startrev: 1}
@@ -734,10 +738,12 @@ class revlog(object):
         for r in xrange(startrev + 1, self.count()):
             for p in parentrevs(r):
                 if p in reachable:
-                    reachable[r] = 1
+                    if r not in stoprevs:
+                        reachable[r] = 1
                     heads[r] = 1
-                if p in heads:
+                if p in heads and p not in stoprevs:
                     del heads[p]
+
         return [self.node(r) for r in heads]
 
     def children(self, node):
--- a/tests/test-push-warn
+++ b/tests/test-push-warn
@@ -54,4 +54,9 @@ hg push -r 3 -r 4 ../c; echo $?
 hg push -f -r 3 -r 4 ../c; echo $?
 hg push -r 5 ../c; echo $?
 
+# issue 450
+hg init ../e
+hg push -r 0 ../e ; echo $?
+hg push -r 1 ../e ; echo $?
+
 exit 0
--- a/tests/test-push-warn.out
+++ b/tests/test-push-warn.out
@@ -62,3 +62,17 @@ adding manifests
 adding file changes
 added 1 changesets with 1 changes to 1 files (-1 heads)
 0
+pushing to ../e
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+0
+pushing to ../e
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+0