tests/test-narrow-widen-linkrev-computation.t
author Raphaël Gomès <rgomes@octobus.net>
Tue, 01 Oct 2024 13:49:11 +0200
changeset 52060 8b7123c8947b
parent 51632 9c668377aa9f
permissions -rw-r--r--
update: add a Rust fast-path when updating from null (and clean) This case is easy to detect and we have all we need to generate a valid working copy and dirstate entirely in Rust, which speeds things up considerably: On my machine updating a repo of ~300k files goes from 10.00s down to 4.2s, all while consuming 50% less system time, with all caches hot. Something to note is that further improvements will probably happen with the upcoming `InnerRevlog` series that does smarter mmap hanlding, especially for filelogs. Here are benchmark numbers on a machine with only 4 cores (and no SMT enabled) ``` ### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm # benchmark.name = hg.command.update # bin-env-vars.hg.py-re2-module = default # bin-env-vars.hg.changeset.node = <this change> # benchmark.variants.atomic-update = no # benchmark.variants.scenario = null-to-tip # benchmark.variants.worker = default default: 5.328762 ~~~~~ rust: 1.308654 (-75.44%, -4.02) ### data-env-vars.name = mercurial-devel-2024-03-22-ds2-pnm # benchmark.name = hg.command.update # bin-env-vars.hg.py-re2-module = default # bin-env-vars.hg.changeset.node = <this change> # benchmark.variants.atomic-update = no # benchmark.variants.scenario = null-to-tip # benchmark.variants.worker = default default: 1.693271 ~~~~~ rust: 1.151053 (-32.02%, -0.54) ### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # benchmark.name = hg.command.update # bin-env-vars.hg.py-re2-module = default # bin-env-vars.hg.changeset.node = <this change> # benchmark.variants.atomic-update = no # benchmark.variants.scenario = null-to-tip # benchmark.variants.worker = default default: 38.901613 ~~~~~ rust: 11.637880 (-70.08%, -27.26) ### data-env-vars.name = netbsd-xsrc-public-2024-09-19-ds2-pnm # benchmark.name = hg.command.update # bin-env-vars.hg.py-re2-module = default # bin-env-vars.hg.changeset.node = <this change> # benchmark.variants.atomic-update = no # benchmark.variants.scenario = null-to-tip # benchmark.variants.worker = default default: 4.793727 ~~~~~ rust: 1.505905 (-68.59%, -3.29) ```

==============================================================================================
Test the computation of linkrev that is needed when sending file content after their changeset
==============================================================================================

Setup
=====

tree/flat make the hash unstable had are anoying, reinstall that later.
.. #testcases tree flat
  $ . "$TESTDIR/narrow-library.sh"

.. #if tree
..   $ cat << EOF >> $HGRCPATH
..   > [experimental]
..   > treemanifest = 1
..   > EOF
.. #endif

  $ hg init server
  $ cd server

We build a non linear history with some filenome that exist in parallel.

  $ echo foo > readme.txt
  $ hg add readme.txt
  $ hg ci -m 'root'
  $ mkdir dir_x
  $ echo foo > dir_x/f1
  $ echo fo0 > dir_x/f2
  $ echo f0o > dir_x/f3
  $ mkdir dir_y
  $ echo bar > dir_y/f1
  $ echo 8ar > dir_y/f2
  $ echo ba9 > dir_y/f3
  $ hg add dir_x dir_y
  adding dir_x/f1
  adding dir_x/f2
  adding dir_x/f3
  adding dir_y/f1
  adding dir_y/f2
  adding dir_y/f3
  $ hg ci -m 'rev_a_'

  $ hg update 'desc("rev_a_")'
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo foo-01 > dir_x/f1
  $ hg ci -m 'rev_b_0_'

  $ hg update 'desc("rev_b_0_")'
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo foo-02 > dir_x/f1
  $ hg ci -m 'rev_b_1_'

  $ hg update 'desc("rev_a_")'
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ mkdir dir_z
  $ echo bar-01 > dir_y/f1
  $ echo 8ar-01 > dir_y/f2
  $ echo babar > dir_z/f1
  $ hg add dir_z
  adding dir_z/f1
  $ hg ci -m 'rev_c_0_'
  created new head

  $ hg update 'desc("rev_c_0_")'
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo celeste > dir_z/f2
  $ echo zephir > dir_z/f1
  $ hg add dir_z
  adding dir_z/f2
  $ hg ci -m 'rev_c_1_'

  $ hg update 'desc("rev_b_1_")'
  3 files updated, 0 files merged, 2 files removed, 0 files unresolved
  $ echo fo0-01 > dir_x/f2
  $ mkdir dir_z
  $ ls dir_z
  $ echo babar > dir_z/f1
  $ echo celeste > dir_z/f2
  $ echo foo > dir_z/f3
  $ hg add dir_z
  adding dir_z/f1
  adding dir_z/f2
  adding dir_z/f3
  $ hg ci -m 'rev_b_2_'

  $ hg update 'desc("rev_b_2_")'
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo f0o-01 > dir_x/f3
  $ echo zephir > dir_z/f1
  $ echo arthur > dir_z/f2
  $ hg ci -m 'rev_b_3_'

  $ hg update 'desc("rev_c_1_")'
  6 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ echo bar-02 > dir_y/f1
  $ echo ba9-01 > dir_y/f3
  $ echo bar > dir_z/f4
  $ hg add dir_z/
  adding dir_z/f4
  $ echo arthur > dir_z/f2
  $ hg ci -m 'rev_c_2_'

  $ hg update 'desc("rev_b_3_")'
  7 files updated, 0 files merged, 1 files removed, 0 files unresolved
  $ hg merge 'desc("rev_c_2_")'
  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ echo flore > dir_z/f1
  $ echo foo-04 > dir_x/f1
  $ echo foo-01 > dir_z/f3
  $ hg ci -m 'rev_d_0_'
  $ echo alexandre > dir_z/f1
  $ echo bar-01 > dir_z/f4
  $ echo bar-04 > dir_y/f1
  $ hg ci -m 'rev_d_1_'
  $ hg status
  $ hg status -A
  C dir_x/f1
  C dir_x/f2
  C dir_x/f3
  C dir_y/f1
  C dir_y/f2
  C dir_y/f3
  C dir_z/f1
  C dir_z/f2
  C dir_z/f3
  C dir_z/f4
  C readme.txt
  $ hg up null
  0 files updated, 0 files merged, 11 files removed, 0 files unresolved

Resulting graph

  $ hg log -GT "{rev}:{node|short}: {desc}\n  {files}\n"
  o  10:71e6a9c7a6a2: rev_d_1_
  |    dir_y/f1 dir_z/f1 dir_z/f4
  o    9:b0a0cbe5ce57: rev_d_0_
  |\     dir_x/f1 dir_z/f1 dir_z/f3
  | o  8:d04e01dcc82d: rev_c_2_
  | |    dir_y/f1 dir_y/f3 dir_z/f2 dir_z/f4
  o |  7:fc05b303b551: rev_b_3_
  | |    dir_x/f3 dir_z/f1 dir_z/f2
  o |  6:17fd34adb43b: rev_b_2_
  | |    dir_x/f2 dir_z/f1 dir_z/f2 dir_z/f3
  | o  5:fa05dbe8eed1: rev_c_1_
  | |    dir_z/f1 dir_z/f2
  | o  4:59b4258b00dc: rev_c_0_
  | |    dir_y/f1 dir_y/f2 dir_z/f1
  o |  3:328f8ced5276: rev_b_1_
  | |    dir_x/f1
  o |  2:0ccce83dd29b: rev_b_0_
  |/     dir_x/f1
  o  1:63f468a0fdac: rev_a_
  |    dir_x/f1 dir_x/f2 dir_x/f3 dir_y/f1 dir_y/f2 dir_y/f3
  o  0:4978c5c7386b: root
       readme.txt

Useful save useful nodes :

  $ hg log -T '{node}' > ../rev_c_2_ --rev 'desc("rev_c_2_")'
  $ hg log -T '{node}' > ../rev_b_3_ --rev 'desc("rev_b_3_")'

Reference output

Since we have the same file conent on each side, we should get a limited number
of file revision (and the associated linkrev).

This these shared file-revision and the associated linkrev computation is
fueling the complexity test in this file.

  $ cat > ../linkrev-check.sh << EOF
  > echo '# expected linkrev for dir_z/f1'
  > hg log -T '0 {rev}\n' --rev 'min(desc(rev_b_2_) or desc(rev_c_0_))'
  > hg log -T '1 {rev}\n' --rev 'min(desc(rev_b_3_) or desc(rev_c_1_))'
  > hg log -T '2 {rev}\n' --rev 'min(desc(rev_d_0_))'
  > hg log -T '3 {rev}\n' --rev 'min(desc(rev_d_1_))'
  > hg debugindex dir_z/f1
  > #   rev linkrev       nodeid    p1-nodeid    p2-nodeid
  > #     0       4 360afd990eef 000000000000 000000000000
  > #     1       5 7054ee088631 360afd990eef 000000000000
  > #     2       9 6bb290463f21 7054ee088631 000000000000
  > #     3      10 91fec784ff86 6bb290463f21 000000000000
  > echo '# expected linkrev for dir_z/f2'
  > hg log -T '0 {rev}\n' --rev 'min(desc(rev_c_1_) or desc(rev_b_2_))'
  > hg log -T '1 {rev}\n' --rev 'min(desc(rev_c_2_) or desc(rev_b_3_))'
  > hg debugindex dir_z/f2
  > #    rev linkrev       nodeid    p1-nodeid    p2-nodeid
  > #      0       5 093bb0f8a0fb 000000000000 000000000000
  > #      1       7 0f47e254cb19 093bb0f8a0fb 000000000000
  > if hg files --rev tip | grep dir_z/f3 > /dev/null; then
  >     echo '# expected linkrev for dir_z/f3'
  >     hg log -T '0 {rev}\n' --rev 'desc(rev_b_2_)'
  >     hg log -T '1 {rev}\n' --rev 'desc(rev_d_0_)'
  >     hg debugindex dir_z/f3
  >     #    rev linkrev       nodeid    p1-nodeid    p2-nodeid
  >     #      0       6 2ed2a3912a0b 000000000000 000000000000
  >     #      1       9 7c6d649320ae 2ed2a3912a0b 000000000000
  > fi
  > if hg files --rev tip | grep dir_z/f4 > /dev/null; then
  >     echo '# expected linkrev for dir_z/f4'
  >     hg log -T '0 {rev}\n' --rev 'desc(rev_c_2_)'
  >     hg log -T '1 {rev}\n' --rev 'desc(rev_d_1_)'
  >     hg debugindex dir_z/f4
  >     #   rev linkrev       nodeid    p1-nodeid    p2-nodeid
  >     #     0       8 b004912a8510 000000000000 000000000000
  >     #     1      10 9f85b3b95e70 b004912a8510 000000000000
  > fi
  > echo '# verify the repository'
  > hg verify
  > EOF
  $ sh ../linkrev-check.sh
  # expected linkrev for dir_z/f1
  0 4
  1 5
  2 9
  3 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 360afd990eef 000000000000 000000000000
       1       5 7054ee088631 360afd990eef 000000000000
       2       9 6bb290463f21 7054ee088631 000000000000
       3      10 91fec784ff86 6bb290463f21 000000000000
  # expected linkrev for dir_z/f2
  0 5
  1 7
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       5 093bb0f8a0fb 000000000000 000000000000
       1       7 0f47e254cb19 093bb0f8a0fb 000000000000
  # expected linkrev for dir_z/f3
  0 6
  1 9
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       6 2ed2a3912a0b 000000000000 000000000000
       1       9 7c6d649320ae 2ed2a3912a0b 000000000000
  # expected linkrev for dir_z/f4
  0 8
  1 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       8 b004912a8510 000000000000 000000000000
       1      10 9f85b3b95e70 b004912a8510 000000000000
  # verify the repository
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  checking dirstate
  checked 11 changesets with 27 changes to 11 files

  $ cd ..

Test linkrev computation for various widening scenario
======================================================

Having cloning all revisions initially
--------------------------------------

  $ hg clone --narrow ssh://user@dummy/server --include dir_x --include dir_y client_xy_rev_all  --noupdate
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 11 changesets with 16 changes to 6 files
  new changesets 4978c5c7386b:71e6a9c7a6a2
  $ cd client_xy_rev_all
  $ hg log -GT "{rev}:{node|short}: {desc}\n  {files}\n"
  o  10:71e6a9c7a6a2: rev_d_1_
  |    dir_y/f1 dir_z/f1 dir_z/f4
  o    9:b0a0cbe5ce57: rev_d_0_
  |\     dir_x/f1 dir_z/f1 dir_z/f3
  | o  8:d04e01dcc82d: rev_c_2_
  | |    dir_y/f1 dir_y/f3 dir_z/f2 dir_z/f4
  o |  7:fc05b303b551: rev_b_3_
  | |    dir_x/f3 dir_z/f1 dir_z/f2
  o |  6:17fd34adb43b: rev_b_2_
  | |    dir_x/f2 dir_z/f1 dir_z/f2 dir_z/f3
  | o  5:fa05dbe8eed1: rev_c_1_
  | |    dir_z/f1 dir_z/f2
  | o  4:59b4258b00dc: rev_c_0_
  | |    dir_y/f1 dir_y/f2 dir_z/f1
  o |  3:328f8ced5276: rev_b_1_
  | |    dir_x/f1
  o |  2:0ccce83dd29b: rev_b_0_
  |/     dir_x/f1
  o  1:63f468a0fdac: rev_a_
  |    dir_x/f1 dir_x/f2 dir_x/f3 dir_y/f1 dir_y/f2 dir_y/f3
  o  0:4978c5c7386b: root
       readme.txt

  $ hg tracked --addinclude dir_z
  comparing with ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 0 changesets with 10 changes to 4 files
  $ sh ../linkrev-check.sh
  # expected linkrev for dir_z/f1
  0 4
  1 5
  2 9
  3 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 360afd990eef 000000000000 000000000000
       1       5 7054ee088631 360afd990eef 000000000000
       2       9 6bb290463f21 7054ee088631 000000000000
       3      10 91fec784ff86 6bb290463f21 000000000000
  # expected linkrev for dir_z/f2
  0 5
  1 7
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       5 093bb0f8a0fb 000000000000 000000000000
       1       7 0f47e254cb19 093bb0f8a0fb 000000000000
  # expected linkrev for dir_z/f3
  0 6
  1 9
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       6 2ed2a3912a0b 000000000000 000000000000
       1       9 7c6d649320ae 2ed2a3912a0b 000000000000
  # expected linkrev for dir_z/f4
  0 8
  1 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       8 b004912a8510 000000000000 000000000000
       1      10 9f85b3b95e70 b004912a8510 000000000000
  # verify the repository
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  checking dirstate
  checked 11 changesets with 26 changes to 10 files
  $ cd ..


Having cloning all only branch b
--------------------------------

  $ hg clone --narrow ssh://user@dummy/server --rev `cat ./rev_b_3_` --include dir_x --include dir_y client_xy_rev_from_b_only  --noupdate
  adding changesets
  adding manifests
  adding file changes
  added 6 changesets with 10 changes to 6 files
  new changesets 4978c5c7386b:fc05b303b551
  $ cd client_xy_rev_from_b_only
  $ hg log -GT "{rev}:{node|short}: {desc}\n  {files}\n"
  o  5:fc05b303b551: rev_b_3_
  |    dir_x/f3 dir_z/f1 dir_z/f2
  o  4:17fd34adb43b: rev_b_2_
  |    dir_x/f2 dir_z/f1 dir_z/f2 dir_z/f3
  o  3:328f8ced5276: rev_b_1_
  |    dir_x/f1
  o  2:0ccce83dd29b: rev_b_0_
  |    dir_x/f1
  o  1:63f468a0fdac: rev_a_
  |    dir_x/f1 dir_x/f2 dir_x/f3 dir_y/f1 dir_y/f2 dir_y/f3
  o  0:4978c5c7386b: root
       readme.txt

  $ hg tracked --addinclude dir_z
  comparing with ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 0 changesets with 5 changes to 3 files
  $ sh ../linkrev-check.sh
  # expected linkrev for dir_z/f1
  0 4
  1 5
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 360afd990eef 000000000000 000000000000
       1       5 7054ee088631 360afd990eef 000000000000
  # expected linkrev for dir_z/f2
  0 4
  1 5
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 093bb0f8a0fb 000000000000 000000000000
       1       5 0f47e254cb19 093bb0f8a0fb 000000000000
  # expected linkrev for dir_z/f3
  0 4
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 2ed2a3912a0b 000000000000 000000000000
  # verify the repository
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  checking dirstate
  checked 6 changesets with 15 changes to 9 files
  $ cd ..


Having cloning all only branch c
--------------------------------

  $ hg clone --narrow ssh://user@dummy/server --rev `cat ./rev_c_2_` --include dir_x --include dir_y client_xy_rev_from_c_only --noupdate
  adding changesets
  adding manifests
  adding file changes
  added 5 changesets with 10 changes to 6 files
  new changesets 4978c5c7386b:d04e01dcc82d
  $ cd client_xy_rev_from_c_only
  $ hg log -GT "{rev}:{node|short}: {desc}\n  {files}\n"
  o  4:d04e01dcc82d: rev_c_2_
  |    dir_y/f1 dir_y/f3 dir_z/f2 dir_z/f4
  o  3:fa05dbe8eed1: rev_c_1_
  |    dir_z/f1 dir_z/f2
  o  2:59b4258b00dc: rev_c_0_
  |    dir_y/f1 dir_y/f2 dir_z/f1
  o  1:63f468a0fdac: rev_a_
  |    dir_x/f1 dir_x/f2 dir_x/f3 dir_y/f1 dir_y/f2 dir_y/f3
  o  0:4978c5c7386b: root
       readme.txt

  $ hg tracked --addinclude dir_z
  comparing with ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 0 changesets with 5 changes to 3 files
  $ sh ../linkrev-check.sh
  # expected linkrev for dir_z/f1
  0 2
  1 3
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       2 360afd990eef 000000000000 000000000000
       1       3 7054ee088631 360afd990eef 000000000000
  # expected linkrev for dir_z/f2
  0 3
  1 4
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       3 093bb0f8a0fb 000000000000 000000000000
       1       4 0f47e254cb19 093bb0f8a0fb 000000000000
  # expected linkrev for dir_z/f4
  0 4
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 b004912a8510 000000000000 000000000000
  # verify the repository
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  checking dirstate
  checked 5 changesets with 15 changes to 9 files
  $ cd ..

Having cloning all first branch b
---------------------------------

  $ hg clone --narrow ssh://user@dummy/server --rev `cat ./rev_b_3_` --include dir_x --include dir_y client_xy_rev_from_b_first  --noupdate
  adding changesets
  adding manifests
  adding file changes
  added 6 changesets with 10 changes to 6 files
  new changesets 4978c5c7386b:fc05b303b551
  $ cd client_xy_rev_from_b_first
  $ hg pull
  pulling from ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 5 changesets with 6 changes to 4 files
  new changesets 59b4258b00dc:71e6a9c7a6a2
  (run 'hg update' to get a working copy)
  $ hg log -GT "{rev}:{node|short}: {desc}\n  {files}\n"
  o  10:71e6a9c7a6a2: rev_d_1_
  |    dir_y/f1 dir_z/f1 dir_z/f4
  o    9:b0a0cbe5ce57: rev_d_0_
  |\     dir_x/f1 dir_z/f1 dir_z/f3
  | o  8:d04e01dcc82d: rev_c_2_
  | |    dir_y/f1 dir_y/f3 dir_z/f2 dir_z/f4
  | o  7:fa05dbe8eed1: rev_c_1_
  | |    dir_z/f1 dir_z/f2
  | o  6:59b4258b00dc: rev_c_0_
  | |    dir_y/f1 dir_y/f2 dir_z/f1
  o |  5:fc05b303b551: rev_b_3_
  | |    dir_x/f3 dir_z/f1 dir_z/f2
  o |  4:17fd34adb43b: rev_b_2_
  | |    dir_x/f2 dir_z/f1 dir_z/f2 dir_z/f3
  o |  3:328f8ced5276: rev_b_1_
  | |    dir_x/f1
  o |  2:0ccce83dd29b: rev_b_0_
  |/     dir_x/f1
  o  1:63f468a0fdac: rev_a_
  |    dir_x/f1 dir_x/f2 dir_x/f3 dir_y/f1 dir_y/f2 dir_y/f3
  o  0:4978c5c7386b: root
       readme.txt

  $ hg tracked --addinclude dir_z
  comparing with ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 0 changesets with 10 changes to 4 files
  $ sh ../linkrev-check.sh
  # expected linkrev for dir_z/f1
  0 4
  1 5
  2 9
  3 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       6 360afd990eef 000000000000 000000000000 (known-bad-output !)
       0       4 360afd990eef 000000000000 000000000000 (missing-correct-output !)
       1       7 7054ee088631 360afd990eef 000000000000 (known-bad-output !)
       1       5 7054ee088631 360afd990eef 000000000000 (missing-correct-output !)
       2       9 6bb290463f21 7054ee088631 000000000000
       3      10 91fec784ff86 6bb290463f21 000000000000
  # expected linkrev for dir_z/f2
  0 4
  1 5
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       7 093bb0f8a0fb 000000000000 000000000000 (known-bad-output !)
       0       4 093bb0f8a0fb 000000000000 000000000000 (missing-correct-output !)
       1       5 0f47e254cb19 093bb0f8a0fb 000000000000
  # expected linkrev for dir_z/f3
  0 4
  1 9
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 2ed2a3912a0b 000000000000 000000000000
       1       9 7c6d649320ae 2ed2a3912a0b 000000000000
  # expected linkrev for dir_z/f4
  0 8
  1 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       8 b004912a8510 000000000000 000000000000
       1      10 9f85b3b95e70 b004912a8510 000000000000
  # verify the repository
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  checking dirstate
  checked 11 changesets with 26 changes to 10 files
  $ cd ..


Having cloning all first branch c
---------------------------------

  $ hg clone --narrow ssh://user@dummy/server --rev `cat ./rev_c_2_` --include dir_x --include dir_y client_xy_rev_from_c_first --noupdate
  adding changesets
  adding manifests
  adding file changes
  added 5 changesets with 10 changes to 6 files
  new changesets 4978c5c7386b:d04e01dcc82d
  $ cd client_xy_rev_from_c_first
  $ hg pull
  pulling from ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 6 changesets with 6 changes to 4 files
  new changesets 0ccce83dd29b:71e6a9c7a6a2
  (run 'hg update' to get a working copy)
  $ hg log -GT "{rev}:{node|short}: {desc}\n  {files}\n"
  o  10:71e6a9c7a6a2: rev_d_1_
  |    dir_y/f1 dir_z/f1 dir_z/f4
  o    9:b0a0cbe5ce57: rev_d_0_
  |\     dir_x/f1 dir_z/f1 dir_z/f3
  | o  8:fc05b303b551: rev_b_3_
  | |    dir_x/f3 dir_z/f1 dir_z/f2
  | o  7:17fd34adb43b: rev_b_2_
  | |    dir_x/f2 dir_z/f1 dir_z/f2 dir_z/f3
  | o  6:328f8ced5276: rev_b_1_
  | |    dir_x/f1
  | o  5:0ccce83dd29b: rev_b_0_
  | |    dir_x/f1
  o |  4:d04e01dcc82d: rev_c_2_
  | |    dir_y/f1 dir_y/f3 dir_z/f2 dir_z/f4
  o |  3:fa05dbe8eed1: rev_c_1_
  | |    dir_z/f1 dir_z/f2
  o |  2:59b4258b00dc: rev_c_0_
  |/     dir_y/f1 dir_y/f2 dir_z/f1
  o  1:63f468a0fdac: rev_a_
  |    dir_x/f1 dir_x/f2 dir_x/f3 dir_y/f1 dir_y/f2 dir_y/f3
  o  0:4978c5c7386b: root
       readme.txt

  $ hg tracked --addinclude dir_z
  comparing with ssh://user@dummy/server
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 0 changesets with 10 changes to 4 files
  $ sh ../linkrev-check.sh
  # expected linkrev for dir_z/f1
  0 2
  1 3
  2 9
  3 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       2 360afd990eef 000000000000 000000000000
       1       3 7054ee088631 360afd990eef 000000000000
       2       9 6bb290463f21 7054ee088631 000000000000
       3      10 91fec784ff86 6bb290463f21 000000000000
  # expected linkrev for dir_z/f2
  0 3
  1 4
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       3 093bb0f8a0fb 000000000000 000000000000
       1       8 0f47e254cb19 093bb0f8a0fb 000000000000 (known-bad-output !)
       1       4 0f47e254cb19 093bb0f8a0fb 000000000000 (missing-correct-output !)
  # expected linkrev for dir_z/f3
  0 7
  1 9
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       7 2ed2a3912a0b 000000000000 000000000000
       1       9 7c6d649320ae 2ed2a3912a0b 000000000000
  # expected linkrev for dir_z/f4
  0 4
  1 10
     rev linkrev       nodeid    p1-nodeid    p2-nodeid
       0       4 b004912a8510 000000000000 000000000000
       1      10 9f85b3b95e70 b004912a8510 000000000000
  # verify the repository
  checking changesets
  checking manifests
  crosschecking files in changesets and manifests
  checking files
  checking dirstate
  checked 11 changesets with 26 changes to 10 files
  $ cd ..