diff -r 7d408720453d -r d13b4ecdb680 tests/test-largefiles-misc.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-largefiles-misc.t Fri May 16 13:18:57 2014 -0700 @@ -0,0 +1,696 @@ +This file contains testcases that tend to be related to special cases or less +common commands affecting largefile. + +Each sections should be independent of each others. + + $ USERCACHE="$TESTTMP/cache"; export USERCACHE + $ mkdir "${USERCACHE}" + $ cat >> $HGRCPATH < [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 + + + +Test copies and moves from a directory other than root (issue3516) +========================================================================= + + $ 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 + $ cd .. + $ hg mv dira dirc + moving .hglf/dira/baz/largefile to .hglf/dirc/baz/largefile (glob) + moving .hglf/dira/dirb/largefile to .hglf/dirc/dirb/largefile (glob) + $ find * | sort + dirc + dirc/baz + dirc/baz/largefile + dirc/dirb + dirc/dirb/largefile + $ hg up -qC + $ cd .. + +Clone a local repository owned by another user +=================================================== + +#if unix-permissions + +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 + getting changed largefiles + 1 largefiles updated, 0 removed + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd .. + $ chmod -R u+w alice/pubrepo + $ HOME="$ORIGHOME" + +#endif + + +Symlink to a large largefile should behave the same as a symlink to a normal file +===================================================================================== + +#if symlink + + $ 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 + +Test update with subrepos. + + $ hg update 0 + getting changed largefiles + 0 largefiles updated, 1 removed + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg status -S + $ hg update tip + getting changed largefiles + 1 largefiles updated, 0 removed + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg status -S +# modify a large file + $ echo "modified" > subrepo/large.txt + $ hg st -S + M subrepo/large.txt +# update -C should revert the change. + $ hg update -C + getting changed largefiles + 1 largefiles updated, 0 removed + getting changed largefiles + 0 largefiles updated, 0 removed + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg status -S + +Test archiving a revision that references a subrepo that is not yet +cloned (see test-subrepo-recursion.t): + + $ hg clone -U . ../empty + $ cd ../empty + $ hg archive --subrepos -r tip ../archive.tar.gz + cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo + $ cd .. + + + + + + +Test addremove, forget and others +============================================== + +Test that addremove picks up largefiles prior to the initial commit (issue3541) + + $ hg init addrm2 + $ cd addrm2 + $ touch large.dat + $ touch large2.dat + $ touch normal + $ hg add --large large.dat + $ hg addremove -v + adding large2.dat as a largefile + adding normal + +Test that forgetting all largefiles reverts to islfilesrepo() == False +(addremove will add *.dat as normal files now) + $ hg forget large.dat + $ hg forget large2.dat + $ hg addremove -v + adding large.dat + adding large2.dat + +Test commit's addremove option prior to the first commit + $ hg forget large.dat + $ hg forget large2.dat + $ hg add --large large.dat + $ hg ci -Am "commit" + adding large2.dat as a largefile + Invoking status precommit hook + A large.dat + A large2.dat + A normal + $ find .hglf | sort + .hglf + .hglf/large.dat + .hglf/large2.dat + +Test actions on largefiles using relative paths from subdir + + $ mkdir sub + $ cd sub + $ echo anotherlarge > anotherlarge + $ hg add --large anotherlarge + $ hg st + A sub/anotherlarge + $ hg st anotherlarge + A anotherlarge + $ hg commit -m anotherlarge anotherlarge + Invoking status precommit hook + A sub/anotherlarge + $ hg log anotherlarge + changeset: 1:9627a577c5e9 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: anotherlarge + + $ hg log -G anotherlarge + @ changeset: 1:9627a577c5e9 + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: anotherlarge + | + $ echo more >> anotherlarge + $ hg st . + M anotherlarge + $ hg cat anotherlarge + anotherlarge + $ hg revert anotherlarge + $ hg st + ? sub/anotherlarge.orig + $ cd .. + + $ cd .. + +Check error message while exchange +========================================================= + +issue3651: summary/outgoing with largefiles shows "no remote repo" +unexpectedly + + $ mkdir issue3651 + $ cd issue3651 + + $ hg init src + $ echo a > src/a + $ hg -R src add --large src/a + $ hg -R src commit -m '#0' + Invoking status precommit hook + A a + +check messages when no remote repository is specified: +"no remote repo" route for "hg outgoing --large" is not tested here, +because it can't be reproduced easily. + + $ hg init clone1 + $ hg -R clone1 -q pull src + $ hg -R clone1 -q update + $ hg -R clone1 paths | grep default + [1] + + $ hg -R clone1 summary --large + parent: 0:fc0bd45326d3 tip + #0 + branch: default + commit: (clean) + update: (current) + largefiles: (no remote repo) + +check messages when there is no files to upload: + + $ hg -q clone src clone2 + $ hg -R clone2 paths | grep default + default = $TESTTMP/issue3651/src (glob) + + $ hg -R clone2 summary --large + parent: 0:fc0bd45326d3 tip + #0 + branch: default + commit: (clean) + update: (current) + largefiles: (no files to upload) + $ hg -R clone2 outgoing --large + comparing with $TESTTMP/issue3651/src (glob) + searching for changes + no changes found + largefiles: no files to upload + [1] + + $ hg -R clone2 outgoing --large --graph --template "{rev}" + comparing with $TESTTMP/issue3651/src (glob) + searching for changes + no changes found + largefiles: no files to upload + +check messages when there are files to upload: + + $ echo b > clone2/b + $ hg -R clone2 add --large clone2/b + $ hg -R clone2 commit -m '#1' + Invoking status precommit hook + A b + $ hg -R clone2 summary --large + parent: 1:1acbe71ce432 tip + #1 + branch: default + commit: (clean) + update: (current) + largefiles: 1 to upload + $ hg -R clone2 outgoing --large + comparing with $TESTTMP/issue3651/src (glob) + searching for changes + changeset: 1:1acbe71ce432 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: #1 + + largefiles to upload: + b + + $ hg -R clone2 outgoing --large --graph --template "{rev}" + comparing with $TESTTMP/issue3651/src + searching for changes + @ 1 + + largefiles to upload: + b + + + $ cd .. + +merge action 'd' for 'local renamed directory to d2/g' which has no filename +================================================================================== + + $ hg init merge-action + $ cd merge-action + $ touch l + $ hg add --large l + $ mkdir d1 + $ touch d1/f + $ hg ci -Aqm0 + Invoking status precommit hook + A d1/f + A l + $ echo > d1/f + $ touch d1/g + $ hg ci -Aqm1 + Invoking status precommit hook + M d1/f + A d1/g + $ hg up -qr0 + $ hg mv d1 d2 + moving d1/f to d2/f (glob) + $ hg ci -qm2 + Invoking status precommit hook + A d2/f + R d1/f + $ hg merge + merging d2/f and d1/f to d2/f + 1 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + getting changed largefiles + 0 largefiles updated, 0 removed + $ cd .. + + +Merge conflicts: +===================== + + $ hg init merge + $ cd merge + $ echo 0 > f-different + $ echo 0 > f-same + $ echo 0 > f-unchanged-1 + $ echo 0 > f-unchanged-2 + $ hg add --large * + $ hg ci -m0 + Invoking status precommit hook + A f-different + A f-same + A f-unchanged-1 + A f-unchanged-2 + $ echo tmp1 > f-unchanged-1 + $ echo tmp1 > f-unchanged-2 + $ echo tmp1 > f-same + $ hg ci -m1 + Invoking status precommit hook + M f-same + M f-unchanged-1 + M f-unchanged-2 + $ echo 2 > f-different + $ echo 0 > f-unchanged-1 + $ echo 1 > f-unchanged-2 + $ echo 1 > f-same + $ hg ci -m2 + Invoking status precommit hook + M f-different + M f-same + M f-unchanged-1 + M f-unchanged-2 + $ hg up -qr0 + $ echo tmp2 > f-unchanged-1 + $ echo tmp2 > f-unchanged-2 + $ echo tmp2 > f-same + $ hg ci -m3 + Invoking status precommit hook + M f-same + M f-unchanged-1 + M f-unchanged-2 + created new head + $ echo 1 > f-different + $ echo 1 > f-unchanged-1 + $ echo 0 > f-unchanged-2 + $ echo 1 > f-same + $ hg ci -m4 + Invoking status precommit hook + M f-different + M f-same + M f-unchanged-1 + M f-unchanged-2 + $ hg merge + largefile f-different has a merge conflict + ancestor was 09d2af8dd22201dd8d48e5dcfcaed281ff9422c7 + keep (l)ocal e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e or + take (o)ther 7448d8798a4380162d4b56f9b452e2f6f9e24e7a? l + 0 files updated, 4 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + getting changed largefiles + 1 largefiles updated, 0 removed + $ cat f-different + 1 + $ cat f-same + 1 + $ cat f-unchanged-1 + 1 + $ cat f-unchanged-2 + 1 + $ cd .. + +Test largefile insulation (do not enabled a side effect +======================================================== + +Check whether "largefiles" feature is supported only in repositories +enabling largefiles extension. + + $ mkdir individualenabling + $ cd individualenabling + + $ hg init enabledlocally + $ echo large > enabledlocally/large + $ hg -R enabledlocally add --large enabledlocally/large + $ hg -R enabledlocally commit -m '#0' + Invoking status precommit hook + A large + + $ hg init notenabledlocally + $ echo large > notenabledlocally/large + $ hg -R notenabledlocally add --large notenabledlocally/large + $ hg -R notenabledlocally commit -m '#0' + Invoking status precommit hook + A large + + $ cat >> $HGRCPATH < [extensions] + > # disable globally + > largefiles=! + > EOF + $ cat >> enabledlocally/.hg/hgrc < [extensions] + > # enable locally + > largefiles= + > EOF + $ hg -R enabledlocally root + $TESTTMP/individualenabling/enabledlocally (glob) + $ hg -R notenabledlocally root + abort: repository requires features unknown to this Mercurial: largefiles! + (see http://mercurial.selenic.com/wiki/MissingRequirement for more information) + [255] + + $ hg init push-dst + $ hg -R enabledlocally push push-dst + pushing to push-dst + abort: required features are not supported in the destination: largefiles + [255] + + $ hg init pull-src + $ hg -R pull-src pull enabledlocally + pulling from enabledlocally + abort: required features are not supported in the destination: largefiles + [255] + + $ hg clone enabledlocally clone-dst + abort: repository requires features unknown to this Mercurial: largefiles! + (see http://mercurial.selenic.com/wiki/MissingRequirement for more information) + [255] + $ test -d clone-dst + [1] + $ hg clone --pull enabledlocally clone-pull-dst + abort: required features are not supported in the destination: largefiles + [255] + $ test -d clone-pull-dst + [1] + +#if serve + +Test largefiles specific peer setup, when largefiles is enabled +locally (issue4109) + + $ hg showconfig extensions | grep largefiles + extensions.largefiles=! + $ mkdir -p $TESTTMP/individualenabling/usercache + + $ hg serve -R enabledlocally -d -p $HGPORT --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + + $ hg init pull-dst + $ cat > pull-dst/.hg/hgrc < [extensions] + > # enable locally + > largefiles= + > [largefiles] + > # ignore system cache to force largefiles specific wire proto access + > usercache=$TESTTMP/individualenabling/usercache + > EOF + $ hg -R pull-dst -q pull -u http://localhost:$HGPORT + + $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS +#endif + + $ cd .. + + +