diff options
Diffstat (limited to 'tests/test-hardlinks.t')
-rw-r--r-- | tests/test-hardlinks.t | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks.t new file mode 100644 index 0000000..65978e1 --- /dev/null +++ b/tests/test-hardlinks.t @@ -0,0 +1,352 @@ + $ "$TESTDIR/hghave" hardlink || exit 80 + + $ cat > nlinks.py <<EOF + > import sys + > from mercurial import util + > for f in sorted(sys.stdin.readlines()): + > f = f[:-1] + > print util.nlinks(f), f + > EOF + + $ nlinksdir() + > { + > find $1 -type f | python $TESTTMP/nlinks.py + > } + +Some implementations of cp can't create hardlinks (replaces 'cp -al' on Linux): + + $ cat > linkcp.py <<EOF + > from mercurial import util + > import sys + > util.copyfiles(sys.argv[1], sys.argv[2], hardlink=True) + > EOF + + $ linkcp() + > { + > python $TESTTMP/linkcp.py $1 $2 + > } + +Prepare repo r1: + + $ hg init r1 + $ 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 + 1 r1/.hg/store/fncache + 1 r1/.hg/store/phaseroots + 1 r1/.hg/store/undo + 1 r1/.hg/store/undo.phaseroots + + +Create hardlinked clone r2: + + $ hg clone -U --debug r1 r2 + linked 7 files + listing keys for "bookmarks" + +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 + 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 + 2 r1/.hg/store/fncache + 1 r1/.hg/store/phaseroots + 1 r1/.hg/store/undo + 1 r1/.hg/store/undo.phaseroots + + $ 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 + 2 r2/.hg/store/fncache + +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 + 1 r3/.hg/store/fncache + 1 r3/.hg/store/phaseroots + 1 r3/.hg/store/undo + 1 r3/.hg/store/undo.phaseroots + + +Create a non-inlined filelog in r3: + + $ cd r3/d1 + >>> f = open('data1', 'wb') + >>> for x in range(10000): + ... f.write("%s\n" % str(x)) + >>> f.close() + $ 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 + 1 r3/.hg/store/fncache + 1 r3/.hg/store/phaseroots + 1 r3/.hg/store/undo + 1 r3/.hg/store/undo.phaseroots + +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 + pushing to $TESTTMP/r1 (glob) + 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 + 1 r2/.hg/store/fncache + + $ 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 + 1 r2/.hg/store/fncache + + + $ cd r3 + $ hg tip --template '{rev}:{node|short}\n' + 11:a6451b6bc41f + $ echo bla > f1 + $ hg ci -m1 + $ cd .. + +Create hardlinked copy r4 of r3 (on Linux, we would call 'cp -al'): + + $ linkcp r3 r4 + +r4 has hardlinks in the working dir (not just inside .hg): + + $ nlinksdir r4 + 2 r4/.hg/00changelog.i + 2 r4/.hg/branch + 2 r4/.hg/cache/branchheads + 2 r4/.hg/cache/tags + 2 r4/.hg/dirstate + 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 + 2 r4/.hg/store/fncache + 2 r4/.hg/store/phaseroots + 2 r4/.hg/store/undo + 2 r4/.hg/store/undo.phaseroots + 2 r4/.hg/undo.bookmarks + 2 r4/.hg/undo.branch + 2 r4/.hg/undo.desc + 2 r4/.hg/undo.dirstate + 2 r4/d1/data1 + 2 r4/d1/f2 + 2 r4/f1 + +Update back to revision 11 in r4 should break hardlink of file f1: + + $ hg -R r4 up 11 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ nlinksdir r4 + 2 r4/.hg/00changelog.i + 1 r4/.hg/branch + 2 r4/.hg/cache/branchheads + 2 r4/.hg/cache/tags + 1 r4/.hg/dirstate + 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 + 2 r4/.hg/store/fncache + 2 r4/.hg/store/phaseroots + 2 r4/.hg/store/undo + 2 r4/.hg/store/undo.phaseroots + 2 r4/.hg/undo.bookmarks + 2 r4/.hg/undo.branch + 2 r4/.hg/undo.desc + 2 r4/.hg/undo.dirstate + 2 r4/d1/data1 + 2 r4/d1/f2 + 1 r4/f1 + + +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 + + $ cd .. |