diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2008-12-06 11:34:48 +0100 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2008-12-06 11:34:48 +0100 | 
| commit | e550440233875b298f8574e9273457516791010f (patch) | |
| tree | 37464c686f1f2d8c5ba513c7dca5daa886dc81a6 | |
| parent | 3157ea3b7e5204dba2892ffb54d641746c4c7ca4 (diff) | |
| parent | c57aceb1d2f1a7d9fd3218fc8c6e9ea01b2952d2 (diff) | |
Merge branch 'snapshot-fixes'
| -rw-r--r-- | cmd.c | 3 | ||||
| -rw-r--r-- | ui-refs.c | 37 | ||||
| -rw-r--r-- | ui-shared.c | 17 | ||||
| -rw-r--r-- | ui-snapshot.c | 94 | ||||
| -rw-r--r-- | ui-snapshot.h | 3 | 
5 files changed, 94 insertions, 60 deletions
| @@ -104,8 +104,7 @@ static void refs_fn(struct cgit_context *ctx)  static void snapshot_fn(struct cgit_context *ctx)  { -	cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, -			    cgit_repobasename(ctx->repo->url), ctx->qry.path, +	cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path,  			    ctx->repo->snapshots, ctx->qry.nohead);  } @@ -78,12 +78,37 @@ static int print_branch(struct refinfo *ref)  static void print_tag_header()  {  	html("<tr class='nohover'><th class='left'>Tag</th>" -	     "<th class='left'>Reference</th>" +	     "<th class='left'>Download</th>"  	     "<th class='left'>Author</th>"  	     "<th class='left' colspan='2'>Age</th></tr>\n");  	header = 1;  } +static void print_tag_downloads(const struct cgit_repo *repo, const char *ref) +{ +	const struct cgit_snapshot_format* f; +    	char *filename; +	const char *basename; + +	if (!ref || strlen(ref) < 2) +		return; + +	basename = cgit_repobasename(repo->url); +	if (prefixcmp(ref, basename) != 0) { +		if ((ref[0] == 'v' || ref[0] == 'V') && isdigit(ref[1])) +			ref++; +		if (isdigit(ref[0])) +			ref = xstrdup(fmt("%s-%s", basename, ref)); +	} + +	for (f = cgit_snapshot_formats; f->suffix; f++) { +		if (!(repo->snapshots & f->bit)) +			continue; +		filename = fmt("%s%s", ref, f->suffix); +		cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename); +		html("  "); +	} +}  static int print_tag(struct refinfo *ref)  {  	struct tag *tag; @@ -98,7 +123,10 @@ static int print_tag(struct refinfo *ref)  		html("<tr><td>");  		cgit_tag_link(name, NULL, NULL, ctx.qry.head, name);  		html("</td><td>"); -		cgit_object_link(tag->tagged); +		if (ctx.repo->snapshots && (tag->tagged->type == OBJ_COMMIT)) +			print_tag_downloads(ctx.repo, name); +		else +			cgit_object_link(tag->tagged);  		html("</td><td>");  		if (info->tagger)  			html(info->tagger); @@ -112,7 +140,10 @@ static int print_tag(struct refinfo *ref)  		html("<tr><td>");  		html_txt(name);  		html("</td><td>"); -		cgit_object_link(ref->object); +		if (ctx.repo->snapshots && (tag->tagged->type == OBJ_COMMIT)) +			print_tag_downloads(ctx.repo, name); +		else +			cgit_object_link(ref->object);  		html("</td></tr>\n");  	}  	return 0; diff --git a/ui-shared.c b/ui-shared.c index 224e5f3..9319881 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -365,11 +365,14 @@ void cgit_patch_link(char *name, char *title, char *class, char *head,  void cgit_object_link(struct object *obj)  { -	char *page, *rev, *name; +	char *page, *shortrev, *fullrev, *name; +	fullrev = sha1_to_hex(obj->sha1); +	shortrev = xstrdup(fullrev); +	shortrev[10] = '\0';  	if (obj->type == OBJ_COMMIT) { -                cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL, -				 ctx.qry.head, sha1_to_hex(obj->sha1)); +                cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, +				 ctx.qry.head, fullrev);  		return;  	} else if (obj->type == OBJ_TREE)  		page = "tree"; @@ -377,9 +380,8 @@ void cgit_object_link(struct object *obj)  		page = "tag";  	else  		page = "blob"; -	rev = sha1_to_hex(obj->sha1); -	name = fmt("%s %s", typename(obj->type), rev); -	reporevlink(page, name, NULL, NULL, ctx.qry.head, rev, NULL); +	name = fmt("%s %s...", typename(obj->type), shortrev); +	reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL);  }  void cgit_print_date(time_t secs, char *format, int local_time) @@ -707,8 +709,7 @@ void cgit_print_snapshot_links(const char *repo, const char *head,  			continue;  		filename = fmt("%s-%s%s", cgit_repobasename(repo), hex,  			       f->suffix); -		cgit_snapshot_link(filename, NULL, NULL, (char *)head, -				   (char *)hex, filename); +		cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename);  		html("<br/>");  	}  } diff --git a/ui-snapshot.c b/ui-snapshot.c index 9c4d086..6f09151 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -114,58 +114,53 @@ static int make_snapshot(const struct cgit_snapshot_format *format,  	return 0;  } -char *dwim_filename = NULL; -const char *dwim_refname = NULL; - -static int ref_cb(const char *refname, const unsigned char *sha1, int flags, -		  void *cb_data) -{ -	const char *r = refname; -	while (r && *r) { -		fprintf(stderr, "  cmp %s with %s:", dwim_filename, r); -		if (!strcmp(dwim_filename, r)) { -			fprintf(stderr, "MATCH!\n"); -			dwim_refname = refname; -			return 1; -		} -		fprintf(stderr, "no match\n"); -		if (isdigit(*r)) -			break; -		r++; -	} -	return 0; -} - -/* Try to guess the requested revision by combining repo name and tag name - * and comparing this to the requested snapshot name. E.g. the requested - * snapshot is "cgit-0.7.2.tar.gz" while repo name is "cgit" and tag name - * is "v0.7.2". First, the reponame is stripped off, leaving "-0.7.2.tar.gz". - * Next, any '-' and '_' characters are stripped, leaving "0.7.2.tar.gz". - * Finally, the requested format suffix is removed and we end up with "0.7.2". - * Then we test each tag against this dwimmed filename, and for each tag - * we even try to remove any leading characters which are non-digits. I.e. - * we first compare with "v0.7.2", then with "0.7.2" and we've got a match. +/* Try to guess the requested revision from the requested snapshot name. + * First the format extension is stripped, e.g. "cgit-0.7.2.tar.gz" become + * "cgit-0.7.2". If this is a valid commit object name we've got a winner. + * Otherwise, if the snapshot name has a prefix matching the result from + * repo_basename(), we strip the basename and any following '-' and '_' + * characters ("cgit-0.7.2" -> "0.7.2") and check the resulting name once + * more. If this still isn't a valid commit object name, we check if pre- + * pending a 'v' to the remaining snapshot name ("0.7.2" -> "v0.7.2") gives + * us something valid.   */  static const char *get_ref_from_filename(const char *url, const char *filename, -					 const struct cgit_snapshot_format *fmt) +					 const struct cgit_snapshot_format *format)  { -	const char *reponame = cgit_repobasename(url); -	fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename); -	if (prefixcmp(filename, reponame)) -		return NULL; -	filename += strlen(reponame); -	while (filename && (*filename == '-' || *filename == '_')) -		filename++; -	dwim_filename = xstrdup(filename); -	dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0'; -	for_each_tag_ref(ref_cb, NULL); -	return dwim_refname; +	const char *reponame; +	unsigned char sha1[20]; +	char *snapshot; + +	snapshot = xstrdup(filename); +	snapshot[strlen(snapshot) - strlen(format->suffix)] = '\0'; +	fprintf(stderr, "snapshot=%s\n", snapshot); + +	if (get_sha1(snapshot, sha1) == 0) +		return snapshot; + +	reponame = cgit_repobasename(url); +	fprintf(stderr, "reponame=%s\n", reponame); +	if (prefixcmp(snapshot, reponame) == 0) { +		snapshot += strlen(reponame); +		while (snapshot && (*snapshot == '-' || *snapshot == '_')) +			snapshot++; +	} + +	if (get_sha1(snapshot, sha1) == 0) +		return snapshot; + +	snapshot = fmt("v%s", snapshot); +	if (get_sha1(snapshot, sha1) == 0) +		return snapshot; + +	return NULL;  } -void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, +void cgit_print_snapshot(const char *head, const char *hex,  			 const char *filename, int snapshots, int dwim)  {  	const struct cgit_snapshot_format* f; +	char *prefix = NULL;  	f = get_format(filename);  	if (!f) { @@ -178,11 +173,20 @@ void cgit_print_snapshot(const char *head, const char *hex, const char *prefix,  		return;  	} -	if (!hex && dwim) +	if (!hex && dwim) {  		hex = get_ref_from_filename(ctx.repo->url, filename, f); +		if (hex != NULL) { +			prefix = xstrdup(filename); +			prefix[strlen(filename) - strlen(f->suffix)] = '\0'; +		} +	}  	if (!hex)  		hex = head; +	if (!prefix) +		prefix = xstrdup(cgit_repobasename(ctx.repo->url)); +  	make_snapshot(f, hex, prefix, filename); +	free(prefix);  } diff --git a/ui-snapshot.h b/ui-snapshot.h index 3540303..b6ede52 100644 --- a/ui-snapshot.h +++ b/ui-snapshot.h @@ -2,7 +2,6 @@  #define UI_SNAPSHOT_H  extern void cgit_print_snapshot(const char *head, const char *hex, -				const char *prefix, const char *filename, -				int snapshot, int dwim); +				const char *filename, int snapshot, int dwim);  #endif /* UI_SNAPSHOT_H */ | 
