-rw-r--r-- | ui-snapshot.c | 101 |
1 files changed, 29 insertions, 72 deletions
diff --git a/ui-snapshot.c b/ui-snapshot.c index dfedd8f..966a140 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -9,2 +9,4 @@ #include "cgit.h" +#include "html.h" +#include "ui-shared.h" @@ -56,8 +58,3 @@ static int write_tar_bzip2_archive(struct archiver_args *args) -static const struct snapshot_archive_t { - const char *suffix; - const char *mimetype; - write_archive_fn_t write_func; - int bit; -} snapshot_archives[] = { +const struct cgit_snapshot_format cgit_snapshot_formats[] = { { ".zip", "application/x-zip", write_zip_archive, 0x1 }, @@ -65,12 +62,10 @@ static const struct snapshot_archive_t { { ".tar.bz2", "application/x-tar", write_tar_bzip2_archive, 0x4 }, - { ".tar", "application/x-tar", write_tar_archive, 0x8 } + { ".tar", "application/x-tar", write_tar_archive, 0x8 }, + {} }; -#define snapshot_archives_len (sizeof(snapshot_archives) / sizeof(*snapshot_archives)) - -void cgit_print_snapshot(struct cacheitem *item, const char *head, +static int make_snapshot(const struct cgit_snapshot_format *format, const char *hex, const char *prefix, - const char *filename, int snapshots) + const char *filename) { - const struct snapshot_archive_t* sat; struct archiver_args args; @@ -78,16 +73,6 @@ void cgit_print_snapshot(struct cacheitem *item, const char *head, unsigned char sha1[20]; - int f, sl, fnl = strlen(filename); - for(f=0; f<snapshot_archives_len; f++) { - sat = &snapshot_archives[f]; - if(!(snapshots & sat->bit)) - continue; - sl = strlen(sat->suffix); - if(fnl<sl || strcmp(&filename[fnl-sl],sat->suffix)) - continue; - if (!hex) - hex = head; if(get_sha1(hex, sha1)) { cgit_print_error(fmt("Bad object id: %s", hex)); - return; + return 1; } @@ -96,3 +81,3 @@ void cgit_print_snapshot(struct cacheitem *item, const char *head, cgit_print_error(fmt("Not a commit reference: %s", hex)); - return;; + return 1; } @@ -102,56 +87,28 @@ void cgit_print_snapshot(struct cacheitem *item, const char *head, args.time = commit->date; - cgit_print_snapshot_start(sat->mimetype, filename, item); - (*sat->write_func)(&args); - return; - } - cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); + 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_links(const char *repo, const char *head, - const char *hex, int snapshots) +void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, + const char *filename, int snapshots) { - const struct snapshot_archive_t* sat; - char *filename; - int f; + const struct cgit_snapshot_format* f; + int sl, fnl; - for(f=0; f<snapshot_archives_len; f++) { - sat = &snapshot_archives[f]; - if(!(snapshots & sat->bit)) + fnl = strlen(filename); + if (!hex) + hex = head; + for (f = cgit_snapshot_formats; f->suffix; f++) { + if (!(snapshots & f->bit)) continue; - filename = fmt("%s-%s%s", cgit_repobasename(repo), hex, - sat->suffix); - cgit_snapshot_link(filename, NULL, NULL, (char *)head, - (char *)hex, filename); - html("<br/>"); - } -} - -int cgit_parse_snapshots_mask(const char *str) -{ - const struct snapshot_archive_t* sat; - static const char *delim = " \t,:/|;"; - int f, tl, sl, rv = 0; - - /* favor legacy setting */ - if(atoi(str)) - return 1; - for(;;) { - str += strspn(str,delim); - tl = strcspn(str,delim); - if(!tl) - break; - for(f=0; f<snapshot_archives_len; f++) { - sat = &snapshot_archives[f]; - sl = strlen(sat->suffix); - if((tl == sl && !strncmp(sat->suffix, str, tl)) || - (tl == sl-1 && !strncmp(sat->suffix+1, str, tl-1))) { - rv |= sat->bit; - break; - } - } - str += tl; + sl = strlen(f->suffix); + if(fnl < sl || strcmp(&filename[fnl-sl], f->suffix)) + continue; + make_snapshot(f, hex, prefix, filename); + return; } - return rv; + cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); } - -/* vim:set sw=8: */ |