incoming: fix incoming when a local head is remotely filtered (
issue3805)
In its current state discovery may return (remotely) filtered elements
in "common". This has usually no impact as "missing" is kept clear of
filtered elements. However when the "remote" repo is a local repo (disk
accessible, and directly created in memory) the incoming code takes a
shortcut and directly uses the "remote" repo to generate the incoming
output. When some common elements are filtered this led to a crash. We
now ensure we use an unfiltered repository to generate the incoming
output. This does not change the behavior as missing is clear of
filtered revision.
Now that we have proper low level filtering, incoming code needs a
deeper cleanup but it is already planned.
--- a/mercurial/bundlerepo.py Tue Feb 05 11:31:43 2013 -0600
+++ b/mercurial/bundlerepo.py Wed Feb 06 07:55:29 2013 +0000
@@ -367,6 +367,11 @@
localrepo = bundlerepo = bundlerepository(ui, repo.root, fname)
# this repo contains local and other now, so filter out local again
common = repo.heads()
+ if localrepo:
+ # Part of common may be remotely filtered
+ # So use an unfiltered version
+ # The discovery process probably need cleanup to avoid that
+ localrepo = localrepo.unfiltered()
csets = localrepo.changelog.findmissing(common, rheads)
--- a/tests/test-obsolete.t Tue Feb 05 11:31:43 2013 -0600
+++ b/tests/test-obsolete.t Wed Feb 06 07:55:29 2013 +0000
@@ -776,4 +776,92 @@
date: Thu Jan 01 00:00:00 1970 +0000
summary: add celestine
+
+reenable for later test
+
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
+
#endif
+
+Test incoming/outcoming with changesets obsoleted remotely, known locally
+===============================================================================
+
+This test issue 3805
+
+ $ hg init repo-issue3805
+ $ cd repo-issue3805
+ $ echo "foo" > foo
+ $ hg ci -Am "A"
+ adding foo
+ $ hg clone . ../other-issue3805
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "bar" >> foo
+ $ hg ci --amend
+ $ cd ../other-issue3805
+ $ hg log -G
+ @ changeset: 0:193e9254ce7e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: A
+
+ $ hg log -G -R ../repo-issue3805
+ @ changeset: 2:3816541e5485
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: A
+
+ $ hg incoming
+ comparing with $TESTTMP/tmpe/repo-issue3805
+ searching for changes
+ changeset: 2:3816541e5485
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: A
+
+ $ hg incoming --bundle ../issue3805.hg
+ comparing with $TESTTMP/tmpe/repo-issue3805
+ searching for changes
+ changeset: 2:3816541e5485
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: A
+
+ $ hg outgoing
+ comparing with $TESTTMP/tmpe/repo-issue3805
+ searching for changes
+ no changes found
+ [1]
+
+#if serve
+
+ $ hg serve -R ../repo-issue3805 -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ hg incoming http://localhost:$HGPORT
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ changeset: 1:3816541e5485
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: A
+
+ $ hg outgoing http://localhost:$HGPORT
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+
+ $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
+
+#endif