summary refs log tree commit diff
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2007-02-04 22:55:19 +0100
committerLars Hjemli <hjemli@gmail.com>2007-02-04 22:55:19 +0100
commit8fb2f056961e577a039ae185d89ab8e2d2840b9e (patch)
treea009aca3c52dd134faa48181daede79bd930f9a4
parentce1c7336e5b3e3ebe8f8c9029c405aedec98c208 (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.h4
-rw-r--r--ui-summary.c52
2 files changed, 37 insertions, 19 deletions
diff --git a/git.h b/git.h
index 991eaa5..eca48d5 100644
--- a/git.h
+++ b/git.h
@@ -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;