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