summaryrefslogtreecommitdiff
path: root/tests/test-largefiles.t
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-largefiles.t')
-rw-r--r--tests/test-largefiles.t1447
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 ..