-rwxr-xr-x | tests/t0107-snapshot.sh | 5 | ||||
-rw-r--r-- | ui-snapshot.c | 8 |
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; |