cgit

commit 8fb2f056961e577a039ae185d89ab8e2d2840b9e

Author: Lars Hjemli <hjemli@gmail.com>

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>

 git.h | 4 ++++
 ui-summary.c | 52 +++++++++++++++++++++++++++++++++-------------------


diff --git a/git.h b/git.h
index 991eaa5e313c9524419545b4c3ab3b1f0c212123..eca48d5b1484024e7a2f61de8b782c956513ca8f 100644
--- a/git.h
+++ b/git.h
@@ -278,6 +278,10 @@ 	unsigned char sha1[20];
 };
 
 
+/** 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 5518d011d8156572255290126741dca74aab0fbf..ff3ed4d2859baa49d8b3958003f2cd28a594c27a 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -47,16 +47,42 @@ 	}
 	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 @@ 		html("");
 		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;