view tests/test-narrow-shallow.t @ 39641:aa7e312375cf

wireprotov2: let clients drive delta behavior Previously, the "manifestdata" and "filedata" commands assumed the receiver had all parent revisions for requested nodes. Unless the revision had no parents, they emitted a delta instead of a fulltext. This strategy isn't appropriate for shallow clones and for clients that only want to access fulltext revision data for a single node without fetching their parent revisions. This commit adds an "haveparents" argument to the "manifestdata" and "filedata" commands that controls delta generation behavior. Unless "haveparents" is set, the server assumes that the client doesn't have parent revisions unless they were previously sent as part of the current group of revisions. This change allows the fulltext revision data of any individual revision to be obtained. This will facilitate shallow clones and other data retrieval strategies that don't require all previous revisions of an entity to be fetched. Differential Revision: https://phab.mercurial-scm.org/D4492
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 30 Aug 2018 14:55:34 -0700
parents 8d033b348d85
children 34f2c634c8f6
line wrap: on
line source

#require no-reposimplestore

  $ . "$TESTDIR/narrow-library.sh"

  $ hg init master
  $ cd master
  $ cat >> .hg/hgrc <<EOF
  > [narrow]
  > serveellipses=True
  > EOF
  $ for x in `$TESTDIR/seq.py 10`
  > do
  >   echo $x > "f$x"
  >   hg add "f$x"
  > done
  $ hg commit -m "Add root files"
  $ mkdir d1 d2
  $ for x in `$TESTDIR/seq.py 10`
  > do
  >   echo d1/$x > "d1/f$x"
  >   hg add "d1/f$x"
  >   echo d2/$x > "d2/f$x"
  >   hg add "d2/f$x"
  > done
  $ hg commit -m "Add d1 and d2"
  $ for x in `$TESTDIR/seq.py 10`
  > do
  >   echo f$x rev2 > "f$x"
  >   echo d1/f$x rev2 > "d1/f$x"
  >   echo d2/f$x rev2 > "d2/f$x"
  >   hg commit -m "Commit rev2 of f$x, d1/f$x, d2/f$x"
  > done
  $ cd ..

narrow and shallow clone the d2 directory

  $ hg clone --narrow ssh://user@dummy/master shallow --include "d2" --depth 2
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 4 changesets with 13 changes to 10 files
  new changesets *:* (glob)
  updating to branch default
  10 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd shallow
  $ hg log -T '{rev}{if(ellipsis,"...")}: {desc}\n'
  3: Commit rev2 of f10, d1/f10, d2/f10
  2: Commit rev2 of f9, d1/f9, d2/f9
  1: Commit rev2 of f8, d1/f8, d2/f8
  0...: Commit rev2 of f7, d1/f7, d2/f7
  $ hg update 0
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cat d2/f7 d2/f8
  d2/f7 rev2
  d2/8

  $ cd ..

change every upstream file once

  $ cd master
  $ for x in `$TESTDIR/seq.py 10`
  > do
  >   echo f$x rev3 > "f$x"
  >   echo d1/f$x rev3 > "d1/f$x"
  >   echo d2/f$x rev3 > "d2/f$x"
  >   hg commit -m "Commit rev3 of f$x, d1/f$x, d2/f$x"
  > done
  $ cd ..

pull new changes with --depth specified. There were 10 changes to the d2
directory but the shallow pull should only fetch 3.

  $ cd shallow
  $ hg pull --depth 2
  pulling from ssh://user@dummy/master
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 4 changesets with 10 changes to 10 files
  new changesets *:* (glob)
  (run 'hg update' to get a working copy)
  $ hg log -T '{rev}{if(ellipsis,"...")}: {desc}\n'
  7: Commit rev3 of f10, d1/f10, d2/f10
  6: Commit rev3 of f9, d1/f9, d2/f9
  5: Commit rev3 of f8, d1/f8, d2/f8
  4...: Commit rev3 of f7, d1/f7, d2/f7
  3: Commit rev2 of f10, d1/f10, d2/f10
  2: Commit rev2 of f9, d1/f9, d2/f9
  1: Commit rev2 of f8, d1/f8, d2/f8
  0...: Commit rev2 of f7, d1/f7, d2/f7
  $ hg update 4
  merging d2/f1
  merging d2/f2
  merging d2/f3
  merging d2/f4
  merging d2/f5
  merging d2/f6
  merging d2/f7
  3 files updated, 7 files merged, 0 files removed, 0 files unresolved
  $ cat d2/f7 d2/f8
  d2/f7 rev3
  d2/f8 rev2
  $ hg update 7
  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cat d2/f10
  d2/f10 rev3

  $ cd ..

cannot clone with zero or negative depth

  $ hg clone --narrow ssh://user@dummy/master bad --include "d2" --depth 0
  requesting all changes
  remote: abort: depth must be positive, got 0
  abort: pull failed on remote
  [255]
  $ hg clone --narrow ssh://user@dummy/master bad --include "d2" --depth -1
  requesting all changes
  remote: abort: depth must be positive, got -1
  abort: pull failed on remote
  [255]