diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2007-02-04 22:55:19 +0100 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2007-02-04 22:55:19 +0100 | 
| commit | 8fb2f056961e577a039ae185d89ab8e2d2840b9e (patch) | |
| tree | a009aca3c52dd134faa48181daede79bd930f9a4 | |
| parent | ce1c7336e5b3e3ebe8f8c9029c405aedec98c208 (diff) | |
Add support for lightweight tags
There is nothing bad about a tag that has no tag-object, but the old code
didn't handle such tags correctly. Fix it.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
| -rw-r--r-- | git.h | 4 | ||||
| -rw-r--r-- | ui-summary.c | 52 | 
2 files changed, 37 insertions, 19 deletions
| @@ -278,6 +278,10 @@ struct object {  }; +/** Returns the object, having parsed it to find out what it is. **/ +struct object *parse_object(const unsigned char *sha1); + +  /*   * from git:tree.h   */ diff --git a/ui-summary.c b/ui-summary.c index 5518d01..ff3ed4d 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -47,16 +47,42 @@ static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,  	return 0;  } + +static void cgit_print_object_ref(struct object *obj) +{ +	char *page, *url; + +	if (obj->type == OBJ_COMMIT) +		page = "commit"; +	else if (obj->type == OBJ_TREE) +		page = "tree"; +	else +		page = "view"; + +	url = cgit_pageurl(cgit_query_repo, page,  +			   fmt("id=%s", sha1_to_hex(obj->sha1))); +	html_link_open(url, NULL, NULL); +	htmlf("%s %s", type_names[obj->type],  +	      sha1_to_hex(obj->sha1)); +	html_link_close(); +} +  static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,  				int flags, void *cb_data)  {  	struct tag *tag;  	struct taginfo *info; -	char buf[256], *page, *url; - +	struct object *obj; +	char buf[256], *url; +   	strncpy(buf, refname, sizeof(buf)); -	tag = lookup_tag(sha1); -	if (tag && !parse_tag(tag) && (info = cgit_parse_tag(tag))){ +	obj = parse_object(sha1); +	if (!obj) +		return 1; +	if (obj->type == OBJ_TAG) { +		tag = lookup_tag(sha1); +		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) +			return 2;  		html("<tr><td>");  		url = cgit_pageurl(cgit_query_repo, "view",   				   fmt("id=%s", sha1_to_hex(sha1))); @@ -70,25 +96,13 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,  		if (info->tagger)  			html(info->tagger);  		html("</td><td>"); -		if (tag->tagged->type == OBJ_COMMIT) -			page = "commit"; -		else if (tag->tagged->type == OBJ_TREE) -			page = "tree"; -		else -			page = "view"; -		 -		url = cgit_pageurl(cgit_query_repo, page,  -				   fmt("id=%s", sha1_to_hex(tag->tagged->sha1))); -		html_link_open(url, NULL, NULL); -		htmlf("%s %s", type_names[tag->tagged->type],  -		      sha1_to_hex(tag->tagged->sha1)); -		html_link_close(); +		cgit_print_object_ref(tag->tagged);  		html("</td></tr>\n");  	} else {  		html("<tr><td>");  		html_txt(buf); -		html("</td><td colspan='3'>"); -		htmlf("*** bad ref %s ***", sha1_to_hex(sha1)); +		html("</td><td colspan='2'/><td>"); +		cgit_print_object_ref(obj);  		html("</td></tr>\n");  	}  	return 0; | 
