branchmap: server should not advertise secret changeset in branchmap (Issue3303)
Discovery now use an overlay above branchmap to prune invisible "secret"
changeset from branchmap.
To minimise impact on the code during the code freeze, this is achieve by
recomputing non-secret heads on the fly when any secret changeset exists. This
is a computation heavy approach similar to the one used for visible heads. But
few sever should contains secret changeset anyway. See comment in code for more
robust approach.
On local repo the wrapper is applied explicitly while the wire-protocol take
care of wrapping branchmap call in a transparent way. This could be unified by
the Peter Arrenbrecht and Sune Foldager proposal of a `peer` object.
An inappropriate `(+i heads)` may still appear when pushing new changes on a
repository with secret changeset. (see Issue3394 for details)
$ "$TESTDIR/hghave" serve || exit 80
$ echo "[extensions]" >> $HGRCPATH
$ echo "share = " >> $HGRCPATH
prepare repo1
$ hg init repo1
$ cd repo1
$ echo a > a
$ hg commit -A -m'init'
adding a
share it
$ cd ..
$ hg share repo1 repo2
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
share shouldn't have a store dir
$ cd repo2
$ test -d .hg/store
[1]
Some sed versions appends newline, some don't, and some just fails
$ cat .hg/sharedpath; echo
$TESTTMP/repo1/.hg (glob)
trailing newline on .hg/sharedpath is ok
$ hg tip -q
0:d3873e73d99e
$ echo '' >> .hg/sharedpath
$ cat .hg/sharedpath
$TESTTMP/repo1/.hg (glob)
$ hg tip -q
0:d3873e73d99e
commit in shared clone
$ echo a >> a
$ hg commit -m'change in shared clone'
check original
$ cd ../repo1
$ hg log
changeset: 1:8af4dc49db9e
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change in shared clone
changeset: 0:d3873e73d99e
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: init
$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat a # should be two lines of "a"
a
a
commit in original
$ echo b > b
$ hg commit -A -m'another file'
adding b
check in shared clone
$ cd ../repo2
$ hg log
changeset: 2:c2e0ac586386
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: another file
changeset: 1:8af4dc49db9e
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change in shared clone
changeset: 0:d3873e73d99e
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: init
$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat b # should exist with one "b"
b
hg serve shared clone
$ hg serve -n test -p $HGPORT -d --pid-file=hg.pid
$ cat hg.pid >> $DAEMON_PIDS
$ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/raw-file/'
200 Script output follows
-rw-r--r-- 4 a
-rw-r--r-- 2 b
test unshare command
$ hg unshare
$ test -d .hg/store
$ test -f .hg/sharedpath
[1]
$ hg unshare
abort: this is not a shared repo
[255]
check that a change does not propagate
$ echo b >> b
$ hg commit -m'change in unshared'
$ cd ../repo1
$ hg id -r tip
c2e0ac586386 tip