narrow: add a test for linkrev computation done during widen
authorPierre-Yves David <pierre-yves.david@octobus.net>
Wed, 06 Sep 2023 18:23:32 +0200
changeset 51632 9c668377aa9f
parent 51631 bf1d26bd5b6a
child 51642 69c5f8d6c710
narrow: add a test for linkrev computation done during widen This new tests show that the linkrev computed and sent by the server might end up being wrong during a widen operation.
tests/test-narrow-widen-linkrev-computation.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-narrow-widen-linkrev-computation.t	Wed Sep 06 18:23:32 2023 +0200
@@ -0,0 +1,627 @@
+==============================================================================================
+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 ..