diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2008-03-24 16:00:27 +0100 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2008-03-24 16:00:27 +0100 | 
| commit | f34478cbe0214a201e7ecef3e79ed6c957b7beee (patch) | |
| tree | 1ee05da742488cab51a06e083d26b7b58d829b43 | |
| parent | e0e4478e7b4812f822d60a13a33525f8e529e1e8 (diff) | |
| download | cgit-f34478cbe0214a201e7ecef3e79ed6c957b7beee.tar.gz cgit-f34478cbe0214a201e7ecef3e79ed6c957b7beee.tar.bz2 | |
Refactor snapshot support
The snapshot support needs to be split between output- and config-related
functions to get the layering between shared.c and ui-*.c right. There
is also some codestyle-issues which needs fixing to make the snapshot
functions more similar to the rest of the cgit code.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
| -rw-r--r-- | cgit.h | 8 | ||||
| -rw-r--r-- | shared.c | 27 | ||||
| -rw-r--r-- | ui-shared.c | 17 | ||||
| -rw-r--r-- | ui-snapshot.c | 124 | 
4 files changed, 90 insertions, 86 deletions
| @@ -177,10 +177,18 @@ struct cgit_context {  	struct cgit_page page;  }; +struct cgit_snapshot_format { +	const char *suffix; +	const char *mimetype; +	write_archive_fn_t write_func; +	int bit; +}; +  extern const char *cgit_version;  extern struct cgit_repolist cgit_repolist;  extern struct cgit_context ctx; +extern const struct cgit_snapshot_format cgit_snapshot_formats[];  extern int cgit_cmd;  extern void cgit_prepare_context(struct cgit_context *ctx); @@ -479,3 +479,30 @@ void cgit_diff_commit(struct commit *commit, filepair_fn fn)  		old_sha1 = commit->parents->item->object.sha1;  	cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL);  } + +int cgit_parse_snapshots_mask(const char *str) +{ +	const struct cgit_snapshot_format *f; +	static const char *delim = " \t,:/|;"; +	int 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 = cgit_snapshot_formats; f->suffix; f++) { +			sl = strlen(f->suffix); +			if((tl == sl && !strncmp(f->suffix, str, tl)) || +			   (tl == sl-1 && !strncmp(f->suffix+1, str, tl-1))) { +				rv |= f->bit; +				break; +			} +		} +		str += tl; +	} +	return rv; +} diff --git a/ui-shared.c b/ui-shared.c index 2596023..aa65988 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -573,4 +573,19 @@ void cgit_print_filemode(unsigned short mode)  	html_fileperm(mode);  } -/* vim:set sw=8: */ +void cgit_print_snapshot_links(const char *repo, const char *head, +			       const char *hex, int snapshots) +{ +	const struct cgit_snapshot_format* f; +    	char *filename; + +	for (f = cgit_snapshot_formats; f->suffix; f++) { +		if (!(snapshots & f->bit)) +			continue; +		filename = fmt("%s-%s%s", cgit_repobasename(repo), hex, +			       f->suffix); +		cgit_snapshot_link(filename, NULL, NULL, (char *)head, +				   (char *)hex, filename); +		html("<br/>"); +	} +} diff --git a/ui-snapshot.c b/ui-snapshot.c index c741469..512fcd2 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -55,105 +55,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(const char *head, const char *hex, const char *prefix, -			 const char *filename, int snapshots) +static int make_snapshot(const struct cgit_snapshot_format *format, +			 const char *hex, const char *prefix, +			 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; -		ctx.page.mimetype = xstrdup(sat->mimetype); -		ctx.page.filename = xstrdup(filename); -		cgit_print_http_headers(&ctx); -		(*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; - -	/* 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; +	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; +		make_snapshot(f, hex, prefix, filename); +		return;  	} -	return rv; +	cgit_print_error(fmt("Unsupported snapshot format: %s", filename));  } - -/* vim:set sw=8: */ | 
