diff options
Diffstat (limited to 'tests/test-largefiles.t')
-rw-r--r-- | tests/test-largefiles.t | 1447 |
1 files changed, 1447 insertions, 0 deletions
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t new file mode 100644 index 0000000..c64dd73 --- /dev/null +++ b/tests/test-largefiles.t @@ -0,0 +1,1447 @@ + $ USERCACHE="$TESTTMP/cache"; export USERCACHE + $ mkdir "${USERCACHE}" + $ cat >> $HGRCPATH <<EOF + > [extensions] + > largefiles= + > purge= + > rebase= + > transplant= + > [phases] + > publish=False + > [largefiles] + > minsize=2 + > patterns=glob:**.dat + > usercache=${USERCACHE} + > [hooks] + > precommit=sh -c "echo \"Invoking status precommit hook\"; hg status" + > EOF + +Create the repo with a couple of revisions of both large and normal +files, testing that status correctly shows largefiles and that summary output +is correct. + + $ hg init a + $ cd a + $ mkdir sub + $ echo normal1 > normal1 + $ echo normal2 > sub/normal2 + $ echo large1 > large1 + $ echo large2 > sub/large2 + $ hg add normal1 sub/normal2 + $ hg add --large large1 sub/large2 + $ hg commit -m "add files" + Invoking status precommit hook + A large1 + A normal1 + A sub/large2 + A sub/normal2 + $ echo normal11 > normal1 + $ echo normal22 > sub/normal2 + $ echo large11 > large1 + $ echo large22 > sub/large2 + $ hg commit -m "edit files" + Invoking status precommit hook + M large1 + M normal1 + M sub/large2 + M sub/normal2 + $ hg sum --large + parent: 1:ce8896473775 tip + edit files + branch: default + commit: (clean) + update: (current) + largefiles: No remote repo + +Commit preserved largefile contents. + + $ cat normal1 + normal11 + $ cat large1 + large11 + $ cat sub/normal2 + normal22 + $ cat sub/large2 + large22 + +Test status, subdir and unknown files + + $ echo unknown > sub/unknown + $ hg st --all + ? sub/unknown + C large1 + C normal1 + C sub/large2 + C sub/normal2 + $ hg st --all sub + ? sub/unknown + C sub/large2 + C sub/normal2 + $ rm sub/unknown + +Remove both largefiles and normal files. + + $ hg remove normal1 large1 + $ hg status large1 + R large1 + $ hg commit -m "remove files" + Invoking status precommit hook + R large1 + R normal1 + $ ls + sub + $ echo "testlargefile" > large1-test + $ hg add --large large1-test + $ hg st + A large1-test + $ hg rm large1-test + not removing large1-test: file has been marked for add (use forget to undo) + $ hg st + A large1-test + $ hg forget large1-test + $ hg st + ? large1-test + $ rm large1-test + +Copy both largefiles and normal files (testing that status output is correct). + + $ hg cp sub/normal2 normal1 + $ hg cp sub/large2 large1 + $ hg commit -m "copy files" + Invoking status precommit hook + A large1 + A normal1 + $ cat normal1 + normal22 + $ cat large1 + large22 + +Test moving largefiles and verify that normal files are also unaffected. + + $ hg mv normal1 normal3 + $ hg mv large1 large3 + $ hg mv sub/normal2 sub/normal4 + $ hg mv sub/large2 sub/large4 + $ hg commit -m "move files" + Invoking status precommit hook + A large3 + A normal3 + A sub/large4 + A sub/normal4 + R large1 + R normal1 + R sub/large2 + R sub/normal2 + $ cat normal3 + normal22 + $ cat large3 + large22 + $ cat sub/normal4 + normal22 + $ cat sub/large4 + large22 + +Test copies and moves from a directory other than root (issue3516) + + $ cd .. + $ hg init lf_cpmv + $ cd lf_cpmv + $ mkdir dira + $ mkdir dira/dirb + $ touch dira/dirb/largefile + $ hg add --large dira/dirb/largefile + $ hg commit -m "added" + Invoking status precommit hook + A dira/dirb/largefile + $ cd dira + $ hg cp dirb/largefile foo/largefile + $ hg ci -m "deep copy" + Invoking status precommit hook + A dira/foo/largefile + $ find . | sort + . + ./dirb + ./dirb/largefile + ./foo + ./foo/largefile + $ hg mv foo/largefile baz/largefile + $ hg ci -m "moved" + Invoking status precommit hook + A dira/baz/largefile + R dira/foo/largefile + $ find . | sort + . + ./baz + ./baz/largefile + ./dirb + ./dirb/largefile + ./foo + $ cd ../../a + +#if hgweb +Test display of largefiles in hgweb + + $ hg serve -d -p $HGPORT --pid-file ../hg.pid + $ cat ../hg.pid >> $DAEMON_PIDS + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/?style=raw' + 200 Script output follows + + + drwxr-xr-x sub + -rw-r--r-- 41 large3 + -rw-r--r-- 9 normal3 + + + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/sub/?style=raw' + 200 Script output follows + + + -rw-r--r-- 41 large4 + -rw-r--r-- 9 normal4 + + + $ "$TESTDIR/killdaemons.py" +#endif + +Test archiving the various revisions. These hit corner cases known with +archiving. + + $ hg archive -r 0 ../archive0 + $ hg archive -r 1 ../archive1 + $ hg archive -r 2 ../archive2 + $ hg archive -r 3 ../archive3 + $ hg archive -r 4 ../archive4 + $ cd ../archive0 + $ cat normal1 + normal1 + $ cat large1 + large1 + $ cat sub/normal2 + normal2 + $ cat sub/large2 + large2 + $ cd ../archive1 + $ cat normal1 + normal11 + $ cat large1 + large11 + $ cat sub/normal2 + normal22 + $ cat sub/large2 + large22 + $ cd ../archive2 + $ ls + sub + $ cat sub/normal2 + normal22 + $ cat sub/large2 + large22 + $ cd ../archive3 + $ cat normal1 + normal22 + $ cat large1 + large22 + $ cat sub/normal2 + normal22 + $ cat sub/large2 + large22 + $ cd ../archive4 + $ cat normal3 + normal22 + $ cat large3 + large22 + $ cat sub/normal4 + normal22 + $ cat sub/large4 + large22 + +Commit corner case: specify files to commit. + + $ cd ../a + $ echo normal3 > normal3 + $ echo large3 > large3 + $ echo normal4 > sub/normal4 + $ echo large4 > sub/large4 + $ hg commit normal3 large3 sub/normal4 sub/large4 -m "edit files again" + Invoking status precommit hook + M large3 + M normal3 + M sub/large4 + M sub/normal4 + $ cat normal3 + normal3 + $ cat large3 + large3 + $ cat sub/normal4 + normal4 + $ cat sub/large4 + large4 + +One more commit corner case: commit from a subdirectory. + + $ cd ../a + $ echo normal33 > normal3 + $ echo large33 > large3 + $ echo normal44 > sub/normal4 + $ echo large44 > sub/large4 + $ cd sub + $ hg commit -m "edit files yet again" + Invoking status precommit hook + M large3 + M normal3 + M sub/large4 + M sub/normal4 + $ cat ../normal3 + normal33 + $ cat ../large3 + large33 + $ cat normal4 + normal44 + $ cat large4 + large44 + +Committing standins is not allowed. + + $ cd .. + $ echo large3 > large3 + $ hg commit .hglf/large3 -m "try to commit standin" + abort: file ".hglf/large3" is a largefile standin + (commit the largefile itself instead) + [255] + +Corner cases for adding largefiles. + + $ echo large5 > large5 + $ hg add --large large5 + $ hg add --large large5 + large5 already a largefile + $ mkdir sub2 + $ echo large6 > sub2/large6 + $ echo large7 > sub2/large7 + $ hg add --large sub2 + adding sub2/large6 as a largefile (glob) + adding sub2/large7 as a largefile (glob) + $ hg st + M large3 + A large5 + A sub2/large6 + A sub2/large7 + +Test "hg status" with combination of 'file pattern' and 'directory +pattern' for largefiles: + + $ hg status sub2/large6 sub2 + A sub2/large6 + A sub2/large7 + +Config settings (pattern **.dat, minsize 2 MB) are respected. + + $ echo testdata > test.dat + $ dd bs=1k count=2k if=/dev/zero of=reallylarge > /dev/null 2> /dev/null + $ hg add + adding reallylarge as a largefile + adding test.dat as a largefile + +Test that minsize and --lfsize handle float values; +also tests that --lfsize overrides largefiles.minsize. +(0.250 MB = 256 kB = 262144 B) + + $ dd if=/dev/zero of=ratherlarge bs=1024 count=256 > /dev/null 2> /dev/null + $ dd if=/dev/zero of=medium bs=1024 count=128 > /dev/null 2> /dev/null + $ hg --config largefiles.minsize=.25 add + adding ratherlarge as a largefile + adding medium + $ hg forget medium + $ hg --config largefiles.minsize=.25 add --lfsize=.125 + adding medium as a largefile + $ dd if=/dev/zero of=notlarge bs=1024 count=127 > /dev/null 2> /dev/null + $ hg --config largefiles.minsize=.25 add --lfsize=.125 + adding notlarge + $ hg forget notlarge + +Test forget on largefiles. + + $ hg forget large3 large5 test.dat reallylarge ratherlarge medium + $ hg commit -m "add/edit more largefiles" + Invoking status precommit hook + A sub2/large6 + A sub2/large7 + R large3 + ? large5 + ? medium + ? notlarge + ? ratherlarge + ? reallylarge + ? test.dat + $ hg st + ? large3 + ? large5 + ? medium + ? notlarge + ? ratherlarge + ? reallylarge + ? test.dat + +Purge with largefiles: verify that largefiles are still in the working +dir after a purge. + + $ hg purge --all + $ cat sub/large4 + large44 + $ cat sub2/large6 + large6 + $ cat sub2/large7 + large7 + +Test addremove: verify that files that should be added as largfiles are added as +such and that already-existing largfiles are not added as normal files by +accident. + + $ rm normal3 + $ rm sub/large4 + $ echo "testing addremove with patterns" > testaddremove.dat + $ echo "normaladdremove" > normaladdremove + $ hg addremove + removing sub/large4 + adding testaddremove.dat as a largefile + removing normal3 + adding normaladdremove + +Test addremove with -R + + $ hg up -C + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 1 largefiles updated, 0 removed + $ rm normal3 + $ rm sub/large4 + $ echo "testing addremove with patterns" > testaddremove.dat + $ echo "normaladdremove" > normaladdremove + $ cd .. + $ hg -R a addremove + removing sub/large4 + adding a/testaddremove.dat as a largefile (glob) + removing normal3 + adding normaladdremove + $ cd a + +Test 3364 + $ hg clone . ../addrm + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + $ cd ../addrm + $ cat >> .hg/hgrc <<EOF + > [hooks] + > post-commit.stat=sh -c "echo \"Invoking status postcommit hook\"; hg status -A" + > EOF + $ touch foo + $ hg add --large foo + $ hg ci -m "add foo" + Invoking status precommit hook + A foo + Invoking status postcommit hook + C foo + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + $ rm foo + $ hg st + ! foo +hmm.. no precommit invoked, but there is a postcommit?? + $ hg ci -m "will not checkin" + nothing changed + Invoking status postcommit hook + ! foo + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + [1] + $ hg addremove + removing foo + $ hg st + R foo + $ hg ci -m "used to say nothing changed" + Invoking status precommit hook + R foo + Invoking status postcommit hook + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + $ hg st + +Test 3507 (both normal files and largefiles were a problem) + + $ touch normal + $ touch large + $ hg add normal + $ hg add --large large + $ hg ci -m "added" + Invoking status precommit hook + A large + A normal + Invoking status postcommit hook + C large + C normal + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + $ hg remove normal + $ hg addremove --traceback + $ hg ci -m "addremoved normal" + Invoking status precommit hook + R normal + Invoking status postcommit hook + C large + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + $ hg up -C '.^' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 0 largefiles updated, 0 removed + $ hg remove large + $ hg addremove --traceback + $ hg ci -m "removed large" + Invoking status precommit hook + R large + created new head + Invoking status postcommit hook + C normal + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + +Test that a standin can't be added as a large file + + $ touch large + $ hg add --large large + $ hg ci -m "add" + Invoking status precommit hook + A large + Invoking status postcommit hook + C large + C normal + C normal3 + C sub/large4 + C sub/normal4 + C sub2/large6 + C sub2/large7 + $ hg remove large + $ touch large + $ hg addremove --config largefiles.patterns=**large --traceback + adding large as a largefile + +Test that outgoing --large works (with revsets too) + $ hg outgoing --rev '.^' --large + comparing with $TESTTMP/a (glob) + searching for changes + changeset: 8:c02fd3b77ec4 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add foo + + changeset: 9:289dd08c9bbb + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: used to say nothing changed + + changeset: 10:34f23ac6ac12 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added + + changeset: 12:710c1b2f523c + parent: 10:34f23ac6ac12 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: removed large + + searching for changes + largefiles to upload: + large + foo + + $ cd ../a + +Clone a largefiles repo. + + $ hg clone . ../b + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + $ cd ../b + $ hg log --template '{rev}:{node|short} {desc|firstline}\n' + 7:daea875e9014 add/edit more largefiles + 6:4355d653f84f edit files yet again + 5:9d5af5072dbd edit files again + 4:74c02385b94c move files + 3:9e8fbc4bce62 copy files + 2:51a0ae4d5864 remove files + 1:ce8896473775 edit files + 0:30d30fe6a5be add files + $ cat normal3 + normal33 + $ cat sub/normal4 + normal44 + $ cat sub/large4 + large44 + $ cat sub2/large6 + large6 + $ cat sub2/large7 + large7 + $ cd .. + $ hg clone a -r 3 c + adding changesets + adding manifests + adding file changes + added 4 changesets with 10 changes to 4 files + updating to branch default + 4 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 2 largefiles updated, 0 removed + $ cd c + $ hg log --template '{rev}:{node|short} {desc|firstline}\n' + 3:9e8fbc4bce62 copy files + 2:51a0ae4d5864 remove files + 1:ce8896473775 edit files + 0:30d30fe6a5be add files + $ cat normal1 + normal22 + $ cat large1 + large22 + $ cat sub/normal2 + normal22 + $ cat sub/large2 + large22 + +Old revisions of a clone have correct largefiles content (this also +tests update). + + $ hg update -r 1 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 1 largefiles updated, 0 removed + $ cat large1 + large11 + $ cat sub/large2 + large22 + $ cd .. + +Test cloning with --all-largefiles flag + + $ rm "${USERCACHE}"/* + $ hg clone --all-largefiles a a-backup + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + 8 additional largefiles cached + + $ hg clone --all-largefiles a ssh://localhost/a + abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a + [255] + +Test pulling with --all-largefiles flag + + $ rm -Rf a-backup + $ hg clone -r 1 a a-backup + adding changesets + adding manifests + adding file changes + added 2 changesets with 8 changes to 4 files + updating to branch default + 4 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 2 largefiles updated, 0 removed + $ rm "${USERCACHE}"/* + $ cd a-backup + $ hg pull --all-largefiles + pulling from $TESTTMP/a (glob) + searching for changes + adding changesets + adding manifests + adding file changes + added 6 changesets with 16 changes to 8 files + (run 'hg update' to get a working copy) + caching new largefiles + 3 largefiles cached + 3 additional largefiles cached + $ cd .. + +Rebasing between two repositories does not revert largefiles to old +revisions (this was a very bad bug that took a lot of work to fix). + + $ hg clone a d + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + $ cd b + $ echo large4-modified > sub/large4 + $ echo normal3-modified > normal3 + $ hg commit -m "modify normal file and largefile in repo b" + Invoking status precommit hook + M normal3 + M sub/large4 + $ cd ../d + $ echo large6-modified > sub2/large6 + $ echo normal4-modified > sub/normal4 + $ hg commit -m "modify normal file largefile in repo d" + Invoking status precommit hook + M sub/normal4 + M sub2/large6 + $ cd .. + $ hg clone d e + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + $ cd d + $ hg pull --rebase ../b + pulling from ../b + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files (+1 heads) + Invoking status precommit hook + M sub/normal4 + M sub2/large6 + saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob) + nothing to rebase + $ hg log --template '{rev}:{node|short} {desc|firstline}\n' + 9:598410d3eb9a modify normal file largefile in repo d + 8:a381d2c8c80e modify normal file and largefile in repo b + 7:daea875e9014 add/edit more largefiles + 6:4355d653f84f edit files yet again + 5:9d5af5072dbd edit files again + 4:74c02385b94c move files + 3:9e8fbc4bce62 copy files + 2:51a0ae4d5864 remove files + 1:ce8896473775 edit files + 0:30d30fe6a5be add files + $ cat normal3 + normal3-modified + $ cat sub/normal4 + normal4-modified + $ cat sub/large4 + large4-modified + $ cat sub2/large6 + large6-modified + $ cat sub2/large7 + large7 + $ cd ../e + $ hg pull ../b + pulling from ../b + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files (+1 heads) + (run 'hg heads' to see heads, 'hg merge' to merge) + caching new largefiles + 0 largefiles cached + $ hg rebase + Invoking status precommit hook + M sub/normal4 + M sub2/large6 + saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob) + $ hg log --template '{rev}:{node|short} {desc|firstline}\n' + 9:598410d3eb9a modify normal file largefile in repo d + 8:a381d2c8c80e modify normal file and largefile in repo b + 7:daea875e9014 add/edit more largefiles + 6:4355d653f84f edit files yet again + 5:9d5af5072dbd edit files again + 4:74c02385b94c move files + 3:9e8fbc4bce62 copy files + 2:51a0ae4d5864 remove files + 1:ce8896473775 edit files + 0:30d30fe6a5be add files + $ cat normal3 + normal3-modified + $ cat sub/normal4 + normal4-modified + $ cat sub/large4 + large4-modified + $ cat sub2/large6 + large6-modified + $ cat sub2/large7 + large7 + +Rollback on largefiles. + + $ echo large4-modified-again > sub/large4 + $ hg commit -m "Modify large4 again" + Invoking status precommit hook + M sub/large4 + $ hg rollback + repository tip rolled back to revision 9 (undo commit) + working directory now based on revision 9 + $ hg st + M sub/large4 + $ hg log --template '{rev}:{node|short} {desc|firstline}\n' + 9:598410d3eb9a modify normal file largefile in repo d + 8:a381d2c8c80e modify normal file and largefile in repo b + 7:daea875e9014 add/edit more largefiles + 6:4355d653f84f edit files yet again + 5:9d5af5072dbd edit files again + 4:74c02385b94c move files + 3:9e8fbc4bce62 copy files + 2:51a0ae4d5864 remove files + 1:ce8896473775 edit files + 0:30d30fe6a5be add files + $ cat sub/large4 + large4-modified-again + +"update --check" refuses to update with uncommitted changes. + $ hg update --check 8 + abort: uncommitted local changes + [255] + +"update --clean" leaves correct largefiles in working copy. + + $ hg update --clean + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 1 largefiles updated, 0 removed + $ cat normal3 + normal3-modified + $ cat sub/normal4 + normal4-modified + $ cat sub/large4 + large4-modified + $ cat sub2/large6 + large6-modified + $ cat sub2/large7 + large7 + +Now "update check" is happy. + $ hg update --check 8 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 1 largefiles updated, 0 removed + $ hg update --check + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 1 largefiles updated, 0 removed + +Test removing empty largefiles directories on update + $ test -d sub2 && echo "sub2 exists" + sub2 exists + $ hg update -q null + $ test -d sub2 && echo "error: sub2 should not exist anymore" + [1] + $ hg update -q + +Test hg remove removes empty largefiles directories + $ test -d sub2 && echo "sub2 exists" + sub2 exists + $ hg remove sub2/* + $ test -d sub2 && echo "error: sub2 should not exist anymore" + [1] + $ hg revert sub2/large6 sub2/large7 + +"revert" works on largefiles (and normal files too). + $ echo hack3 >> normal3 + $ echo hack4 >> sub/normal4 + $ echo hack4 >> sub/large4 + $ rm sub2/large6 + $ hg revert sub2/large6 + $ hg rm sub2/large6 + $ echo new >> sub2/large8 + $ hg add --large sub2/large8 +# XXX we don't really want to report that we're reverting the standin; +# that's just an implementation detail. But I don't see an obvious fix. ;-( + $ hg revert sub + reverting .hglf/sub/large4 (glob) + reverting sub/normal4 (glob) + $ hg status + M normal3 + A sub2/large8 + R sub2/large6 + ? sub/large4.orig + ? sub/normal4.orig + $ cat sub/normal4 + normal4-modified + $ cat sub/large4 + large4-modified + $ hg revert -a --no-backup + undeleting .hglf/sub2/large6 (glob) + forgetting .hglf/sub2/large8 (glob) + reverting normal3 + $ hg status + ? sub/large4.orig + ? sub/normal4.orig + ? sub2/large8 + $ cat normal3 + normal3-modified + $ cat sub2/large6 + large6-modified + $ rm sub/*.orig sub2/large8 + +revert some files to an older revision + $ hg revert --no-backup -r 8 sub2 + reverting .hglf/sub2/large6 (glob) + $ cat sub2/large6 + large6 + $ hg revert --no-backup -C -r '.^' sub2 + reverting .hglf/sub2/large6 (glob) + $ hg revert --no-backup sub2 + reverting .hglf/sub2/large6 (glob) + $ hg status + +"verify --large" actually verifies largefiles + + $ hg verify --large + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 10 files, 10 changesets, 28 total revisions + searching 1 changesets for largefiles + verified existence of 3 revisions of 3 largefiles + +Merging does not revert to old versions of largefiles and also check +that merging after having pulled from a non-default remote works +correctly. + + $ cd .. + $ hg clone -r 7 e temp + adding changesets + adding manifests + adding file changes + added 8 changesets with 24 changes to 10 files + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + $ hg clone temp f + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed +# Delete the largefiles in the largefiles system cache so that we have an +# opportunity to test that caching after a pull works. + $ rm "${USERCACHE}"/* + $ cd f + $ echo "large4-merge-test" > sub/large4 + $ hg commit -m "Modify large4 to test merge" + Invoking status precommit hook + M sub/large4 + $ hg pull ../e + pulling from ../e + searching for changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 4 changes to 4 files (+1 heads) + (run 'hg heads' to see heads, 'hg merge' to merge) + caching new largefiles + 2 largefiles cached + $ hg merge + merging sub/large4 + largefile sub/large4 has a merge conflict + keep (l)ocal or take (o)ther? l + 3 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + getting changed largefiles + 1 largefiles updated, 0 removed + $ hg commit -m "Merge repos e and f" + Invoking status precommit hook + M normal3 + M sub/normal4 + M sub2/large6 + $ cat normal3 + normal3-modified + $ cat sub/normal4 + normal4-modified + $ cat sub/large4 + large4-merge-test + $ cat sub2/large6 + large6-modified + $ cat sub2/large7 + large7 + +Test status after merging with a branch that introduces a new largefile: + + $ echo large > large + $ hg add --large large + $ hg commit -m 'add largefile' + Invoking status precommit hook + A large + $ hg update -q ".^" + $ echo change >> normal3 + $ hg commit -m 'some change' + Invoking status precommit hook + M normal3 + created new head + $ hg merge + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + getting changed largefiles + 1 largefiles updated, 0 removed + $ hg status + M large + +Test that a normal file and a largefile with the same name and path cannot +coexist. + + $ rm sub2/large7 + $ echo "largeasnormal" > sub2/large7 + $ hg add sub2/large7 + sub2/large7 already a largefile + +Test that transplanting a largefile change works correctly. + + $ cd .. + $ hg clone -r 8 d g + adding changesets + adding manifests + adding file changes + added 9 changesets with 26 changes to 10 files + updating to branch default + 5 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 3 largefiles updated, 0 removed + $ cd g + $ hg transplant -s ../d 598410d3eb9a + searching for changes + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + getting changed largefiles + 1 largefiles updated, 0 removed + $ hg log --template '{rev}:{node|short} {desc|firstline}\n' + 9:598410d3eb9a modify normal file largefile in repo d + 8:a381d2c8c80e modify normal file and largefile in repo b + 7:daea875e9014 add/edit more largefiles + 6:4355d653f84f edit files yet again + 5:9d5af5072dbd edit files again + 4:74c02385b94c move files + 3:9e8fbc4bce62 copy files + 2:51a0ae4d5864 remove files + 1:ce8896473775 edit files + 0:30d30fe6a5be add files + $ cat normal3 + normal3-modified + $ cat sub/normal4 + normal4-modified + $ cat sub/large4 + large4-modified + $ cat sub2/large6 + large6-modified + $ cat sub2/large7 + large7 + +Cat a largefile + $ hg cat normal3 + normal3-modified + $ hg cat sub/large4 + large4-modified + $ rm "${USERCACHE}"/* + $ hg cat -r a381d2c8c80e -o cat.out sub/large4 + $ cat cat.out + large4-modified + $ rm cat.out + $ hg cat -r a381d2c8c80e normal3 + normal3-modified + $ hg cat -r '.^' normal3 + normal3-modified + $ hg cat -r '.^' sub/large4 + large4-modified + +Test that renaming a largefile results in correct output for status + + $ hg rename sub/large4 large4-renamed + $ hg commit -m "test rename output" + Invoking status precommit hook + A large4-renamed + R sub/large4 + $ cat large4-renamed + large4-modified + $ cd sub2 + $ hg rename large6 large6-renamed + $ hg st + A sub2/large6-renamed + R sub2/large6 + $ cd .. + +Test --normal flag + + $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null + $ hg add --normal --large new-largefile + abort: --normal cannot be used with --large + [255] + $ hg add --normal new-largefile + new-largefile: up to 69 MB of RAM may be required to manage this file + (use 'hg revert new-largefile' to cancel the pending addition) + $ cd .. + +#if serve +vanilla clients not locked out from largefiles servers on vanilla repos + $ mkdir r1 + $ cd r1 + $ hg init + $ echo c1 > f1 + $ hg add f1 + $ hg commit -m "m1" + Invoking status precommit hook + A f1 + $ cd .. + $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2 + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + +largefiles clients still work with vanilla servers + $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + $ hg clone http://localhost:$HGPORT1 r3 + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved +#endif + + +vanilla clients locked out from largefiles http repos + $ mkdir r4 + $ cd r4 + $ hg init + $ echo c1 > f1 + $ hg add --large f1 + $ hg commit -m "m1" + Invoking status precommit hook + A f1 + $ cd .. + +#if serve + $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5 + abort: remote error: + + This repository uses the largefiles extension. + + Please enable it in your Mercurial config file. + [255] + +used all HGPORTs, kill all daemons + $ "$TESTDIR/killdaemons.py" +#endif + +vanilla clients locked out from largefiles ssh repos + $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5 + abort: remote error: + + This repository uses the largefiles extension. + + Please enable it in your Mercurial config file. + [255] + +#if serve + +largefiles clients refuse to push largefiles repos to vanilla servers + $ mkdir r6 + $ cd r6 + $ hg init + $ echo c1 > f1 + $ hg add f1 + $ hg commit -m "m1" + Invoking status precommit hook + A f1 + $ cat >> .hg/hgrc <<! + > [web] + > push_ssl = false + > allow_push = * + > ! + $ cd .. + $ hg clone r6 r7 + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd r7 + $ echo c2 > f2 + $ hg add --large f2 + $ hg commit -m "m2" + Invoking status precommit hook + A f2 + $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid + $ cat ../hg.pid >> $DAEMON_PIDS + $ hg push http://localhost:$HGPORT + pushing to http://localhost:$HGPORT/ + searching for changes + abort: http://localhost:$HGPORT/ does not appear to be a largefile store + [255] + $ cd .. + +putlfile errors are shown (issue3123) +Corrupt the cached largefile in r7 and in the usercache (required for testing on vfat) + $ echo corruption > "$TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8" + $ echo corruption > "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8" + $ hg init empty + $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \ + > --config 'web.allow_push=*' --config web.push_ssl=False + $ cat hg.pid >> $DAEMON_PIDS + $ hg push -R r7 http://localhost:$HGPORT1 + pushing to http://localhost:$HGPORT1/ + searching for changes + remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash + abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob) + [255] + $ rm -rf empty + +Push a largefiles repository to a served empty repository + $ hg init r8 + $ echo c3 > r8/f1 + $ hg add --large r8/f1 -R r8 + $ hg commit -m "m1" -R r8 + Invoking status precommit hook + A f1 + $ hg init empty + $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \ + > --config 'web.allow_push=*' --config web.push_ssl=False + $ cat hg.pid >> $DAEMON_PIDS + $ rm "${USERCACHE}"/* + $ hg push -R r8 http://localhost:$HGPORT2 + pushing to http://localhost:$HGPORT2/ + searching for changes + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + $ rm -rf empty + +used all HGPORTs, kill all daemons + $ "$TESTDIR/killdaemons.py" + +#endif + + +#if unix-permissions + +Clone a local repository owned by another user +We have to simulate that here by setting $HOME and removing write permissions + $ ORIGHOME="$HOME" + $ mkdir alice + $ HOME="`pwd`/alice" + $ cd alice + $ hg init pubrepo + $ cd pubrepo + $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null + $ hg add --large a-large-file + $ hg commit -m "Add a large file" + Invoking status precommit hook + A a-large-file + $ cd .. + $ chmod -R a-w pubrepo + $ cd .. + $ mkdir bob + $ HOME="`pwd`/bob" + $ cd bob + $ hg clone --pull ../alice/pubrepo pubrepo + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + getting changed largefiles + 1 largefiles updated, 0 removed + $ cd .. + $ chmod -R u+w alice/pubrepo + $ HOME="$ORIGHOME" + +#endif + +#if symlink + +Symlink to a large largefile should behave the same as a symlink to a normal file + $ hg init largesymlink + $ cd largesymlink + $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null + $ hg add --large largefile + $ hg commit -m "commit a large file" + Invoking status precommit hook + A largefile + $ ln -s largefile largelink + $ hg add largelink + $ hg commit -m "commit a large symlink" + Invoking status precommit hook + A largelink + $ rm -f largelink + $ hg up >/dev/null + $ test -f largelink + [1] + $ test -L largelink + [1] + $ rm -f largelink # make next part of the test independent of the previous + $ hg up -C >/dev/null + $ test -f largelink + $ test -L largelink + $ cd .. + +#endif + +test for pattern matching on 'hg status': +to boost performance, largefiles checks whether specified patterns are +related to largefiles in working directory (NOT to STANDIN) or not. + + $ hg init statusmatch + $ cd statusmatch + + $ mkdir -p a/b/c/d + $ echo normal > a/b/c/d/e.normal.txt + $ hg add a/b/c/d/e.normal.txt + $ echo large > a/b/c/d/e.large.txt + $ hg add --large a/b/c/d/e.large.txt + $ mkdir -p a/b/c/x + $ echo normal > a/b/c/x/y.normal.txt + $ hg add a/b/c/x/y.normal.txt + $ hg commit -m 'add files' + Invoking status precommit hook + A a/b/c/d/e.large.txt + A a/b/c/d/e.normal.txt + A a/b/c/x/y.normal.txt + +(1) no pattern: no performance boost + $ hg status -A + C a/b/c/d/e.large.txt + C a/b/c/d/e.normal.txt + C a/b/c/x/y.normal.txt + +(2) pattern not related to largefiles: performance boost + $ hg status -A a/b/c/x + C a/b/c/x/y.normal.txt + +(3) pattern related to largefiles: no performance boost + $ hg status -A a/b/c/d + C a/b/c/d/e.large.txt + C a/b/c/d/e.normal.txt + +(4) pattern related to STANDIN (not to largefiles): performance boost + $ hg status -A .hglf/a + C .hglf/a/b/c/d/e.large.txt + +(5) mixed case: no performance boost + $ hg status -A a/b/c/x a/b/c/d + C a/b/c/d/e.large.txt + C a/b/c/d/e.normal.txt + C a/b/c/x/y.normal.txt + +verify that largefiles doesn't break filesets + + $ hg log --rev . --exclude "set:binary()" + changeset: 0:41bd42f10efa + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add files + +verify that large files in subrepos handled properly + $ hg init subrepo + $ echo "subrepo = subrepo" > .hgsub + $ hg add .hgsub + $ hg ci -m "add subrepo" + Invoking status precommit hook + A .hgsub + ? .hgsubstate + $ echo "rev 1" > subrepo/large.txt + $ hg -R subrepo add --large subrepo/large.txt + $ hg sum + parent: 1:8ee150ea2e9c tip + add subrepo + branch: default + commit: 1 subrepos + update: (current) + $ hg st + $ hg st -S + A subrepo/large.txt + $ hg ci -S -m "commit top repo" + committing subrepository subrepo + Invoking status precommit hook + A large.txt + Invoking status precommit hook + M .hgsubstate +# No differences + $ hg st -S + $ hg sum + parent: 2:ce4cd0c527a6 tip + commit top repo + branch: default + commit: (clean) + update: (current) + $ echo "rev 2" > subrepo/large.txt + $ hg st -S + M subrepo/large.txt + $ hg sum + parent: 2:ce4cd0c527a6 tip + commit top repo + branch: default + commit: 1 subrepos + update: (current) + $ hg ci -m "this commit should fail without -S" + abort: uncommitted changes in subrepo subrepo + (use --subrepos for recursive commit) + [255] + +Add a normal file to the subrepo, then test archiving + + $ echo 'normal file' > subrepo/normal.txt + $ hg -R subrepo add subrepo/normal.txt + +Lock in subrepo, otherwise the change isn't archived + + $ hg ci -S -m "add normal file to top level" + committing subrepository subrepo + Invoking status precommit hook + M large.txt + A normal.txt + Invoking status precommit hook + M .hgsubstate + $ hg archive -S lf_subrepo_archive + $ find lf_subrepo_archive | sort + lf_subrepo_archive + lf_subrepo_archive/.hg_archival.txt + lf_subrepo_archive/.hgsub + lf_subrepo_archive/.hgsubstate + lf_subrepo_archive/a + lf_subrepo_archive/a/b + lf_subrepo_archive/a/b/c + lf_subrepo_archive/a/b/c/d + lf_subrepo_archive/a/b/c/d/e.large.txt + lf_subrepo_archive/a/b/c/d/e.normal.txt + lf_subrepo_archive/a/b/c/x + lf_subrepo_archive/a/b/c/x/y.normal.txt + lf_subrepo_archive/subrepo + lf_subrepo_archive/subrepo/large.txt + lf_subrepo_archive/subrepo/normal.txt + + $ cd .. |