diff options
Diffstat (limited to '')
| -rw-r--r-- | ui-snapshot.c | 121 | 
1 files changed, 39 insertions, 82 deletions
| diff --git a/ui-snapshot.c b/ui-snapshot.c index dfedd8f..966a140 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -7,6 +7,8 @@   */  #include "cgit.h" +#include "html.h" +#include "ui-shared.h"  static int write_compressed_tar_archive(struct archiver_args *args,const char *filter)  { @@ -54,104 +56,59 @@ static int write_tar_bzip2_archive(struct archiver_args *args)  	return write_compressed_tar_archive(args,"bzip2");  } -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 },  	{ ".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 } +	{ ".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;  	struct commit *commit;  	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; -		} -		commit = lookup_commit_reference(sha1); -		if(!commit) { -			cgit_print_error(fmt("Not a commit reference: %s", hex)); -			return;; -		} -		memset(&args,0,sizeof(args)); -		args.base = fmt("%s/", prefix); -		args.tree = commit->tree; -		args.time = commit->date; -		cgit_print_snapshot_start(sat->mimetype, filename, item); -		(*sat->write_func)(&args); -		return; +	if(get_sha1(hex, sha1)) { +		cgit_print_error(fmt("Bad object id: %s", hex)); +		return 1;  	} -	cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); -} - -void cgit_print_snapshot_links(const char *repo, const char *head, -			       const char *hex, int snapshots) -{ -	const struct snapshot_archive_t* sat; -    	char *filename; -	int f; - -	for(f=0; f<snapshot_archives_len; f++) { -		sat = &snapshot_archives[f]; -		if(!(snapshots & sat->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/>"); +	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); +	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;  } -int cgit_parse_snapshots_mask(const char *str) +void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, +			 const char *filename, int snapshots)  { -	const struct snapshot_archive_t* sat; -	static const char *delim = " \t,:/|;"; -	int f, tl, sl, rv = 0; +	const struct cgit_snapshot_format* f; +	int sl, fnl; -	/* 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; +	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; +		make_snapshot(f, hex, prefix, filename); +		return;  	} -	return rv; +	cgit_print_error(fmt("Unsupported snapshot format: %s", filename));  } - -/* vim:set sw=8: */ | 
