test-largefiles-cache.t
238 lines
| 6.8 KiB
| text/troff
|
Tads3Lexer
/ tests / test-largefiles-cache.t
|
r15472 | Create user cache directory | ||
$ USERCACHE=`pwd`/cache; export USERCACHE | ||||
$ cat <<EOF >> ${HGRCPATH} | ||||
> [extensions] | ||||
> hgext.largefiles= | ||||
> [largefiles] | ||||
> usercache=${USERCACHE} | ||||
> EOF | ||||
$ mkdir -p ${USERCACHE} | ||||
Create source repo, and commit adding largefile. | ||||
$ hg init src | ||||
$ cd src | ||||
$ echo large > large | ||||
$ hg add --large large | ||||
$ hg commit -m 'add largefile' | ||||
|
r18723 | $ hg rm large | ||
|
r27942 | $ hg commit -m 'branchhead without largefile' large | ||
|
r18723 | $ hg up -qr 0 | ||
|
r27947 | $ rm large | ||
$ echo "0000000000000000000000000000000000000000" > .hglf/large | ||||
$ hg commit -m 'commit missing file with corrupt standin' large | ||||
abort: large: file not found! | ||||
[255] | ||||
$ hg up -Cqr 0 | ||||
|
r15472 | $ cd .. | ||
Discard all cached largefiles in USERCACHE | ||||
$ rm -rf ${USERCACHE} | ||||
|
r15478 | Create mirror repo, and pull from source without largefile: | ||
|
r15472 | "pull" is used instead of "clone" for suppression of (1) updating to | ||
|
r21024 | tip (= caching largefile from source repo), and (2) recording source | ||
|
r15472 | repo as "default" path in .hg/hgrc. | ||
$ hg init mirror | ||||
$ cd mirror | ||||
$ hg pull ../src | ||||
pulling from ../src | ||||
requesting all changes | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
|
r18723 | added 2 changesets with 1 changes to 1 files | ||
|
r15472 | (run 'hg update' to get a working copy) | ||
Update working directory to "tip", which requires largefile("large"), | ||||
but there is no cache file for it. So, hg must treat it as | ||||
"missing"(!) file. | ||||
|
r18723 | $ hg update -r0 | ||
|
r15472 | getting changed largefiles | ||
|
r20471 | large: largefile 7f7097b041ccf68cc5561e9600da4655d21c6d18 not available from file:/*/$TESTTMP/mirror (glob) | ||
|
r15472 | 0 largefiles updated, 0 removed | ||
|
r18459 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
|
r15472 | $ hg status | ||
! large | ||||
Update working directory to null: this cleanup .hg/largefiles/dirstate | ||||
$ hg update null | ||||
getting changed largefiles | ||||
0 largefiles updated, 0 removed | ||||
|
r18459 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||
|
r15472 | |||
Update working directory to tip, again. | ||||
|
r18723 | $ hg update -r0 | ||
|
r15472 | getting changed largefiles | ||
|
r20471 | large: largefile 7f7097b041ccf68cc5561e9600da4655d21c6d18 not available from file:/*/$TESTTMP/mirror (glob) | ||
|
r15472 | 0 largefiles updated, 0 removed | ||
|
r18459 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
|
r15472 | $ hg status | ||
! large | ||||
|
r16986 | $ cd .. | ||
|
r18724 | Verify that largefiles from pulled branchheads are fetched, also to an empty repo | ||
$ hg init mirror2 | ||||
$ hg -R mirror2 pull src -r0 | ||||
pulling from src | ||||
adding changesets | ||||
adding manifests | ||||
adding file changes | ||||
added 1 changesets with 1 changes to 1 files | ||||
(run 'hg update' to get a working copy) | ||||
|
r16986 | #if unix-permissions | ||
|
r16153 | |||
Portable way to print file permissions: | ||||
$ cat > ls-l.py <<EOF | ||||
> #!/usr/bin/env python | ||||
> import sys, os | ||||
> path = sys.argv[1] | ||||
> print '%03o' % (os.lstat(path).st_mode & 0777) | ||||
> EOF | ||||
$ chmod +x ls-l.py | ||||
Test that files in .hg/largefiles inherit mode from .hg/store, not | ||||
from file in working copy: | ||||
$ cd src | ||||
$ chmod 750 .hg/store | ||||
$ chmod 660 large | ||||
$ echo change >> large | ||||
$ hg commit -m change | ||||
|
r18723 | created new head | ||
|
r16153 | $ ../ls-l.py .hg/largefiles/e151b474069de4ca6898f67ce2f2a7263adf8fea | ||
640 | ||||
|
r16154 | |||
Test permission of with files in .hg/largefiles created by update: | ||||
$ cd ../mirror | ||||
$ rm -r "$USERCACHE" .hg/largefiles # avoid links | ||||
$ chmod 750 .hg/store | ||||
$ hg pull ../src --update -q | ||||
$ ../ls-l.py .hg/largefiles/e151b474069de4ca6898f67ce2f2a7263adf8fea | ||||
640 | ||||
|
r16155 | |||
Test permission of files created by push: | ||||
$ hg serve -R ../src -d -p $HGPORT --pid-file hg.pid \ | ||||
> --config "web.allow_push=*" --config web.push_ssl=no | ||||
$ cat hg.pid >> $DAEMON_PIDS | ||||
$ echo change >> large | ||||
$ hg commit -m change | ||||
$ rm -r "$USERCACHE" | ||||
$ hg push -q http://localhost:$HGPORT/ | ||||
$ ../ls-l.py ../src/.hg/largefiles/b734e14a0971e370408ab9bce8d56d8485e368a9 | ||||
640 | ||||
|
r16913 | |||
$ cd .. | ||||
|
r16986 | |||
#endif | ||||
|
r23618 | |||
Test issue 4053 (remove --after on a deleted, uncommitted file shouldn't say | ||||
|
r24180 | it is missing, but a remove on a nonexistent unknown file still should. Same | ||
|
r23619 | for a forget.) | ||
|
r23618 | |||
$ cd src | ||||
$ touch x | ||||
$ hg add x | ||||
$ mv x y | ||||
$ hg remove -A x y ENOENT | ||||
ENOENT: * (glob) | ||||
not removing y: file is untracked | ||||
[1] | ||||
|
r23619 | $ hg add y | ||
$ mv y z | ||||
$ hg forget y z ENOENT | ||||
ENOENT: * (glob) | ||||
not removing z: file is already untracked | ||||
[1] | ||||
|
r24631 | |||
Largefiles are accessible from the share's store | ||||
$ cd .. | ||||
$ hg share -q src share_dst --config extensions.share= | ||||
$ hg -R share_dst update -r0 | ||||
getting changed largefiles | ||||
1 largefiles updated, 0 removed | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ echo modified > share_dst/large | ||||
$ hg -R share_dst ci -m modified | ||||
created new head | ||||
Only dirstate is in the local store for the share, and the largefile is in the | ||||
share source's local store. Avoid the extra largefiles added in the unix | ||||
conditional above. | ||||
$ hash=`hg -R share_dst cat share_dst/.hglf/large` | ||||
$ echo $hash | ||||
e2fb5f2139d086ded2cb600d5a91a196e76bf020 | ||||
$ find share_dst/.hg/largefiles/* | sort | ||||
share_dst/.hg/largefiles/dirstate | ||||
$ find src/.hg/largefiles/* | egrep "(dirstate|$hash)" | sort | ||||
src/.hg/largefiles/dirstate | ||||
src/.hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020 | ||||
|
r26822 | |||
Inject corruption into the largefiles store and see how update handles that: | ||||
$ cd src | ||||
$ hg up -qC | ||||
$ cat large | ||||
modified | ||||
$ rm large | ||||
$ cat .hglf/large | ||||
e2fb5f2139d086ded2cb600d5a91a196e76bf020 | ||||
$ mv .hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020 .. | ||||
$ echo corruption > .hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020 | ||||
$ hg up -C | ||||
getting changed largefiles | ||||
|
r26951 | large: data corruption in $TESTTMP/src/.hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020 with hash 6a7bb2556144babe3899b25e5428123735bb1e27 (glob) | ||
|
r26823 | 0 largefiles updated, 0 removed | ||
|
r26822 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
|
r28029 | 2 other heads for branch "default" | ||
|
r26822 | $ hg st | ||
|
r26823 | ! large | ||
|
r26822 | ? z | ||
$ rm .hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020 | ||||
|
r26824 | |||
#if serve | ||||
Test coverage of error handling from putlfile: | ||||
$ mkdir $TESTTMP/mirrorcache | ||||
$ hg serve -R ../mirror -d -p $HGPORT1 --pid-file hg.pid --config largefiles.usercache=$TESTTMP/mirrorcache | ||||
$ cat hg.pid >> $DAEMON_PIDS | ||||
$ hg push http://localhost:$HGPORT1 -f --config files.usercache=nocache | ||||
pushing to http://localhost:$HGPORT1/ | ||||
searching for changes | ||||
|
r26825 | abort: remotestore: could not open file $TESTTMP/src/.hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020: HTTP Error 403: ssl required | ||
|
r26824 | [255] | ||
$ rm .hg/largefiles/e2fb5f2139d086ded2cb600d5a91a196e76bf020 | ||||
Test coverage of 'missing from store': | ||||
$ hg serve -R ../mirror -d -p $HGPORT2 --pid-file hg.pid --config largefiles.usercache=$TESTTMP/mirrorcache --config "web.allow_push=*" --config web.push_ssl=no | ||||
$ cat hg.pid >> $DAEMON_PIDS | ||||
$ hg push http://localhost:$HGPORT2 -f --config largefiles.usercache=nocache | ||||
pushing to http://localhost:$HGPORT2/ | ||||
searching for changes | ||||
abort: largefile e2fb5f2139d086ded2cb600d5a91a196e76bf020 missing from store (needs to be uploaded) | ||||
[255] | ||||
#endif | ||||