tests/test-archive
author Martin Geisler <mg@aragost.com>
Mon, 20 Sep 2010 15:33:39 +0200
branchstable
changeset 12319 381f131220ad
parent 10650 9ea7238ad935
child 12379 6aa2c86db2eb
permissions -rwxr-xr-x
archive: set date to 1980 for very old zip files The zip file format stores the date using "MS-DOS format" which apparently means that they use 1980 as their epoch. Python's zipfile module emits deprecation warnings of this form /usr/lib/python2.6/zipfile.py:1108: DeprecationWarning: struct integer overflow masking is deprecated self.fp.write(zinfo.FileHeader()) /usr/lib/python2.6/zipfile.py:1108: DeprecationWarning: 'H' format requires 0 <= number <= 65535 self.fp.write(zinfo.FileHeader()) /home/mg/src/mercurial-crew/mercurial/archival.py:169: DeprecationWarning: struct integer overflow masking is deprecated self.z.close() /home/mg/src/mercurial-crew/mercurial/archival.py:169: DeprecationWarning: 'H' format requires 0 <= number <= 65535 self.z.close() when it is given such old timestamps. This fixes this by silently clamping the date to 1980.

#!/bin/sh

mkdir test
cd test
hg init
echo foo>foo
hg commit -Am 1 -d '1 0'
echo bar>bar
hg commit -Am 2 -d '2 0'
mkdir baz
echo bletch>baz/bletch
hg commit -Am 3 -d '1000000000 0'
echo "[web]" >> .hg/hgrc
echo "name = test-archive" >> .hg/hgrc
cp .hg/hgrc .hg/hgrc-base

# check http return codes
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
    "$TESTDIR/get-with-headers.py" localhost:$HGPORT "/archive/tip.$2" | head -n 1
    echo % $3 and $4 disallowed should both give 403
    "$TESTDIR/get-with-headers.py" localhost:$HGPORT "/archive/tip.$3" | head -n 1
    "$TESTDIR/get-with-headers.py" localhost:$HGPORT "/archive/tip.$4" | head -n 1
    "$TESTDIR/killdaemons.py"
    cat errors.log
    cp .hg/hgrc-base .hg/hgrc
}

echo
test_archtype gz tar.gz tar.bz2 zip
test_archtype bz2 tar.bz2 zip tar.gz
test_archtype zip zip tar.gz tar.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

echo % invalid arch type should give 404
"$TESTDIR/get-with-headers.py" localhost:$HGPORT "/archive/tip.invalid" | head -n 1
echo

TIP=`hg id -v | cut -f1 -d' '`
QTIP=`hg id -q`
cat > getarchive.py <<EOF
import os, sys, urllib2
try:
    # Set stdout to binary mode for win32 platforms
    import msvcrt
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
except ImportError:
    pass
    
node, archive = sys.argv[1:]
f = urllib2.urlopen('http://127.0.0.1:%s/?cmd=archive;node=%s;type=%s'
                    % (os.environ['HGPORT'], node, archive))
sys.stdout.write(f.read())
EOF
python getarchive.py "$TIP" gz | gunzip | tar tf - 2>/dev/null | sed "s/$QTIP/TIP/"
python getarchive.py "$TIP" bz2 | bunzip2 | tar tf - 2>/dev/null | sed "s/$QTIP/TIP/"
python getarchive.py "$TIP" zip > archive.zip
unzip -t archive.zip | sed "s/$QTIP/TIP/"

"$TESTDIR/killdaemons.py"

hg archive -t tar test.tar
tar tf test.tar

hg archive -t tbz2 -X baz test.tar.bz2
bunzip2 -dc test.tar.bz2 | tar tf - 2>/dev/null

hg archive -t tgz -p %b-%h test-%h.tar.gz
gzip -dc test-$QTIP.tar.gz | tar tf - 2>/dev/null | sed "s/$QTIP/TIP/"

hg archive autodetected_test.tar
tar tf autodetected_test.tar

# The '-t' should override autodetection
hg archive -t tar autodetect_override_test.zip
tar tf autodetect_override_test.zip

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
try:
    from hashlib import md5
except ImportError:
    from md5 import md5
import sys
f1, f2 = sys.argv[1:3]
h1 = md5(file(f1, 'rb').read()).hexdigest()
h2 = md5(file(f2, 'rb').read()).hexdigest()
print h1 == h2 or "md5 differ: " + repr((h1, h2))
EOF

# archive name is stored in the archive, so create similar
# archives and rename them afterwards.
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
python md5comp.py tip1.tar.gz tip2.tar.gz

hg archive -t zip -p /illegal test.zip
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

hg archive -t tar - | tar tf - 2>/dev/null | sed "s/$QTIP/TIP/"

hg archive -r 0 -t tar rev-%r.tar
if [ -f rev-0.tar ]; then
    echo 'rev-0.tar created'
fi

echo '% test .hg_archival.txt'
hg archive ../test-tags
cat ../test-tags/.hg_archival.txt
hg tag -r 2 mytag
hg tag -r 2 anothertag
hg archive -r 2 ../test-lasttag
cat ../test-lasttag/.hg_archival.txt

hg archive -t bogus test.bogus

echo % server errors
cat errors.log

echo '% empty repo'
hg init ../empty
cd ../empty
hg archive ../test-empty

echo '% old file -- date clamped to 1980'
touch -d 1975-01-01 old
hg add old
hg commit -m old
hg archive ../old.zip
unzip -l ../old.zip

exit 0