about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2007-05-11 23:44:42 +0200
committerLars Hjemli <hjemli@gmail.com>2007-05-11 23:44:42 +0200
commit9f48df63f6d8d9a8abcc02cd2f08293da7081520 (patch)
treed171ce9834577d3133e584c821f78806fbe0daef
parentMakefile: add support for building w.o. preinstalled git (diff)
downloadcgit-pink-9f48df63f6d8d9a8abcc02cd2f08293da7081520.tar.gz
cgit-pink-9f48df63f6d8d9a8abcc02cd2f08293da7081520.zip
Add links to enable downloading of tagged blobs
All tags below refs/archives are shown on the repo summary page as
download links. The links referes to the tagged objects, using the
tag name as filename for download.

This can be used to add shortcuts for release tarballs, documentation
and other blobs stored in the object database, especially blobs that
are not reachable during cloning.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to '')
-rw-r--r--cgit.css20
-rw-r--r--ui-summary.c74
2 files changed, 85 insertions, 9 deletions
diff --git a/cgit.css b/cgit.css
index ef4bc62..49cf2d1 100644
--- a/cgit.css
+++ b/cgit.css
@@ -10,6 +10,7 @@ body {
 h2 {
 	font-size: 120%;
 	font-weight: bold;
+	margin-top: 0em;
 	margin-bottom: 0.25em;
 }
 
@@ -127,6 +128,25 @@ td#search input {
 	background-color: #fff;
 }
 
+td#summary {
+	vertical-align: top;
+	padding-bottom: 1em;
+}
+
+td#archivelist {
+	padding-bottom: 1em;
+}
+
+td#archivelist table {
+	float: right;
+	border-collapse: collapse;
+	border: solid 1px #777;
+}
+
+td#archivelist table th {
+	background-color: #ccc;
+}
+
 td#content {
 	padding: 1em 0.5em;
 }
diff --git a/ui-summary.c b/ui-summary.c
index 0a7869b..9388f5f 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -8,6 +8,8 @@
 
 #include "cgit.h"
 
+int items = 0;
+
 static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
 				int flags, void *cb_data)
 {
@@ -83,6 +85,13 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
 		tag = lookup_tag(sha1);
 		if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
 			return 2;
+		if (!items) {
+			html("<tr class='nohover'><th class='left'>Tag</th>"
+			     "<th class='left'>Created</th>"
+			     "<th class='left'>Author</th>"
+			     "<th class='left'>Reference</th></tr>\n");
+		}
+		items++;
 		html("<tr><td>");
 		url = cgit_pageurl(cgit_query_repo, "view", 
 				   fmt("id=%s", sha1_to_hex(sha1)));
@@ -108,6 +117,44 @@ static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
 	return 0;
 }
 
+static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
+				 int flags, void *cb_data)
+{
+	struct tag *tag;
+	struct taginfo *info;
+	struct object *obj;
+	char buf[256], *url;
+
+	if (prefixcmp(refname, "refs/archives"))
+		return 0;
+	strncpy(buf, refname+14, sizeof(buf));
+	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 0;
+		hashcpy(sha1, tag->tagged->sha1);
+	} else if (obj->type != OBJ_BLOB) {
+		return 0;
+	}
+	if (!items) {
+		html("<table>");
+		html("<tr><th>Downloads</th></tr>");
+	}
+	items++;
+	html("<tr><td>");
+	url = cgit_pageurl(cgit_query_repo, "blob",
+			   fmt("id=%s&path=%s", sha1_to_hex(sha1),
+			       buf));
+	html_link_open(url, NULL, NULL);
+	html_txt(buf);
+	html_link_close();
+	html("</td><tr>");
+	return 0;
+}
+
 static void cgit_print_branches()
 {
 	html("<tr class='nohover'><th class='left'>Branch</th>"
@@ -119,21 +166,30 @@ static void cgit_print_branches()
 
 static void cgit_print_tags()
 {
-	html("<tr class='nohover'><th class='left'>Tag</th>"
-	     "<th class='left'>Created</th>"
-	     "<th class='left'>Author</th>"
-	     "<th class='left'>Reference</th></tr>\n");
+	items = 0;
 	for_each_tag_ref(cgit_print_tag_cb, NULL);
 }
 
+static void cgit_print_archives()
+{
+	items = 0;
+	for_each_ref(cgit_print_archive_cb, NULL);
+	if (items)
+		html("</table>");
+}
+
 void cgit_print_summary()
 {
-	html("<h2>");
-	html(cgit_repo->name);
-	html("</h2><h3>");
-	html(cgit_repo->desc);
-	html("</h3>");
 	html("<table class='list nowrap'>");
+	html("<tr class='nohover'><td id='summary' colspan='3'>");
+	html("<h2>");
+	html_txt(cgit_repo->name);
+	html(" - ");
+	html_txt(cgit_repo->desc);
+	html("</h2>");
+	html("</td><td id='archivelist'>");
+	cgit_print_archives();
+	html("</td></tr>");
 	cgit_print_branches();
 	html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
 	cgit_print_tags();
ef='/litterbox/commit/litterbox.c?h=1.6&id=e7f73d66da51be79776c9c28ed4738a5635a1c8a&follow=1'>Error on invalid ISUPPORT values 1.2June McEnroe 2020-04-05Only set RCS on FreeBSDJune McEnroe 2020-04-05Log bans and unbansJune McEnroe 2020-04-05Parse mode types from ISUPPORTJune McEnroe 2020-04-05Add unscoop matchers for ban/unban eventsJune McEnroe The IRC and Textual matchers miss bans mixed with other mode changes, but those are rare. 2020-04-05Check unscoop regexps with make testJune McEnroe 2020-04-05Add unscoop -n flag for checking regexpsJune McEnroe 2020-04-05Add Ban and Unban event typesJune McEnroe 2020-04-02Update styleJune McEnroe Replacing declarations followed by while loops with for loops and generating the short option string from the long options. 2020-03-31Update unscoop catgirl matchersJune McEnroe I'm not concerned about keeping the old matchers since I'm almost entirely certain I was the only one who ever used the old version of catgirl, and I already imported those logs. 2020-03-31Fix writing verbose to stderrJune McEnroe 2020-03-02Include <>/-/* around nicks in scoop coloring 1.1June McEnroe 2020-03-02Replace .mk files with configure scriptJune McEnroe 2020-02-28Implement the causal.agency/consumer capabilityJune McEnroe 2020-02-22Include <>/-/* around nicks in coloringJune McEnroe 2020-02-22Use (almost) the full range of IRC colors for nicksJune McEnroe