summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rwxr-xr-xtests/t0107-snapshot.sh5
-rw-r--r--ui-snapshot.c8
2 files changed, 11 insertions, 2 deletions
diff --git a/tests/t0107-snapshot.sh b/tests/t0107-snapshot.sh
index 8e90e10..d97c465 100755
--- a/tests/t0107-snapshot.sh
+++ b/tests/t0107-snapshot.sh
@@ -1,36 +1,39 @@
#!/bin/sh
. ./setup.sh
prepare_tests "Verify snapshot"
run_test 'get foo/snapshot/test.tar.gz' '
cgit_url "foo/snapshot/test.tar.gz" >trash/tmp
'
run_test 'check html headers' '
head -n 1 trash/tmp |
grep -e "Content-Type: application/x-tar" &&
head -n 2 trash/tmp |
grep -e "Content-Disposition: inline; filename=.test.tar.gz."
'
run_test 'strip off the header lines' '
tail -n +6 trash/tmp > trash/test.tar.gz
'
run_test 'verify gzip format' 'gunzip --test trash/test.tar.gz'
-run_test 'untar' 'tar -xf trash/test.tar.gz -C trash'
+run_test 'untar' '
+ rm -rf trash/foo &&
+ tar -xf trash/test.tar.gz -C trash
+'
run_test 'count files' '
c=$(ls -1 trash/foo/ | wc -l) &&
test $c = 5
'
run_test 'verify untarred file-5' '
grep -e "^5$" trash/foo/file-5 &&
test $(cat trash/foo/file-5 | wc -l) = 1
'
tests_done
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 966a140..7a597ff 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -61,49 +61,55 @@ const struct cgit_snapshot_format cgit_snapshot_formats[] = {
{ ".tar.gz", "application/x-tar", write_tar_gzip_archive, 0x2 },
{ ".tar.bz2", "application/x-tar", write_tar_bzip2_archive, 0x4 },
{ ".tar", "application/x-tar", write_tar_archive, 0x8 },
{}
};
static int make_snapshot(const struct cgit_snapshot_format *format,
const char *hex, const char *prefix,
const char *filename)
{
struct archiver_args args;
struct commit *commit;
unsigned char sha1[20];
if(get_sha1(hex, sha1)) {
cgit_print_error(fmt("Bad object id: %s", hex));
return 1;
}
commit = lookup_commit_reference(sha1);
if(!commit) {
cgit_print_error(fmt("Not a commit reference: %s", hex));
return 1;
}
memset(&args, 0, sizeof(args));
- args.base = fmt("%s/", prefix);
+ if (prefix) {
+ args.base = fmt("%s/", prefix);
+ args.baselen = strlen(prefix) + 1;
+ } else {
+ args.base = "";
+ args.baselen = 0;
+ }
args.tree = commit->tree;
args.time = commit->date;
ctx.page.mimetype = xstrdup(format->mimetype);
ctx.page.filename = xstrdup(filename);
cgit_print_http_headers(&ctx);
format->write_func(&args);
return 0;
}
void cgit_print_snapshot(const char *head, const char *hex, const char *prefix,
const char *filename, int snapshots)
{
const struct cgit_snapshot_format* f;
int sl, fnl;
fnl = strlen(filename);
if (!hex)
hex = head;
for (f = cgit_snapshot_formats; f->suffix; f++) {
if (!(snapshots & f->bit))
continue;
sl = strlen(f->suffix);
if(fnl < sl || strcmp(&filename[fnl-sl], f->suffix))
continue;