mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 17:27:53 +03:00
78a14a1687
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
74 lines
1.8 KiB
Perl
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)
|
|
|