Mercurial > hg-stable
changeset 10879:29030b7f664a
merge default
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 09 Apr 2010 15:16:31 +0200 |
parents | bbf496db0766 (current diff) dc097666de01 (diff) |
children | 4775fc1e04a8 |
files | |
diffstat | 6 files changed, 199 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/copies.py Wed Apr 07 14:44:51 2010 -0500 +++ b/mercurial/copies.py Fri Apr 09 15:16:31 2010 +0200 @@ -117,8 +117,23 @@ diverge = {} def related(f1, f2, limit): + # Walk back to common ancestor to see if the two files originate + # from the same file. Since workingfilectx's rev() is None it messes + # up the integer comparison logic, hence the pre-step check for + # None (f1 and f2 can only be workingfilectx's initially). + + if f1 == f2: + return f1 # a match + g1, g2 = f1.ancestors(), f2.ancestors() try: + f1r, f2r = f1.rev(), f2.rev() + + if f1r is None: + f1 = g1.next() + if f2r is None: + f2 = g2.next() + while 1: f1r, f2r = f1.rev(), f2.rev() if f1r > f2r:
--- a/mercurial/localrepo.py Wed Apr 07 14:44:51 2010 -0500 +++ b/mercurial/localrepo.py Fri Apr 09 15:16:31 2010 +0200 @@ -1500,8 +1500,13 @@ remote_heads = remote.heads() inc = self.findincoming(remote, common, remote_heads, force=force) + cl = self.changelog update, updated_heads = self.findoutgoing(remote, common, remote_heads) - msng_cl, bases, heads = self.changelog.nodesbetween(update, revs) + msng_cl, bases, heads = cl.nodesbetween(update, revs) + + outgoingnodeset = set(msng_cl) + # compute set of nodes which, if they were a head before, no longer are + nolongeraheadnodeset = set(p for n in msng_cl for p in cl.parents(n)) def checkbranch(lheads, rheads, branchname=None): ''' @@ -1511,26 +1516,10 @@ lheads: local branch heads rheads: remote branch heads ''' - - warn = 0 - - if len(lheads) > len(rheads): - warn = 1 - else: - # add heads we don't have or that are not involved in the push - newheads = set(lheads) - for r in rheads: - if r in self.changelog.nodemap: - desc = self.changelog.heads(r, heads) - l = [h for h in heads if h in desc] - if not l: - newheads.add(r) - else: - newheads.add(r) - if len(newheads) > len(rheads): - warn = 1 - - if warn: + newlheads = [n for n in lheads if n in outgoingnodeset] + formerrheads = [n for n in rheads if n in nolongeraheadnodeset] + if len(newlheads) > len(formerrheads): + # we add more new heads than we demote former heads to non-head if branchname is not None: msg = _("abort: push creates new remote heads" " on branch '%s'!\n") % branchname @@ -1594,7 +1583,7 @@ if revs is None: # use the fast path, no race possible on push - nodes = self.changelog.findmissing(common.keys()) + nodes = cl.findmissing(common.keys()) cg = self._changegroup(nodes, 'push') else: cg = self.changegroupsubset(update, revs, 'push')
--- a/tests/test-push-warn Wed Apr 07 14:44:51 2010 -0500 +++ b/tests/test-push-warn Fri Apr 09 15:16:31 2010 +0200 @@ -1,5 +1,8 @@ #!/bin/sh +echo "[extensions]" >> $HGRCPATH +echo "graphlog=" >> $HGRCPATH + mkdir a cd a hg init @@ -193,5 +196,72 @@ hg -q merge 3 hg -q ci -d '0 0' -mma hg push ../l -b b +cd .. + +echo % check prepush with new branch head on former topo non-head +hg init n +cd n +hg branch A +echo a >a +hg ci -Ama +hg branch B +echo b >b +hg ci -Amb +# b is now branch head of B, and a topological head +# a is now branch head of A, but not a topological head +hg clone . inner +cd inner +hg up B +echo b1 >b1 +hg ci -Amb1 +# in the clone b1 is now the head of B +cd .. +hg up 0 +echo a2 >a2 +hg ci -Ama2 +# a2 is now the new branch head of A, and a new topological head +# it replaces a former inner branch head, so it should at most warn about A, not B +echo %% glog of local +hg glog --template "{rev}: {branches} {desc}\n" +echo %% glog of remote +hg glog -R inner --template "{rev}: {branches} {desc}\n" +echo %% outgoing +hg out inner --template "{rev}: {branches} {desc}\n" +hg push inner +cd .. + +echo % check prepush with new branch head on former topo head +hg init o +cd o +hg branch A +echo a >a +hg ci -Ama +hg branch B +echo b >b +hg ci -Amb +# b is now branch head of B, and a topological head +hg up 0 +echo a1 >a1 +hg ci -Ama1 +# a1 is now branch head of A, and a topological head +hg clone . inner +cd inner +hg up B +echo b1 >b1 +hg ci -Amb1 +# in the clone b1 is now the head of B +cd .. +echo a2 >a2 +hg ci -Ama2 +# a2 is now the new branch head of A, and a topological head +# it replaces a former topological and branch head, so this should not warn +echo %% glog of local +hg glog --template "{rev}: {branches} {desc}\n" +echo %% glog of remote +hg glog -R inner --template "{rev}: {branches} {desc}\n" +echo %% outgoing +hg out inner --template "{rev}: {branches} {desc}\n" +hg push inner +cd .. exit 0
--- a/tests/test-push-warn.out Wed Apr 07 14:44:51 2010 -0500 +++ b/tests/test-push-warn.out Fri Apr 09 15:16:31 2010 +0200 @@ -175,3 +175,82 @@ searching for changes abort: push creates new remote heads on branch 'a'! (did you forget to merge? use push -f to force) +% check prepush with new branch head on former topo non-head +marked working directory as branch A +adding a +marked working directory as branch B +adding b +updating to branch B +2 files updated, 0 files merged, 0 files removed, 0 files unresolved +0 files updated, 0 files merged, 0 files removed, 0 files unresolved +adding b1 +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +adding a2 +created new head +%% glog of local +@ 2: A a2 +| +| o 1: B b +|/ +o 0: A a + +%% glog of remote +@ 2: B b1 +| +o 1: B b +| +o 0: A a + +%% outgoing +comparing with inner +searching for changes +2: A a2 +pushing to inner +searching for changes +note: unsynced remote changes! +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files (+1 heads) +% check prepush with new branch head on former topo head +marked working directory as branch A +adding a +marked working directory as branch B +adding b +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +adding a1 +created new head +updating to branch A +2 files updated, 0 files merged, 0 files removed, 0 files unresolved +1 files updated, 0 files merged, 1 files removed, 0 files unresolved +adding b1 +adding a2 +%% glog of local +@ 3: A a2 +| +o 2: A a1 +| +| o 1: B b +|/ +o 0: A a + +%% glog of remote +@ 3: B b1 +| +| o 2: A a1 +| | +o | 1: B b +|/ +o 0: A a + +%% outgoing +comparing with inner +searching for changes +3: A a2 +pushing to inner +searching for changes +note: unsynced remote changes! +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-update-renames Fri Apr 09 15:16:31 2010 +0200 @@ -0,0 +1,19 @@ +#!/bin/sh + +# test update logic when there are renames + + +# update with local changes across a file rename +hg init a +cd a +echo a > a +hg add a +hg ci -m a +hg mv a b +hg ci -m rename +echo b > b +hg ci -m change +hg up -q 0 +echo c > a +hg up +cd ..
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-update-renames.out Fri Apr 09 15:16:31 2010 +0200 @@ -0,0 +1,5 @@ +merging a and b to b +warning: conflicts during merge. +merging b failed! +0 files updated, 0 files merged, 0 files removed, 1 files unresolved +use 'hg resolve' to retry unresolved file merges