sapling/tests/test-fb-hgext-treemanifest-pullpublic.t
Mark Thomas 78a14a1687 remotefilelog: don't process manifests when not necessary
Summary:
When building a bundle that will be used for a pull that can't use the linkrev
fastpath, we need to process the manifests of the commits for which we will
send files so that we can correctly set up their linkrevs.  Currently this is
sometimes happening for all commits, which can be very slow when pulling a
large number of commits.

First, make it clearer what `LocalFiles` and `LocalTrees` means, and make it
easier to test for trees being local.

Second, when processing manifests looking for files that will be included in
the bundle, don't process non-local trees if we are only interested in local
trees.

Third, correctly determine whether to send all, local, or no trees or files
depending on what combinations of treemanifest and remotefilelog the client and
server support, and what operation is taking place.

Finally, we aren't passing `b2caps` through to `changegroup.makestream` in the
changegroup part generator for bundle2 parts.  This means the above test for
whether the client supports treemanifest always failed.

With these combined changes, a pull of a specific public revision (so not
following the fastpath) where the client supports both remotefilelog and
treemanifest, will result in the server using `LocalFiles` and `LocalTrees`,
and therefore not processing the manifests of public commits looking for which
files to send.

Reviewed By: DurhamG, ikostia

Differential Revision: D8446137

fbshipit-source-id: 9a4247af75fe79c1962a29fcb8bf0181868699f4
2018-06-19 10:20:07 -07:00

74 lines
1.8 KiB
Perl

$ . "$TESTDIR/library.sh"
$ hginit master
$ cd master
$ cat >> .hg/hgrc <<EOF
> [extensions]
> pushrebase=
> treemanifest=
> [remotefilelog]
> server=True
> [treemanifest]
> server=True
> EOF
$ mkcommit a
$ mkcommit b
$ hg phase -p -r 'all()'
Clone it
$ cd ..
$ hgcloneshallow ssh://user@dummy/master client1 -q --config extensions.treemanifest= --config treemanifest.treeonly=True
fetching tree '' a539ce0c1a22b0ecf34498f9f5ce8ea56df9ecb7, found via d2ae7f538514
1 trees fetched over * (glob)
2 files fetched over 1 fetches - (2 misses, 0.00% hit ratio) over * (glob)
$ cd client1
$ cat >> .hg/hgrc <<EOF
> [extensions]
> treemanifest=
>
> [remotefilelog]
> usefastdatapack=True
>
> [treemanifest]
> treeonly=True
> sendtrees=True
> EOF
Add a few more public server comits
$ cd ../master
$ mkcommit c
$ mkcommit d
$ mkcommit e
$ hg phase -p -r 'all()'
Create an extension the prints out whenever we compare manifests on the server
$ cat > "$TESTTMP/diffdebug.py" << EOF
> from mercurial import manifest
> class manifestdict(manifest.manifestdict):
> ui = None
> def diff(self, *args, **kwargs):
> if self.ui:
> self.ui.warn("*** manifestdict is comparing manifests\n")
> return super(manifestdict, self).diff(*args, **kwargs)
> def extsetup(ui):
> manifestdict.ui = ui
> manifest.manifestdict = manifestdict
> EOF
$ cat >> .hg/hgrc <<EOF
> [extensions]
> diffdebug=$TESTTMP/diffdebug.py
> EOF
Pull exactly up to d into the client
$ cd ../client1
$ hg pull -r 055a42cdd887
pulling from ssh://user@dummy/master
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 0 changes to 0 files
new changesets 177f92b77385:055a42cdd887
(run 'hg update' to get a working copy)