summaryrefslogtreecommitdiffabout
path: root/ui-snapshot.c
Unidiff
Diffstat (limited to 'ui-snapshot.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-snapshot.c8
1 files changed, 7 insertions, 1 deletions
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[] = {
61 { ".tar.gz", "application/x-tar", write_tar_gzip_archive, 0x2 }, 61 { ".tar.gz", "application/x-tar", write_tar_gzip_archive, 0x2 },
62 { ".tar.bz2", "application/x-tar", write_tar_bzip2_archive, 0x4 }, 62 { ".tar.bz2", "application/x-tar", write_tar_bzip2_archive, 0x4 },
63 { ".tar", "application/x-tar", write_tar_archive, 0x8 }, 63 { ".tar", "application/x-tar", write_tar_archive, 0x8 },
64 {} 64 {}
65}; 65};
66 66
67static int make_snapshot(const struct cgit_snapshot_format *format, 67static int make_snapshot(const struct cgit_snapshot_format *format,
68 const char *hex, const char *prefix, 68 const char *hex, const char *prefix,
69 const char *filename) 69 const char *filename)
70{ 70{
71 struct archiver_args args; 71 struct archiver_args args;
72 struct commit *commit; 72 struct commit *commit;
73 unsigned char sha1[20]; 73 unsigned char sha1[20];
74 74
75 if(get_sha1(hex, sha1)) { 75 if(get_sha1(hex, sha1)) {
76 cgit_print_error(fmt("Bad object id: %s", hex)); 76 cgit_print_error(fmt("Bad object id: %s", hex));
77 return 1; 77 return 1;
78 } 78 }
79 commit = lookup_commit_reference(sha1); 79 commit = lookup_commit_reference(sha1);
80 if(!commit) { 80 if(!commit) {
81 cgit_print_error(fmt("Not a commit reference: %s", hex)); 81 cgit_print_error(fmt("Not a commit reference: %s", hex));
82 return 1; 82 return 1;
83 } 83 }
84 memset(&args, 0, sizeof(args)); 84 memset(&args, 0, sizeof(args));
85 args.base = fmt("%s/", prefix); 85 if (prefix) {
86 args.base = fmt("%s/", prefix);
87 args.baselen = strlen(prefix) + 1;
88 } else {
89 args.base = "";
90 args.baselen = 0;
91 }
86 args.tree = commit->tree; 92 args.tree = commit->tree;
87 args.time = commit->date; 93 args.time = commit->date;
88 ctx.page.mimetype = xstrdup(format->mimetype); 94 ctx.page.mimetype = xstrdup(format->mimetype);
89 ctx.page.filename = xstrdup(filename); 95 ctx.page.filename = xstrdup(filename);
90 cgit_print_http_headers(&ctx); 96 cgit_print_http_headers(&ctx);
91 format->write_func(&args); 97 format->write_func(&args);
92 return 0; 98 return 0;
93} 99}
94 100
95void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, 101void cgit_print_snapshot(const char *head, const char *hex, const char *prefix,
96 const char *filename, int snapshots) 102 const char *filename, int snapshots)
97{ 103{
98 const struct cgit_snapshot_format* f; 104 const struct cgit_snapshot_format* f;
99 int sl, fnl; 105 int sl, fnl;
100 106
101 fnl = strlen(filename); 107 fnl = strlen(filename);
102 if (!hex) 108 if (!hex)
103 hex = head; 109 hex = head;
104 for (f = cgit_snapshot_formats; f->suffix; f++) { 110 for (f = cgit_snapshot_formats; f->suffix; f++) {
105 if (!(snapshots & f->bit)) 111 if (!(snapshots & f->bit))
106 continue; 112 continue;
107 sl = strlen(f->suffix); 113 sl = strlen(f->suffix);
108 if(fnl < sl || strcmp(&filename[fnl-sl], f->suffix)) 114 if(fnl < sl || strcmp(&filename[fnl-sl], f->suffix))
109 continue; 115 continue;