copies: filter out copies from non-existent source later in _chain()
_changesetforwardcopies() repeatedly calls _chain(). That is very
expensive because _chain() does lookups in the manifest. I hope to
split up the function in two parts: 1) simple chaining, not
considering end points, and 2) filter out files that don't exist in
the end points (and ping-pong copies/renames).
This patches gets us closer to that by moving the check for
non-existent source later in the function. Now there are no more
checks for "src" and "dst" in the first loop; all the filtering of
invalid copies is done in the second loop. The code also looks much
more consistent now.
No measureable impact on `hg debugpathcopies 4.0 4.8`. That shouldn't
be surprising since the only case we're doing more checks now is in
case of chained copies/renames, which are quire rare in practice.
Differential Revision: https://phab.mercurial-scm.org/D6277
#testcases tree flat-fncache flat-nofncache
Tests narrow stream clones
$ . "$TESTDIR/narrow-library.sh"
#if tree
$ cat << EOF >> $HGRCPATH
> [experimental]
> treemanifest = 1
> EOF
#endif
#if flat-nofncache
$ cat << EOF >> $HGRCPATH
> [format]
> usefncache = 0
> EOF
#endif
Server setup
$ hg init master
$ cd master
$ mkdir dir
$ mkdir dir/src
$ cd dir/src
$ for x in `$TESTDIR/seq.py 20`; do echo $x > "F$x"; hg add "F$x"; hg commit -m "Commit src $x"; done
$ cd ..
$ mkdir tests
$ cd tests
$ for x in `$TESTDIR/seq.py 20`; do echo $x > "F$x"; hg add "F$x"; hg commit -m "Commit src $x"; done
$ cd ../../..
Trying to stream clone when the server does not support it
$ hg clone --narrow ssh://user@dummy/master narrow --noupdate --include "dir/src/F10" --stream
streaming all changes
remote: abort: server does not support narrow stream clones
abort: pull failed on remote
[255]
Enable stream clone on the server
$ echo "[experimental]" >> master/.hg/hgrc
$ echo "server.stream-narrow-clones=True" >> master/.hg/hgrc
Cloning a specific file when stream clone is supported
$ hg clone --narrow ssh://user@dummy/master narrow --noupdate --include "dir/src/F10" --stream
streaming all changes
* files to transfer, * KB of data (glob)
transferred * KB in * seconds (* */sec) (glob)
$ cd narrow
$ ls
$ hg tracked
I path:dir/src/F10
Making sure we have the correct set of requirements
$ cat .hg/requires
dotencode (tree flat-fncache !)
fncache (tree flat-fncache !)
generaldelta
narrowhg-experimental
revlogv1
sparserevlog
store
treemanifest (tree !)
Making sure store has the required files
$ ls .hg/store/
00changelog.i
00manifest.i
data (tree flat-fncache !)
fncache (tree flat-fncache !)
meta (tree !)
narrowspec
undo
undo.backupfiles
undo.narrowspec
undo.phaseroots
Checking that repository has all the required data and not broken
$ hg verify
checking changesets
checking manifests
checking directory manifests (tree !)
crosschecking files in changesets and manifests
checking files
checked 40 changesets with 1 changes to 1 files