summaryrefslogtreecommitdiffabout
path: root/ui-shared.c
Unidiff
Diffstat (limited to 'ui-shared.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-shared.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/ui-shared.c b/ui-shared.c
index 64c237f..bfcc2ac 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -118,99 +118,115 @@ static char *repolink(char *title, char *class, char *page, char *head,
118 html_attr(path); 118 html_attr(path);
119 } 119 }
120 } else { 120 } else {
121 html(cgit_script_name); 121 html(cgit_script_name);
122 html("?url="); 122 html("?url=");
123 html_attr(cgit_repo->url); 123 html_attr(cgit_repo->url);
124 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') 124 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
125 html("/"); 125 html("/");
126 if (page) { 126 if (page) {
127 html(page); 127 html(page);
128 html("/"); 128 html("/");
129 if (path) 129 if (path)
130 html_attr(path); 130 html_attr(path);
131 } 131 }
132 delim = "&"; 132 delim = "&";
133 } 133 }
134 if (head && strcmp(head, cgit_repo->defbranch)) { 134 if (head && strcmp(head, cgit_repo->defbranch)) {
135 html(delim); 135 html(delim);
136 html("h="); 136 html("h=");
137 html_attr(head); 137 html_attr(head);
138 delim = "&"; 138 delim = "&";
139 } 139 }
140 return fmt("%s", delim); 140 return fmt("%s", delim);
141} 141}
142 142
143static void reporevlink(char *page, char *name, char *title, char *class, 143static void reporevlink(char *page, char *name, char *title, char *class,
144 char *head, char *rev, char *path) 144 char *head, char *rev, char *path)
145{ 145{
146 char *delim; 146 char *delim;
147 147
148 delim = repolink(title, class, page, head, path); 148 delim = repolink(title, class, page, head, path);
149 if (rev && strcmp(rev, cgit_query_head)) { 149 if (rev && strcmp(rev, cgit_query_head)) {
150 html(delim); 150 html(delim);
151 html("id="); 151 html("id=");
152 html_attr(rev); 152 html_attr(rev);
153 } 153 }
154 html("'>"); 154 html("'>");
155 html_txt(name); 155 html_txt(name);
156 html("</a>"); 156 html("</a>");
157} 157}
158 158
159void cgit_tree_link(char *name, char *title, char *class, char *head, 159void cgit_tree_link(char *name, char *title, char *class, char *head,
160 char *rev, char *path) 160 char *rev, char *path)
161{ 161{
162 reporevlink("tree", name, title, class, head, rev, path); 162 reporevlink("tree", name, title, class, head, rev, path);
163} 163}
164 164
165void cgit_log_link(char *name, char *title, char *class, char *head, 165void cgit_log_link(char *name, char *title, char *class, char *head,
166 char *rev, char *path) 166 char *rev, char *path, int ofs)
167{ 167{
168 reporevlink("log", name, title, class, head, rev, path); 168 char *delim;
169
170 delim = repolink(title, class, "log", head, path);
171 if (rev && strcmp(rev, cgit_query_head)) {
172 html(delim);
173 html("id=");
174 html_attr(rev);
175 delim = "&";
176 }
177 if (ofs > 0) {
178 html(delim);
179 html("ofs=");
180 htmlf("%d", ofs);
181 }
182 html("'>");
183 html_txt(name);
184 html("</a>");
169} 185}
170 186
171void cgit_commit_link(char *name, char *title, char *class, char *head, 187void cgit_commit_link(char *name, char *title, char *class, char *head,
172 char *rev) 188 char *rev)
173{ 189{
174 if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) { 190 if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) {
175 name[cgit_max_msg_len] = '\0'; 191 name[cgit_max_msg_len] = '\0';
176 name[cgit_max_msg_len - 1] = '.'; 192 name[cgit_max_msg_len - 1] = '.';
177 name[cgit_max_msg_len - 2] = '.'; 193 name[cgit_max_msg_len - 2] = '.';
178 name[cgit_max_msg_len - 3] = '.'; 194 name[cgit_max_msg_len - 3] = '.';
179 } 195 }
180 reporevlink("commit", name, title, class, head, rev, NULL); 196 reporevlink("commit", name, title, class, head, rev, NULL);
181} 197}
182 198
183void cgit_diff_link(char *name, char *title, char *class, char *head, 199void cgit_diff_link(char *name, char *title, char *class, char *head,
184 char *new_rev, char *old_rev, char *path) 200 char *new_rev, char *old_rev, char *path)
185{ 201{
186 char *delim; 202 char *delim;
187 203
188 delim = repolink(title, class, "diff", head, path); 204 delim = repolink(title, class, "diff", head, path);
189 if (new_rev && strcmp(new_rev, cgit_query_head)) { 205 if (new_rev && strcmp(new_rev, cgit_query_head)) {
190 html(delim); 206 html(delim);
191 html("id="); 207 html("id=");
192 html_attr(new_rev); 208 html_attr(new_rev);
193 delim = "&amp;"; 209 delim = "&amp;";
194 } 210 }
195 if (old_rev) { 211 if (old_rev) {
196 html(delim); 212 html(delim);
197 html("id2="); 213 html("id2=");
198 html_attr(old_rev); 214 html_attr(old_rev);
199 } 215 }
200 html("'>"); 216 html("'>");
201 html_txt(name); 217 html_txt(name);
202 html("</a>"); 218 html("</a>");
203} 219}
204 220
205void cgit_print_date(time_t secs, char *format) 221void cgit_print_date(time_t secs, char *format)
206{ 222{
207 char buf[64]; 223 char buf[64];
208 struct tm *time; 224 struct tm *time;
209 225
210 time = gmtime(&secs); 226 time = gmtime(&secs);
211 strftime(buf, sizeof(buf)-1, format, time); 227 strftime(buf, sizeof(buf)-1, format, time);
212 html_txt(buf); 228 html_txt(buf);
213} 229}
214 230
215void cgit_print_age(time_t t, time_t max_relative, char *format) 231void cgit_print_age(time_t t, time_t max_relative, char *format)
216{ 232{
@@ -257,97 +273,97 @@ void cgit_print_docstart(char *title, struct cacheitem *item)
257{ 273{
258 html("Content-Type: text/html; charset=utf-8\n"); 274 html("Content-Type: text/html; charset=utf-8\n");
259 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); 275 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
260 htmlf("Expires: %s\n", http_date(item->st.st_mtime + 276 htmlf("Expires: %s\n", http_date(item->st.st_mtime +
261 ttl_seconds(item->ttl))); 277 ttl_seconds(item->ttl)));
262 html("\n"); 278 html("\n");
263 html(cgit_doctype); 279 html(cgit_doctype);
264 html("<html>\n"); 280 html("<html>\n");
265 html("<head>\n"); 281 html("<head>\n");
266 html("<title>"); 282 html("<title>");
267 html_txt(title); 283 html_txt(title);
268 html("</title>\n"); 284 html("</title>\n");
269 htmlf("<meta name='generator' content='cgit v%s'/>\n", cgit_version); 285 htmlf("<meta name='generator' content='cgit v%s'/>\n", cgit_version);
270 html("<link rel='stylesheet' type='text/css' href='"); 286 html("<link rel='stylesheet' type='text/css' href='");
271 html_attr(cgit_css); 287 html_attr(cgit_css);
272 html("'/>\n"); 288 html("'/>\n");
273 html("</head>\n"); 289 html("</head>\n");
274 html("<body>\n"); 290 html("<body>\n");
275} 291}
276 292
277void cgit_print_docend() 293void cgit_print_docend()
278{ 294{
279 html("</td></tr></table>"); 295 html("</td></tr></table>");
280 html("</body>\n</html>\n"); 296 html("</body>\n</html>\n");
281} 297}
282 298
283void cgit_print_pageheader(char *title, int show_search) 299void cgit_print_pageheader(char *title, int show_search)
284{ 300{
285 html("<table id='layout'>"); 301 html("<table id='layout'>");
286 html("<tr><td id='header'><a href='"); 302 html("<tr><td id='header'><a href='");
287 html_attr(cgit_rooturl()); 303 html_attr(cgit_rooturl());
288 html("'>"); 304 html("'>");
289 html_txt(cgit_root_title); 305 html_txt(cgit_root_title);
290 html("</a></td><td id='logo'>"); 306 html("</a></td><td id='logo'>");
291 html("<a href='"); 307 html("<a href='");
292 html_attr(cgit_logo_link); 308 html_attr(cgit_logo_link);
293 htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo); 309 htmlf("'><img src='%s' alt='logo'/></a>", cgit_logo);
294 html("</td></tr>"); 310 html("</td></tr>");
295 html("<tr><td id='crumb'>"); 311 html("<tr><td id='crumb'>");
296 if (cgit_query_repo) { 312 if (cgit_query_repo) {
297 html_txt(cgit_repo->name); 313 html_txt(cgit_repo->name);
298 html(" ("); 314 html(" (");
299 html_txt(cgit_query_head); 315 html_txt(cgit_query_head);
300 html(") : &nbsp;"); 316 html(") : &nbsp;");
301 reporevlink(NULL, "summary", NULL, NULL, cgit_query_head, 317 reporevlink(NULL, "summary", NULL, NULL, cgit_query_head,
302 NULL, NULL); 318 NULL, NULL);
303 html(" "); 319 html(" ");
304 cgit_log_link("log", NULL, NULL, cgit_query_head, 320 cgit_log_link("log", NULL, NULL, cgit_query_head,
305 cgit_query_sha1, cgit_query_path); 321 cgit_query_sha1, cgit_query_path, 0);
306 html(" "); 322 html(" ");
307 cgit_tree_link("tree", NULL, NULL, cgit_query_head, 323 cgit_tree_link("tree", NULL, NULL, cgit_query_head,
308 cgit_query_sha1, NULL); 324 cgit_query_sha1, NULL);
309 html(" "); 325 html(" ");
310 cgit_commit_link("commit", NULL, NULL, cgit_query_head, 326 cgit_commit_link("commit", NULL, NULL, cgit_query_head,
311 cgit_query_sha1); 327 cgit_query_sha1);
312 html(" "); 328 html(" ");
313 cgit_diff_link("diff", NULL, NULL, cgit_query_head, 329 cgit_diff_link("diff", NULL, NULL, cgit_query_head,
314 cgit_query_sha1, cgit_query_sha2, 330 cgit_query_sha1, cgit_query_sha2,
315 cgit_query_path); 331 cgit_query_path);
316 } else { 332 } else {
317 html_txt("Index of repositories"); 333 html_txt("Index of repositories");
318 } 334 }
319 html("</td>"); 335 html("</td>");
320 html("<td id='search'>"); 336 html("<td id='search'>");
321 if (show_search) { 337 if (show_search) {
322 html("<form method='get' action='"); 338 html("<form method='get' action='");
323 html_attr(cgit_currurl()); 339 html_attr(cgit_currurl());
324 html("'>"); 340 html("'>");
325 if (!cgit_virtual_root) { 341 if (!cgit_virtual_root) {
326 if (cgit_query_repo) 342 if (cgit_query_repo)
327 html_hidden("r", cgit_query_repo); 343 html_hidden("r", cgit_query_repo);
328 if (cgit_query_page) 344 if (cgit_query_page)
329 html_hidden("p", cgit_query_page); 345 html_hidden("p", cgit_query_page);
330 } 346 }
331 if (cgit_query_head) 347 if (cgit_query_head)
332 html_hidden("h", cgit_query_head); 348 html_hidden("h", cgit_query_head);
333 if (cgit_query_sha1) 349 if (cgit_query_sha1)
334 html_hidden("id", cgit_query_sha1); 350 html_hidden("id", cgit_query_sha1);
335 if (cgit_query_sha2) 351 if (cgit_query_sha2)
336 html_hidden("id2", cgit_query_sha2); 352 html_hidden("id2", cgit_query_sha2);
337 html("<input type='text' name='q' value='"); 353 html("<input type='text' name='q' value='");
338 html_attr(cgit_query_search); 354 html_attr(cgit_query_search);
339 html("'/></form>"); 355 html("'/></form>");
340 } 356 }
341 html("</td></tr>"); 357 html("</td></tr>");
342 html("<tr><td id='content' colspan='2'>"); 358 html("<tr><td id='content' colspan='2'>");
343} 359}
344 360
345void cgit_print_snapshot_start(const char *mimetype, const char *filename, 361void cgit_print_snapshot_start(const char *mimetype, const char *filename,
346 struct cacheitem *item) 362 struct cacheitem *item)
347{ 363{
348 htmlf("Content-Type: %s\n", mimetype); 364 htmlf("Content-Type: %s\n", mimetype);
349 htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename); 365 htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename);
350 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); 366 htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
351 htmlf("Expires: %s\n", http_date(item->st.st_mtime + 367 htmlf("Expires: %s\n", http_date(item->st.st_mtime +
352 ttl_seconds(item->ttl))); 368 ttl_seconds(item->ttl)));
353 html("\n"); 369 html("\n");