test-archive.t
373 lines
| 11.0 KiB
| text/troff
|
Tads3Lexer
/ tests / test-archive.t
Matt Mackall
|
r22046 | #require serve | ||
Mads Kiilerich
|
r15446 | |||
Martin Geisler
|
r13956 | $ hg init test | ||
Martin Geisler
|
r11853 | $ cd test | ||
$ echo foo>foo | ||||
$ hg commit -Am 1 -d '1 0' | ||||
adding foo | ||||
$ echo bar>bar | ||||
$ hg commit -Am 2 -d '2 0' | ||||
adding bar | ||||
$ mkdir baz | ||||
$ echo bletch>baz/bletch | ||||
$ hg commit -Am 3 -d '1000000000 0' | ||||
adding baz/bletch | ||||
Matt Harbison
|
r23231 | $ hg init subrepo | ||
$ touch subrepo/sub | ||||
$ hg -q -R subrepo ci -Am "init subrepo" | ||||
$ echo "subrepo = subrepo" > .hgsub | ||||
$ hg add .hgsub | ||||
$ hg ci -m "add subrepo" | ||||
Martin Geisler
|
r11853 | $ echo "[web]" >> .hg/hgrc | ||
$ echo "name = test-archive" >> .hg/hgrc | ||||
Matt Harbison
|
r23232 | $ echo "archivesubrepos = True" >> .hg/hgrc | ||
Martin Geisler
|
r11853 | $ cp .hg/hgrc .hg/hgrc-base | ||
> test_archtype() { | ||||
> echo "allow_archive = $1" >> .hg/hgrc | ||||
> hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log | ||||
> cat hg.pid >> $DAEMON_PIDS | ||||
> echo % $1 allowed should give 200 | ||||
Matt Mackall
|
r25472 | > get-with-headers.py localhost:$HGPORT "archive/tip.$2" | head -n 1 | ||
Martin Geisler
|
r11853 | > echo % $3 and $4 disallowed should both give 403 | ||
Matt Mackall
|
r25472 | > get-with-headers.py localhost:$HGPORT "archive/tip.$3" | head -n 1 | ||
> get-with-headers.py localhost:$HGPORT "archive/tip.$4" | head -n 1 | ||||
Matt Mackall
|
r25474 | > killdaemons.py | ||
Martin Geisler
|
r11853 | > cat errors.log | ||
> cp .hg/hgrc-base .hg/hgrc | ||||
> } | ||||
check http return codes | ||||
$ test_archtype gz tar.gz tar.bz2 zip | ||||
% gz allowed should give 200 | ||||
200 Script output follows | ||||
% tar.bz2 and zip disallowed should both give 403 | ||||
403 Archive type not allowed: bz2 | ||||
403 Archive type not allowed: zip | ||||
$ test_archtype bz2 tar.bz2 zip tar.gz | ||||
% bz2 allowed should give 200 | ||||
200 Script output follows | ||||
% zip and tar.gz disallowed should both give 403 | ||||
403 Archive type not allowed: zip | ||||
403 Archive type not allowed: gz | ||||
$ test_archtype zip zip tar.gz tar.bz2 | ||||
% zip allowed should give 200 | ||||
200 Script output follows | ||||
% tar.gz and tar.bz2 disallowed should both give 403 | ||||
403 Archive type not allowed: gz | ||||
403 Archive type not allowed: bz2 | ||||
$ echo "allow_archive = gz bz2 zip" >> .hg/hgrc | ||||
$ hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log | ||||
$ cat hg.pid >> $DAEMON_PIDS | ||||
r30747 | check archive links' order | |||
$ get-with-headers.py localhost:$HGPORT "?revcount=1" | grep '/archive/tip.' | ||||
<a href="/archive/tip.zip">zip</a> | ||||
<a href="/archive/tip.tar.gz">gz</a> | ||||
<a href="/archive/tip.tar.bz2">bz2</a> | ||||
Martin Geisler
|
r11853 | invalid arch type should give 404 | ||
Matt Mackall
|
r25472 | $ get-with-headers.py localhost:$HGPORT "archive/tip.invalid" | head -n 1 | ||
Martin Geisler
|
r11853 | 404 Unsupported archive type: None | ||
$ TIP=`hg id -v | cut -f1 -d' '` | ||||
$ QTIP=`hg id -q` | ||||
$ cat > getarchive.py <<EOF | ||||
timeless
|
r29179 | > from __future__ import absolute_import | ||
> import os | ||||
> import sys | ||||
timeless
|
r29183 | > from mercurial import ( | ||
> util, | ||||
> ) | ||||
Martin Geisler
|
r11853 | > try: | ||
> # Set stdout to binary mode for win32 platforms | ||||
> import msvcrt | ||||
> msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) | ||||
> except ImportError: | ||||
> pass | ||||
Angel Ezquerra
|
r18770 | > if len(sys.argv) <= 3: | ||
> node, archive = sys.argv[1:] | ||||
> requeststr = 'cmd=archive;node=%s;type=%s' % (node, archive) | ||||
> else: | ||||
> node, archive, file = sys.argv[1:] | ||||
> requeststr = 'cmd=archive;node=%s;type=%s;file=%s' % (node, archive, file) | ||||
> try: | ||||
timeless
|
r29182 | > stdout = sys.stdout.buffer | ||
> except AttributeError: | ||||
> stdout = sys.stdout | ||||
> try: | ||||
Jun Wu
|
r31008 | > f = util.urlreq.urlopen('http://$LOCALIP:%s/?%s' | ||
Angel Ezquerra
|
r18770 | > % (os.environ['HGPORT'], requeststr)) | ||
timeless
|
r29182 | > stdout.write(f.read()) | ||
timeless
|
r29183 | > except util.urlerr.httperror as e: | ||
Angel Ezquerra
|
r18770 | > sys.stderr.write(str(e) + '\n') | ||
Martin Geisler
|
r11853 | > EOF | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" gz | gunzip | tar tf - 2>/dev/null | ||
Matt Harbison
|
r23231 | test-archive-1701ef1f1510/.hg_archival.txt | ||
test-archive-1701ef1f1510/.hgsub | ||||
test-archive-1701ef1f1510/.hgsubstate | ||||
test-archive-1701ef1f1510/bar | ||||
test-archive-1701ef1f1510/baz/bletch | ||||
test-archive-1701ef1f1510/foo | ||||
Matt Harbison
|
r23232 | test-archive-1701ef1f1510/subrepo/sub | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" bz2 | bunzip2 | tar tf - 2>/dev/null | ||
Matt Harbison
|
r23231 | test-archive-1701ef1f1510/.hg_archival.txt | ||
test-archive-1701ef1f1510/.hgsub | ||||
test-archive-1701ef1f1510/.hgsubstate | ||||
test-archive-1701ef1f1510/bar | ||||
test-archive-1701ef1f1510/baz/bletch | ||||
test-archive-1701ef1f1510/foo | ||||
Matt Harbison
|
r23232 | test-archive-1701ef1f1510/subrepo/sub | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" zip > archive.zip | ||
Matt Mackall
|
r12366 | $ unzip -t archive.zip | ||
Martin Geisler
|
r11853 | Archive: archive.zip | ||
Augie Fackler
|
r29562 | testing: test-archive-1701ef1f1510/.hg_archival.txt*OK (glob) | ||
testing: test-archive-1701ef1f1510/.hgsub*OK (glob) | ||||
testing: test-archive-1701ef1f1510/.hgsubstate*OK (glob) | ||||
testing: test-archive-1701ef1f1510/bar*OK (glob) | ||||
testing: test-archive-1701ef1f1510/baz/bletch*OK (glob) | ||||
testing: test-archive-1701ef1f1510/foo*OK (glob) | ||||
testing: test-archive-1701ef1f1510/subrepo/sub*OK (glob) | ||||
Martin Geisler
|
r11853 | No errors detected in compressed data of archive.zip. | ||
Angel Ezquerra
|
r18771 | test that we can download single directories and files | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" gz baz | gunzip | tar tf - 2>/dev/null | ||
Matt Harbison
|
r23231 | test-archive-1701ef1f1510/baz/bletch | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" gz foo | gunzip | tar tf - 2>/dev/null | ||
Matt Harbison
|
r23231 | test-archive-1701ef1f1510/foo | ||
Angel Ezquerra
|
r18771 | |||
Angel Ezquerra
|
r18968 | test that we detect file patterns that match no files | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" gz foobar | ||
Angel Ezquerra
|
r18968 | HTTP Error 404: file(s) not found: foobar | ||
Angel Ezquerra
|
r18771 | test that we reject unsafe patterns | ||
Augie Fackler
|
r32940 | $ $PYTHON getarchive.py "$TIP" gz relre:baz | ||
Angel Ezquerra
|
r18968 | HTTP Error 404: file(s) not found: relre:baz | ||
Angel Ezquerra
|
r18771 | |||
Matt Mackall
|
r25474 | $ killdaemons.py | ||
Martin Geisler
|
r11853 | |||
$ hg archive -t tar test.tar | ||||
$ tar tf test.tar | ||||
test/.hg_archival.txt | ||||
Matt Harbison
|
r23231 | test/.hgsub | ||
test/.hgsubstate | ||||
Martin Geisler
|
r11853 | test/bar | ||
test/baz/bletch | ||||
test/foo | ||||
Pierre-Yves David
|
r25125 | $ hg archive --debug -t tbz2 -X baz test.tar.bz2 --config progress.debug=true | ||
Matt Harbison
|
r23231 | archiving: 0/4 files (0.00%) | ||
archiving: .hgsub 1/4 files (25.00%) | ||||
archiving: .hgsubstate 2/4 files (50.00%) | ||||
archiving: bar 3/4 files (75.00%) | ||||
archiving: foo 4/4 files (100.00%) | ||||
Martin Geisler
|
r11853 | $ bunzip2 -dc test.tar.bz2 | tar tf - 2>/dev/null | ||
test/.hg_archival.txt | ||||
Matt Harbison
|
r23231 | test/.hgsub | ||
test/.hgsubstate | ||||
Martin Geisler
|
r11853 | test/bar | ||
test/foo | ||||
$ hg archive -t tgz -p %b-%h test-%h.tar.gz | ||||
Matt Mackall
|
r12366 | $ gzip -dc test-$QTIP.tar.gz | tar tf - 2>/dev/null | ||
Matt Harbison
|
r23231 | test-1701ef1f1510/.hg_archival.txt | ||
test-1701ef1f1510/.hgsub | ||||
test-1701ef1f1510/.hgsubstate | ||||
test-1701ef1f1510/bar | ||||
test-1701ef1f1510/baz/bletch | ||||
test-1701ef1f1510/foo | ||||
Martin Geisler
|
r11853 | |||
$ hg archive autodetected_test.tar | ||||
$ tar tf autodetected_test.tar | ||||
autodetected_test/.hg_archival.txt | ||||
Matt Harbison
|
r23231 | autodetected_test/.hgsub | ||
autodetected_test/.hgsubstate | ||||
Martin Geisler
|
r11853 | autodetected_test/bar | ||
autodetected_test/baz/bletch | ||||
autodetected_test/foo | ||||
The '-t' should override autodetection | ||||
$ hg archive -t tar autodetect_override_test.zip | ||||
$ tar tf autodetect_override_test.zip | ||||
autodetect_override_test.zip/.hg_archival.txt | ||||
Matt Harbison
|
r23231 | autodetect_override_test.zip/.hgsub | ||
autodetect_override_test.zip/.hgsubstate | ||||
Martin Geisler
|
r11853 | autodetect_override_test.zip/bar | ||
autodetect_override_test.zip/baz/bletch | ||||
autodetect_override_test.zip/foo | ||||
$ for ext in tar tar.gz tgz tar.bz2 tbz2 zip; do | ||||
> hg archive auto_test.$ext | ||||
> if [ -d auto_test.$ext ]; then | ||||
> echo "extension $ext was not autodetected." | ||||
> fi | ||||
> done | ||||
$ cat > md5comp.py <<EOF | ||||
Augie Fackler
|
r33876 | > from __future__ import absolute_import, print_function | ||
> import hashlib | ||||
Martin Geisler
|
r11853 | > import sys | ||
> f1, f2 = sys.argv[1:3] | ||||
Augie Fackler
|
r33876 | > h1 = hashlib.md5(open(f1, 'rb').read()).hexdigest() | ||
> h2 = hashlib.md5(open(f2, 'rb').read()).hexdigest() | ||||
timeless
|
r29177 | > print(h1 == h2 or "md5 differ: " + repr((h1, h2))) | ||
Martin Geisler
|
r11853 | > EOF | ||
Martin Geisler
|
r13140 | archive name is stored in the archive, so create similar archives and | ||
rename them afterwards. | ||||
Martin Geisler
|
r11853 | |||
$ hg archive -t tgz tip.tar.gz | ||||
$ mv tip.tar.gz tip1.tar.gz | ||||
$ sleep 1 | ||||
$ hg archive -t tgz tip.tar.gz | ||||
$ mv tip.tar.gz tip2.tar.gz | ||||
Augie Fackler
|
r32940 | $ $PYTHON md5comp.py tip1.tar.gz tip2.tar.gz | ||
Martin Geisler
|
r11853 | True | ||
$ hg archive -t zip -p /illegal test.zip | ||||
abort: archive prefix contains illegal components | ||||
Matt Mackall
|
r12316 | [255] | ||
Martin Geisler
|
r11853 | $ hg archive -t zip -p very/../bad test.zip | ||
$ hg archive --config ui.archivemeta=false -t zip -r 2 test.zip | ||||
$ unzip -t test.zip | ||||
Archive: test.zip | ||||
Augie Fackler
|
r29562 | testing: test/bar*OK (glob) | ||
testing: test/baz/bletch*OK (glob) | ||||
testing: test/foo*OK (glob) | ||||
Martin Geisler
|
r11853 | No errors detected in compressed data of test.zip. | ||
Matt Mackall
|
r12366 | $ hg archive -t tar - | tar tf - 2>/dev/null | ||
Matt Harbison
|
r23231 | test-1701ef1f1510/.hg_archival.txt | ||
test-1701ef1f1510/.hgsub | ||||
test-1701ef1f1510/.hgsubstate | ||||
test-1701ef1f1510/bar | ||||
test-1701ef1f1510/baz/bletch | ||||
test-1701ef1f1510/foo | ||||
Martin Geisler
|
r11853 | |||
$ hg archive -r 0 -t tar rev-%r.tar | ||||
Mads Kiilerich
|
r19870 | $ [ -f rev-0.tar ] | ||
Martin Geisler
|
r11853 | |||
test .hg_archival.txt | ||||
$ hg archive ../test-tags | ||||
$ cat ../test-tags/.hg_archival.txt | ||||
repo: daa7f7c60e0a224faa4ff77ca41b2760562af264 | ||||
Matt Harbison
|
r23231 | node: 1701ef1f151069b8747038e93b5186bb43a47504 | ||
Martin Geisler
|
r11853 | branch: default | ||
latesttag: null | ||||
Matt Harbison
|
r23231 | latesttagdistance: 4 | ||
Siddharth Agarwal
|
r23645 | changessincelatesttag: 4 | ||
Martin Geisler
|
r11853 | $ hg tag -r 2 mytag | ||
$ hg tag -r 2 anothertag | ||||
$ hg archive -r 2 ../test-lasttag | ||||
$ cat ../test-lasttag/.hg_archival.txt | ||||
repo: daa7f7c60e0a224faa4ff77ca41b2760562af264 | ||||
node: 2c0277f05ed49d1c8328fb9ba92fba7a5ebcb33e | ||||
branch: default | ||||
tag: anothertag | ||||
tag: mytag | ||||
$ hg archive -t bogus test.bogus | ||||
abort: unknown archive type 'bogus' | ||||
Matt Mackall
|
r12316 | [255] | ||
Martin Geisler
|
r11853 | |||
Martin Geisler
|
r13143 | enable progress extension: | ||
$ cp $HGRCPATH $HGRCPATH.no-progress | ||||
$ cat >> $HGRCPATH <<EOF | ||||
> [progress] | ||||
> assume-tty = 1 | ||||
Augie Fackler
|
r13149 | > format = topic bar number | ||
Martin Geisler
|
r13143 | > delay = 0 | ||
> refresh = 0 | ||||
> width = 60 | ||||
> EOF | ||||
Mads Kiilerich
|
r17743 | $ hg archive ../with-progress | ||
\r (no-eol) (esc) | ||||
Matt Harbison
|
r23231 | archiving [ ] 0/6\r (no-eol) (esc) | ||
archiving [======> ] 1/6\r (no-eol) (esc) | ||||
archiving [=============> ] 2/6\r (no-eol) (esc) | ||||
archiving [====================> ] 3/6\r (no-eol) (esc) | ||||
archiving [===========================> ] 4/6\r (no-eol) (esc) | ||||
archiving [==================================> ] 5/6\r (no-eol) (esc) | ||||
archiving [==========================================>] 6/6\r (no-eol) (esc) | ||||
Mads Kiilerich
|
r17743 | \r (no-eol) (esc) | ||
Martin Geisler
|
r13143 | |||
cleanup after progress extension test: | ||||
$ cp $HGRCPATH.no-progress $HGRCPATH | ||||
Martin Geisler
|
r11853 | server errors | ||
$ cat errors.log | ||||
empty repo | ||||
$ hg init ../empty | ||||
$ cd ../empty | ||||
$ hg archive ../test-empty | ||||
abort: no working directory: please specify a revision | ||||
Matt Mackall
|
r12316 | [255] | ||
Martin Geisler
|
r13140 | |||
Martin Geisler
|
r12321 | old file -- date clamped to 1980 | ||
Matt Mackall
|
r12368 | $ touch -t 197501010000 old | ||
Martin Geisler
|
r12321 | $ hg add old | ||
$ hg commit -m old | ||||
$ hg archive ../old.zip | ||||
Augie Fackler
|
r30844 | $ unzip -l ../old.zip | grep -v -- ----- | egrep -v files$ | ||
Martin Geisler
|
r12321 | Archive: ../old.zip | ||
Brodie Rao
|
r12375 | \s*Length.* (re) | ||
Siddharth Agarwal
|
r23645 | *172*80*00:00*old/.hg_archival.txt (glob) | ||
Brodie Rao
|
r12376 | *0*80*00:00*old/old (glob) | ||
Mads Kiilerich
|
r16913 | |||
Angel Ezquerra
|
r18967 | show an error when a provided pattern matches no files | ||
$ hg archive -I file_that_does_not_exist.foo ../empty.zip | ||||
abort: no files match the archive pattern | ||||
[255] | ||||
$ hg archive -X * ../empty.zip | ||||
abort: no files match the archive pattern | ||||
[255] | ||||
Mads Kiilerich
|
r16913 | $ cd .. | ||
FUJIWARA Katsunori
|
r17628 | |||
issue3600: check whether "hg archive" can create archive files which | ||||
are extracted with expected timestamp, even though TZ is not | ||||
configured as GMT. | ||||
$ mkdir issue3600 | ||||
$ cd issue3600 | ||||
$ hg init repo | ||||
$ echo a > repo/a | ||||
$ hg -R repo add repo/a | ||||
$ hg -R repo commit -m '#0' -d '456789012 21600' | ||||
$ cat > show_mtime.py <<EOF | ||||
Augie Fackler
|
r33946 | > from __future__ import absolute_import, print_function | ||
> import os | ||||
> import sys | ||||
timeless
|
r29177 | > print(int(os.stat(sys.argv[1]).st_mtime)) | ||
FUJIWARA Katsunori
|
r17628 | > EOF | ||
$ hg -R repo archive --prefix tar-extracted archive.tar | ||||
$ (TZ=UTC-3; export TZ; tar xf archive.tar) | ||||
Augie Fackler
|
r32940 | $ $PYTHON show_mtime.py tar-extracted/a | ||
FUJIWARA Katsunori
|
r17628 | 456789012 | ||
$ hg -R repo archive --prefix zip-extracted archive.zip | ||||
$ (TZ=UTC-3; export TZ; unzip -q archive.zip) | ||||
Augie Fackler
|
r32940 | $ $PYTHON show_mtime.py zip-extracted/a | ||
FUJIWARA Katsunori
|
r17628 | 456789012 | ||
$ cd .. | ||||