diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2008-04-08 21:29:21 +0200 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2008-04-08 21:29:21 +0200 | 
| commit | 23296ad648c0e2a9e3cf40a3de322b10ad25cce3 (patch) | |
| tree | 136493d8228b0ff4971feb06b0e8aee296367b00 /ui-snapshot.c | |
| parent | Use GIT-1.5.5-rc2 (diff) | |
| parent | Reset ctx.repo to NULL when the config parser is finished (diff) | |
| download | cgit-23296ad648c0e2a9e3cf40a3de322b10ad25cce3.tar.gz cgit-23296ad648c0e2a9e3cf40a3de322b10ad25cce3.tar.bz2 cgit-23296ad648c0e2a9e3cf40a3de322b10ad25cce3.zip | |
Merge branch 'lh/cleanup'
* lh/cleanup: (21 commits)
  Reset ctx.repo to NULL when the config parser is finished
  Move cgit_parse_query() from parsing.c to html.c as http_parse_querystring()
  Move function for configfile parsing into configfile.[ch]
  Add cache.h
  Remove global and obsolete cgit_cmd
  Makefile: copy the QUIET constructs from the Makefile in git.git
  Move cgit_version from shared.c to cgit.c
  Makefile: autobuild dependency rules
  Initial Makefile cleanup
  Move non-generic functions from shared.c to cgit.c
  Add ui-shared.h
  Add separate header-files for each page/view
  Refactor snapshot support
  Add command dispatcher
  Remove obsolete cacheitem parameter to ui-functions
  Add struct cgit_page to cgit_context
  Introduce html.h
  Improve initialization of git directory
  Move cgit_repo into cgit_context
  Add all config variables into struct cgit_context
  ...
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: */ | 
