summaryrefslogtreecommitdiffabout
path: root/ui-summary.c
authorLars Hjemli <hjemli@gmail.com>2007-05-11 21:44:42 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-11 21:44:42 (UTC)
commit9f48df63f6d8d9a8abcc02cd2f08293da7081520 (patch) (unidiff)
treed171ce9834577d3133e584c821f78806fbe0daef /ui-summary.c
parentf596d10d7391ed72b73019e037a7f7eec7a50d02 (diff)
downloadcgit-9f48df63f6d8d9a8abcc02cd2f08293da7081520.zip
cgit-9f48df63f6d8d9a8abcc02cd2f08293da7081520.tar.gz
cgit-9f48df63f6d8d9a8abcc02cd2f08293da7081520.tar.bz2
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 'ui-summary.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-summary.c74
1 files changed, 65 insertions, 9 deletions
diff --git a/ui-summary.c b/ui-summary.c
index 0a7869b..9388f5f 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -1,141 +1,197 @@
1/* ui-summary.c: functions for generating repo summary page 1/* ui-summary.c: functions for generating repo summary page
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11int items = 0;
12
11static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1, 13static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1,
12 int flags, void *cb_data) 14 int flags, void *cb_data)
13{ 15{
14 struct commit *commit; 16 struct commit *commit;
15 struct commitinfo *info; 17 struct commitinfo *info;
16 char buf[256], *url; 18 char buf[256], *url;
17 19
18 strncpy(buf, refname, sizeof(buf)); 20 strncpy(buf, refname, sizeof(buf));
19 commit = lookup_commit(sha1); 21 commit = lookup_commit(sha1);
20 if (commit && !parse_commit(commit)){ 22 if (commit && !parse_commit(commit)){
21 info = cgit_parse_commit(commit); 23 info = cgit_parse_commit(commit);
22 html("<tr><td>"); 24 html("<tr><td>");
23 url = cgit_pageurl(cgit_query_repo, "log", 25 url = cgit_pageurl(cgit_query_repo, "log",
24 fmt("h=%s", refname)); 26 fmt("h=%s", refname));
25 html_link_open(url, NULL, NULL); 27 html_link_open(url, NULL, NULL);
26 html_txt(buf); 28 html_txt(buf);
27 html_link_close(); 29 html_link_close();
28 html("</td><td>"); 30 html("</td><td>");
29 cgit_print_date(commit->date); 31 cgit_print_date(commit->date);
30 html("</td><td>"); 32 html("</td><td>");
31 html_txt(info->author); 33 html_txt(info->author);
32 html("</td><td>"); 34 html("</td><td>");
33 url = cgit_pageurl(cgit_query_repo, "commit", 35 url = cgit_pageurl(cgit_query_repo, "commit",
34 fmt("id=%s", sha1_to_hex(sha1))); 36 fmt("id=%s", sha1_to_hex(sha1)));
35 html_link_open(url, NULL, NULL); 37 html_link_open(url, NULL, NULL);
36 html_ntxt(cgit_max_msg_len, info->subject); 38 html_ntxt(cgit_max_msg_len, info->subject);
37 html_link_close(); 39 html_link_close();
38 html("</td></tr>\n"); 40 html("</td></tr>\n");
39 cgit_free_commitinfo(info); 41 cgit_free_commitinfo(info);
40 } else { 42 } else {
41 html("<tr><td>"); 43 html("<tr><td>");
42 html_txt(buf); 44 html_txt(buf);
43 html("</td><td colspan='3'>"); 45 html("</td><td colspan='3'>");
44 htmlf("*** bad ref %s ***", sha1_to_hex(sha1)); 46 htmlf("*** bad ref %s ***", sha1_to_hex(sha1));
45 html("</td></tr>\n"); 47 html("</td></tr>\n");
46 } 48 }
47 return 0; 49 return 0;
48} 50}
49 51
50 52
51static void cgit_print_object_ref(struct object *obj) 53static void cgit_print_object_ref(struct object *obj)
52{ 54{
53 char *page, *url; 55 char *page, *url;
54 56
55 if (obj->type == OBJ_COMMIT) 57 if (obj->type == OBJ_COMMIT)
56 page = "commit"; 58 page = "commit";
57 else if (obj->type == OBJ_TREE) 59 else if (obj->type == OBJ_TREE)
58 page = "tree"; 60 page = "tree";
59 else 61 else
60 page = "view"; 62 page = "view";
61 63
62 url = cgit_pageurl(cgit_query_repo, page, 64 url = cgit_pageurl(cgit_query_repo, page,
63 fmt("id=%s", sha1_to_hex(obj->sha1))); 65 fmt("id=%s", sha1_to_hex(obj->sha1)));
64 html_link_open(url, NULL, NULL); 66 html_link_open(url, NULL, NULL);
65 htmlf("%s %s", typename(obj->type), 67 htmlf("%s %s", typename(obj->type),
66 sha1_to_hex(obj->sha1)); 68 sha1_to_hex(obj->sha1));
67 html_link_close(); 69 html_link_close();
68} 70}
69 71
70static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1, 72static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1,
71 int flags, void *cb_data) 73 int flags, void *cb_data)
72{ 74{
73 struct tag *tag; 75 struct tag *tag;
74 struct taginfo *info; 76 struct taginfo *info;
75 struct object *obj; 77 struct object *obj;
76 char buf[256], *url; 78 char buf[256], *url;
77 79
78 strncpy(buf, refname, sizeof(buf)); 80 strncpy(buf, refname, sizeof(buf));
79 obj = parse_object(sha1); 81 obj = parse_object(sha1);
80 if (!obj) 82 if (!obj)
81 return 1; 83 return 1;
82 if (obj->type == OBJ_TAG) { 84 if (obj->type == OBJ_TAG) {
83 tag = lookup_tag(sha1); 85 tag = lookup_tag(sha1);
84 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) 86 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
85 return 2; 87 return 2;
88 if (!items) {
89 html("<tr class='nohover'><th class='left'>Tag</th>"
90 "<th class='left'>Created</th>"
91 "<th class='left'>Author</th>"
92 "<th class='left'>Reference</th></tr>\n");
93 }
94 items++;
86 html("<tr><td>"); 95 html("<tr><td>");
87 url = cgit_pageurl(cgit_query_repo, "view", 96 url = cgit_pageurl(cgit_query_repo, "view",
88 fmt("id=%s", sha1_to_hex(sha1))); 97 fmt("id=%s", sha1_to_hex(sha1)));
89 html_link_open(url, NULL, NULL); 98 html_link_open(url, NULL, NULL);
90 html_txt(buf); 99 html_txt(buf);
91 html_link_close(); 100 html_link_close();
92 html("</td><td>"); 101 html("</td><td>");
93 if (info->tagger_date > 0) 102 if (info->tagger_date > 0)
94 cgit_print_date(info->tagger_date); 103 cgit_print_date(info->tagger_date);
95 html("</td><td>"); 104 html("</td><td>");
96 if (info->tagger) 105 if (info->tagger)
97 html(info->tagger); 106 html(info->tagger);
98 html("</td><td>"); 107 html("</td><td>");
99 cgit_print_object_ref(tag->tagged); 108 cgit_print_object_ref(tag->tagged);
100 html("</td></tr>\n"); 109 html("</td></tr>\n");
101 } else { 110 } else {
102 html("<tr><td>"); 111 html("<tr><td>");
103 html_txt(buf); 112 html_txt(buf);
104 html("</td><td colspan='2'/><td>"); 113 html("</td><td colspan='2'/><td>");
105 cgit_print_object_ref(obj); 114 cgit_print_object_ref(obj);
106 html("</td></tr>\n"); 115 html("</td></tr>\n");
107 } 116 }
108 return 0; 117 return 0;
109} 118}
110 119
120static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1,
121 int flags, void *cb_data)
122{
123 struct tag *tag;
124 struct taginfo *info;
125 struct object *obj;
126 char buf[256], *url;
127
128 if (prefixcmp(refname, "refs/archives"))
129 return 0;
130 strncpy(buf, refname+14, sizeof(buf));
131 obj = parse_object(sha1);
132 if (!obj)
133 return 1;
134 if (obj->type == OBJ_TAG) {
135 tag = lookup_tag(sha1);
136 if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag)))
137 return 0;
138 hashcpy(sha1, tag->tagged->sha1);
139 } else if (obj->type != OBJ_BLOB) {
140 return 0;
141 }
142 if (!items) {
143 html("<table>");
144 html("<tr><th>Downloads</th></tr>");
145 }
146 items++;
147 html("<tr><td>");
148 url = cgit_pageurl(cgit_query_repo, "blob",
149 fmt("id=%s&path=%s", sha1_to_hex(sha1),
150 buf));
151 html_link_open(url, NULL, NULL);
152 html_txt(buf);
153 html_link_close();
154 html("</td><tr>");
155 return 0;
156}
157
111static void cgit_print_branches() 158static void cgit_print_branches()
112{ 159{
113 html("<tr class='nohover'><th class='left'>Branch</th>" 160 html("<tr class='nohover'><th class='left'>Branch</th>"
114 "<th class='left'>Updated</th>" 161 "<th class='left'>Updated</th>"
115 "<th class='left'>Author</th>" 162 "<th class='left'>Author</th>"
116 "<th class='left'>Head commit</th></tr>\n"); 163 "<th class='left'>Head commit</th></tr>\n");
117 for_each_branch_ref(cgit_print_branch_cb, NULL); 164 for_each_branch_ref(cgit_print_branch_cb, NULL);
118} 165}
119 166
120static void cgit_print_tags() 167static void cgit_print_tags()
121{ 168{
122 html("<tr class='nohover'><th class='left'>Tag</th>" 169 items = 0;
123 "<th class='left'>Created</th>"
124 "<th class='left'>Author</th>"
125 "<th class='left'>Reference</th></tr>\n");
126 for_each_tag_ref(cgit_print_tag_cb, NULL); 170 for_each_tag_ref(cgit_print_tag_cb, NULL);
127} 171}
128 172
173static void cgit_print_archives()
174{
175 items = 0;
176 for_each_ref(cgit_print_archive_cb, NULL);
177 if (items)
178 html("</table>");
179}
180
129void cgit_print_summary() 181void cgit_print_summary()
130{ 182{
131 html("<h2>");
132 html(cgit_repo->name);
133 html("</h2><h3>");
134 html(cgit_repo->desc);
135 html("</h3>");
136 html("<table class='list nowrap'>"); 183 html("<table class='list nowrap'>");
184 html("<tr class='nohover'><td id='summary' colspan='3'>");
185 html("<h2>");
186 html_txt(cgit_repo->name);
187 html(" - ");
188 html_txt(cgit_repo->desc);
189 html("</h2>");
190 html("</td><td id='archivelist'>");
191 cgit_print_archives();
192 html("</td></tr>");
137 cgit_print_branches(); 193 cgit_print_branches();
138 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>"); 194 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
139 cgit_print_tags(); 195 cgit_print_tags();
140 html("</table>"); 196 html("</table>");
141} 197}