test-hardlinks.t
431 lines
| 9.8 KiB
| text/troff
|
Tads3Lexer
/ tests / test-hardlinks.t
|
r37356 | #require hardlink reporevlogstore | ||
|
r16971 | |||
|
r12967 | $ cat > nlinks.py <<EOF | ||
|
r33687 | > from __future__ import print_function | ||
|
r16918 | > import sys | ||
> from mercurial import util | ||||
|
r12967 | > for f in sorted(sys.stdin.readlines()): | ||
> f = f[:-1] | ||||
|
r33687 | > print(util.nlinks(f), f) | ||
|
r12967 | > EOF | ||
$ nlinksdir() | ||||
> { | ||||
|
r32940 | > find "$@" -type f | $PYTHON $TESTTMP/nlinks.py | ||
|
r12967 | > } | ||
|
r13019 | Some implementations of cp can't create hardlinks (replaces 'cp -al' on Linux): | ||
$ cat > linkcp.py <<EOF | ||||
|
r33960 | > from __future__ import absolute_import | ||
> import sys | ||||
|
r13019 | > from mercurial import util | ||
> util.copyfiles(sys.argv[1], sys.argv[2], hardlink=True) | ||||
> EOF | ||||
$ linkcp() | ||||
> { | ||||
|
r32940 | > $PYTHON $TESTTMP/linkcp.py $1 $2 | ||
|
r13019 | > } | ||
|
r12967 | Prepare repo r1: | ||
|
r13956 | $ hg init r1 | ||
|
r12967 | $ cd r1 | ||
$ echo c1 > f1 | ||||
$ hg add f1 | ||||
$ hg ci -m0 | ||||
$ mkdir d1 | ||||
$ cd d1 | ||||
$ echo c2 > f2 | ||||
$ hg add f2 | ||||
$ hg ci -m1 | ||||
$ cd ../.. | ||||
$ nlinksdir r1/.hg/store | ||||
1 r1/.hg/store/00changelog.i | ||||
1 r1/.hg/store/00manifest.i | ||||
1 r1/.hg/store/data/d1/f2.i | ||||
1 r1/.hg/store/data/f1.i | ||||
|
r37433 | 1 r1/.hg/store/fncache (repofncache !) | ||
|
r15483 | 1 r1/.hg/store/phaseroots | ||
|
r12967 | 1 r1/.hg/store/undo | ||
|
r37433 | 1 r1/.hg/store/undo.backup.fncache (repofncache !) | ||
|
r23904 | 1 r1/.hg/store/undo.backupfiles | ||
|
r15455 | 1 r1/.hg/store/undo.phaseroots | ||
|
r12967 | |||
Create hardlinked clone r2: | ||||
|
r25125 | $ hg clone -U --debug r1 r2 --config progress.debug=true | ||
|
r24440 | linking: 1 | ||
linking: 2 | ||||
linking: 3 | ||||
linking: 4 | ||||
linking: 5 | ||||
linking: 6 | ||||
linking: 7 | ||||
|
r12967 | linked 7 files | ||
Create non-hardlinked clone r3: | ||||
$ hg clone --pull r1 r3 | ||||
requesting all changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 2 changesets with 2 changes to 2 files | ||||
|
r34662 | new changesets 40d85e9847f2:7069c422939c | ||
|
r12967 | updating to branch default | ||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
Repos r1 and r2 should now contain hardlinked files: | ||||
$ nlinksdir r1/.hg/store | ||||
2 r1/.hg/store/00changelog.i | ||||
2 r1/.hg/store/00manifest.i | ||||
2 r1/.hg/store/data/d1/f2.i | ||||
2 r1/.hg/store/data/f1.i | ||||
|
r37433 | 2 r1/.hg/store/fncache (repofncache !) | ||
|
r15483 | 1 r1/.hg/store/phaseroots | ||
|
r12967 | 1 r1/.hg/store/undo | ||
|
r37433 | 1 r1/.hg/store/undo.backup.fncache (repofncache !) | ||
|
r23904 | 1 r1/.hg/store/undo.backupfiles | ||
|
r15455 | 1 r1/.hg/store/undo.phaseroots | ||
|
r12967 | |||
$ nlinksdir r2/.hg/store | ||||
2 r2/.hg/store/00changelog.i | ||||
2 r2/.hg/store/00manifest.i | ||||
2 r2/.hg/store/data/d1/f2.i | ||||
2 r2/.hg/store/data/f1.i | ||||
|
r37433 | 2 r2/.hg/store/fncache (repofncache !) | ||
|
r12967 | |||
Repo r3 should not be hardlinked: | ||||
$ nlinksdir r3/.hg/store | ||||
1 r3/.hg/store/00changelog.i | ||||
1 r3/.hg/store/00manifest.i | ||||
1 r3/.hg/store/data/d1/f2.i | ||||
1 r3/.hg/store/data/f1.i | ||||
|
r37433 | 1 r3/.hg/store/fncache (repofncache !) | ||
|
r15659 | 1 r3/.hg/store/phaseroots | ||
|
r12967 | 1 r3/.hg/store/undo | ||
|
r23904 | 1 r3/.hg/store/undo.backupfiles | ||
|
r15455 | 1 r3/.hg/store/undo.phaseroots | ||
|
r12967 | |||
Create a non-inlined filelog in r3: | ||||
$ cd r3/d1 | ||||
|
r16918 | >>> f = open('data1', 'wb') | ||
>>> for x in range(10000): | ||||
|
r38097 | ... f.write(b"%d\n" % x) and None | ||
|
r16918 | >>> f.close() | ||
|
r12967 | $ for j in 0 1 2 3 4 5 6 7 8 9; do | ||
> cat data1 >> f2 | ||||
> hg commit -m$j | ||||
> done | ||||
$ cd ../.. | ||||
$ nlinksdir r3/.hg/store | ||||
1 r3/.hg/store/00changelog.i | ||||
1 r3/.hg/store/00manifest.i | ||||
1 r3/.hg/store/data/d1/f2.d | ||||
1 r3/.hg/store/data/d1/f2.i | ||||
1 r3/.hg/store/data/f1.i | ||||
|
r37433 | 1 r3/.hg/store/fncache (repofncache !) | ||
|
r15483 | 1 r3/.hg/store/phaseroots | ||
|
r12967 | 1 r3/.hg/store/undo | ||
|
r37433 | 1 r3/.hg/store/undo.backup.fncache (repofncache !) | ||
|
r23904 | 1 r3/.hg/store/undo.backup.phaseroots | ||
1 r3/.hg/store/undo.backupfiles | ||||
|
r15455 | 1 r3/.hg/store/undo.phaseroots | ||
|
r12967 | |||
Push to repo r1 should break up most hardlinks in r2: | ||||
$ hg -R r2 verify | ||||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
2 files, 2 changesets, 2 total revisions | ||||
$ cd r3 | ||||
$ hg push | ||||
|
r35394 | pushing to $TESTTMP/r1 | ||
|
r12967 | searching for changes | ||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 10 changesets with 10 changes to 1 files | ||||
$ cd .. | ||||
$ nlinksdir r2/.hg/store | ||||
1 r2/.hg/store/00changelog.i | ||||
1 r2/.hg/store/00manifest.i | ||||
1 r2/.hg/store/data/d1/f2.i | ||||
2 r2/.hg/store/data/f1.i | ||||
|
r37433 | [12] r2/\.hg/store/fncache (re) (repofncache !) | ||
|
r12967 | |||
|
r37433 | #if hardlink-whitelisted repofncache | ||
|
r32294 | $ nlinksdir r2/.hg/store/fncache | ||
2 r2/.hg/store/fncache | ||||
#endif | ||||
|
r12967 | $ hg -R r2 verify | ||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
2 files, 2 changesets, 2 total revisions | ||||
$ cd r1 | ||||
$ hg up | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
Committing a change to f1 in r1 must break up hardlink f1.i in r2: | ||||
$ echo c1c1 >> f1 | ||||
$ hg ci -m00 | ||||
$ cd .. | ||||
$ nlinksdir r2/.hg/store | ||||
1 r2/.hg/store/00changelog.i | ||||
1 r2/.hg/store/00manifest.i | ||||
1 r2/.hg/store/data/d1/f2.i | ||||
1 r2/.hg/store/data/f1.i | ||||
|
r37433 | [12] r2/\.hg/store/fncache (re) (repofncache !) | ||
|
r12967 | |||
|
r37433 | #if hardlink-whitelisted repofncache | ||
|
r32294 | $ nlinksdir r2/.hg/store/fncache | ||
2 r2/.hg/store/fncache | ||||
#endif | ||||
|
r13019 | |||
|
r32721 | Create a file which exec permissions we will change | ||
$ cd r3 | ||||
$ echo "echo hello world" > f3 | ||||
$ hg add f3 | ||||
$ hg ci -mf3 | ||||
$ cd .. | ||||
|
r13019 | $ cd r3 | ||
$ hg tip --template '{rev}:{node|short}\n' | ||||
|
r32721 | 12:d3b77733a28a | ||
|
r13019 | $ echo bla > f1 | ||
|
r32721 | $ chmod +x f3 | ||
|
r13019 | $ hg ci -m1 | ||
$ cd .. | ||||
Create hardlinked copy r4 of r3 (on Linux, we would call 'cp -al'): | ||||
$ linkcp r3 r4 | ||||
|
r32295 | 'checklink' is produced by hardlinking a symlink, which is undefined whether | ||
the symlink should be followed or not. It does behave differently on Linux and | ||||
BSD. Just remove it so the test pass on both platforms. | ||||
$ rm -f r4/.hg/cache/checklink | ||||
|
r13019 | r4 has hardlinks in the working dir (not just inside .hg): | ||
$ nlinksdir r4 | ||||
2 r4/.hg/00changelog.i | ||||
2 r4/.hg/branch | ||||
|
r32304 | 2 r4/.hg/cache/branch2-base | ||
2 r4/.hg/cache/branch2-served | ||||
|
r31830 | 2 r4/.hg/cache/checkisexec (execbit !) | ||
? r4/.hg/cache/checklink-target (glob) (symlink !) | ||||
2 r4/.hg/cache/checknoexec (execbit !) | ||||
|
r38803 | 2 r4/.hg/cache/manifestfulltextcache | ||
|
r23786 | 2 r4/.hg/cache/rbc-names-v1 | ||
2 r4/.hg/cache/rbc-revs-v1 | ||||
|
r13019 | 2 r4/.hg/dirstate | ||
|
r33427 | 2 r4/.hg/fsmonitor.state (fsmonitor !) | ||
|
r13019 | 2 r4/.hg/hgrc | ||
2 r4/.hg/last-message.txt | ||||
2 r4/.hg/requires | ||||
2 r4/.hg/store/00changelog.i | ||||
2 r4/.hg/store/00manifest.i | ||||
2 r4/.hg/store/data/d1/f2.d | ||||
2 r4/.hg/store/data/d1/f2.i | ||||
2 r4/.hg/store/data/f1.i | ||||
|
r32721 | 2 r4/.hg/store/data/f3.i | ||
|
r37433 | 2 r4/.hg/store/fncache (repofncache !) | ||
|
r15483 | 2 r4/.hg/store/phaseroots | ||
|
r13019 | 2 r4/.hg/store/undo | ||
|
r37433 | 2 r4/.hg/store/undo.backup.fncache (repofncache !) | ||
|
r23904 | 2 r4/.hg/store/undo.backup.phaseroots | ||
2 r4/.hg/store/undo.backupfiles | ||||
|
r15455 | 2 r4/.hg/store/undo.phaseroots | ||
|
r31577 | [24] r4/\.hg/undo\.backup\.dirstate (re) | ||
|
r14266 | 2 r4/.hg/undo.bookmarks | ||
|
r13019 | 2 r4/.hg/undo.branch | ||
2 r4/.hg/undo.desc | ||||
|
r31577 | [24] r4/\.hg/undo\.dirstate (re) | ||
|
r13019 | 2 r4/d1/data1 | ||
2 r4/d1/f2 | ||||
2 r4/f1 | ||||
|
r32721 | 2 r4/f3 | ||
|
r13019 | |||
|
r32721 | Update back to revision 12 in r4 should break hardlink of file f1 and f3: | ||
|
r32294 | #if hardlink-whitelisted | ||
$ nlinksdir r4/.hg/undo.backup.dirstate r4/.hg/undo.dirstate | ||||
4 r4/.hg/undo.backup.dirstate | ||||
4 r4/.hg/undo.dirstate | ||||
#endif | ||||
|
r13019 | |||
|
r32721 | $ hg -R r4 up 12 | ||
|
r32780 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (execbit !) | ||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-execbit !) | ||||
|
r13019 | |||
$ nlinksdir r4 | ||||
2 r4/.hg/00changelog.i | ||||
1 r4/.hg/branch | ||||
|
r32304 | 2 r4/.hg/cache/branch2-base | ||
2 r4/.hg/cache/branch2-served | ||||
|
r31830 | 2 r4/.hg/cache/checkisexec (execbit !) | ||
2 r4/.hg/cache/checklink-target (symlink !) | ||||
2 r4/.hg/cache/checknoexec (execbit !) | ||||
|
r38803 | 2 r4/.hg/cache/manifestfulltextcache | ||
|
r23786 | 2 r4/.hg/cache/rbc-names-v1 | ||
2 r4/.hg/cache/rbc-revs-v1 | ||||
|
r13019 | 1 r4/.hg/dirstate | ||
|
r33427 | 1 r4/.hg/fsmonitor.state (fsmonitor !) | ||
|
r13019 | 2 r4/.hg/hgrc | ||
2 r4/.hg/last-message.txt | ||||
2 r4/.hg/requires | ||||
2 r4/.hg/store/00changelog.i | ||||
2 r4/.hg/store/00manifest.i | ||||
2 r4/.hg/store/data/d1/f2.d | ||||
2 r4/.hg/store/data/d1/f2.i | ||||
2 r4/.hg/store/data/f1.i | ||||
|
r32721 | 2 r4/.hg/store/data/f3.i | ||
|
r13019 | 2 r4/.hg/store/fncache | ||
|
r15483 | 2 r4/.hg/store/phaseroots | ||
|
r13019 | 2 r4/.hg/store/undo | ||
|
r37433 | 2 r4/.hg/store/undo.backup.fncache (repofncache !) | ||
|
r23904 | 2 r4/.hg/store/undo.backup.phaseroots | ||
2 r4/.hg/store/undo.backupfiles | ||||
|
r15455 | 2 r4/.hg/store/undo.phaseroots | ||
|
r31577 | [24] r4/\.hg/undo\.backup\.dirstate (re) | ||
|
r14266 | 2 r4/.hg/undo.bookmarks | ||
|
r13019 | 2 r4/.hg/undo.branch | ||
2 r4/.hg/undo.desc | ||||
|
r31577 | [24] r4/\.hg/undo\.dirstate (re) | ||
|
r13019 | 2 r4/d1/data1 | ||
2 r4/d1/f2 | ||||
1 r4/f1 | ||||
|
r32780 | 1 r4/f3 (execbit !) | ||
2 r4/f3 (no-execbit !) | ||||
|
r13019 | |||
|
r32294 | #if hardlink-whitelisted | ||
$ nlinksdir r4/.hg/undo.backup.dirstate r4/.hg/undo.dirstate | ||||
4 r4/.hg/undo.backup.dirstate | ||||
4 r4/.hg/undo.dirstate | ||||
#endif | ||||
|
r13034 | |||
Test hardlinking outside hg: | ||||
$ mkdir x | ||||
$ echo foo > x/a | ||||
$ linkcp x y | ||||
$ echo bar >> y/a | ||||
No diff if hardlink: | ||||
$ diff x/a y/a | ||||
Test mq hardlinking: | ||||
$ echo "[extensions]" >> $HGRCPATH | ||||
$ echo "mq=" >> $HGRCPATH | ||||
$ hg init a | ||||
$ cd a | ||||
$ hg qimport -n foo - << EOF | ||||
> # HG changeset patch | ||||
> # Date 1 0 | ||||
> diff -r 2588a8b53d66 a | ||||
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | ||||
> +++ b/a Wed Jul 23 15:54:29 2008 +0200 | ||||
> @@ -0,0 +1,1 @@ | ||||
> +a | ||||
> EOF | ||||
adding foo to series file | ||||
$ hg qpush | ||||
applying foo | ||||
now at: foo | ||||
$ cd .. | ||||
$ linkcp a b | ||||
$ cd b | ||||
$ hg qimport -n bar - << EOF | ||||
> # HG changeset patch | ||||
> # Date 2 0 | ||||
> diff -r 2588a8b53d66 a | ||||
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | ||||
> +++ b/b Wed Jul 23 15:54:29 2008 +0200 | ||||
> @@ -0,0 +1,1 @@ | ||||
> +b | ||||
> EOF | ||||
adding bar to series file | ||||
$ hg qpush | ||||
applying bar | ||||
now at: bar | ||||
$ cat .hg/patches/status | ||||
430ed4828a74fa4047bc816a25500f7472ab4bfe:foo | ||||
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c:bar | ||||
$ cat .hg/patches/series | ||||
foo | ||||
bar | ||||
$ cat ../a/.hg/patches/status | ||||
430ed4828a74fa4047bc816a25500f7472ab4bfe:foo | ||||
$ cat ../a/.hg/patches/series | ||||
foo | ||||
Test tags hardlinking: | ||||
$ hg qdel -r qbase:qtip | ||||
patch foo finalized without changeset message | ||||
patch bar finalized without changeset message | ||||
$ hg tag -l lfoo | ||||
$ hg tag foo | ||||
$ cd .. | ||||
$ linkcp b c | ||||
$ cd c | ||||
$ hg tag -l -r 0 lbar | ||||
$ hg tag -r 0 bar | ||||
$ cat .hgtags | ||||
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo | ||||
430ed4828a74fa4047bc816a25500f7472ab4bfe bar | ||||
$ cat .hg/localtags | ||||
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo | ||||
430ed4828a74fa4047bc816a25500f7472ab4bfe lbar | ||||
$ cat ../b/.hgtags | ||||
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo | ||||
$ cat ../b/.hg/localtags | ||||
4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo | ||||
|
r16913 | $ cd .. | ||