author | Lars Hjemli <hjemli@gmail.com> | 2007-05-14 22:07:37 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-05-14 22:07:37 (UTC) |
commit | 495e39677326284ea13b2f6d76195d6800c2a450 (patch) (unidiff) | |
tree | 21666895a947bb33c6722b8b453f1f1b5a56f638 | |
parent | 9927e63f387e6c9328eb3c347ecb0e339f8ac023 (diff) | |
download | cgit-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>
-rw-r--r-- | ui-summary.c | 32 |
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 | ||
11 | static int items; | 11 | static int header; |
12 | 12 | ||
13 | static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1, | 13 | static 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 | ||
53 | static void cgit_print_object_ref(struct object *obj) | 53 | static 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 | ||
72 | static 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 | |||
72 | static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1, | 81 | static 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 | ||
120 | static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1, | 126 | static 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 | ||
158 | static void cgit_print_branches() | 164 | static 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 | ||
167 | static void cgit_print_tags() | 173 | static 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 | ||
173 | static void cgit_print_archives() | 179 | static 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 | ||
181 | void cgit_print_summary() | 187 | void 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'> </td></tr>"); | 200 | html("<tr class='nohover'><td colspan='4'> </td></tr>"); |
195 | cgit_print_tags(); | 201 | cgit_print_tags(); |
196 | html("</table>"); | 202 | html("</table>"); |
197 | } | 203 | } |