summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2008-04-13 10:20:00 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-04-13 10:20:00 (UTC)
commit39912a24edf45497e668ebda25636aa6f6db0c9b (patch) (unidiff)
tree5de079ba1441a4f9546252e38c31d4d1b5f17b40
parent536b0541fcfea2169e4df33043cd9ff14c657bce (diff)
downloadcgit-39912a24edf45497e668ebda25636aa6f6db0c9b.zip
cgit-39912a24edf45497e668ebda25636aa6f6db0c9b.tar.gz
cgit-39912a24edf45497e668ebda25636aa6f6db0c9b.tar.bz2
Remove 'patch' link from tab, add to commit view
It's a bit confusing to enter the patch view from the tab, since it has no layout. And the commit view has always lacked showing the commit id. Both of these warts are fixed by this commit, which adds a new header line in the commit view which shows the commit id as a 'permalink' to the current commit and also adds a link to the patch view of the current commit. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-commit.c6
-rw-r--r--ui-shared.c2
-rw-r--r--ui-shared.h2
3 files changed, 8 insertions, 2 deletions
diff --git a/ui-commit.c b/ui-commit.c
index c2fafd7..dd36cc0 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -82,149 +82,155 @@ void print_fileinfo(struct fileinfo *info)
82 NULL, info->new_path); 82 NULL, info->new_path);
83 if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED) 83 if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED)
84 htmlf(" (%s from %s)", 84 htmlf(" (%s from %s)",
85 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed", 85 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
86 info->old_path); 86 info->old_path);
87 html("</td><td class='right'>"); 87 html("</td><td class='right'>");
88 htmlf("%d", info->added + info->removed); 88 htmlf("%d", info->added + info->removed);
89 html("</td><td class='graph'>"); 89 html("</td><td class='graph'>");
90 htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes)); 90 htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));
91 htmlf("<td class='add' style='width: %.1f%%;'/>", 91 htmlf("<td class='add' style='width: %.1f%%;'/>",
92 info->added * 100.0 / max_changes); 92 info->added * 100.0 / max_changes);
93 htmlf("<td class='rem' style='width: %.1f%%;'/>", 93 htmlf("<td class='rem' style='width: %.1f%%;'/>",
94 info->removed * 100.0 / max_changes); 94 info->removed * 100.0 / max_changes);
95 htmlf("<td class='none' style='width: %.1f%%;'/>", 95 htmlf("<td class='none' style='width: %.1f%%;'/>",
96 (max_changes - info->removed - info->added) * 100.0 / max_changes); 96 (max_changes - info->removed - info->added) * 100.0 / max_changes);
97 html("</tr></table></td></tr>\n"); 97 html("</tr></table></td></tr>\n");
98} 98}
99 99
100void cgit_count_diff_lines(char *line, int len) 100void cgit_count_diff_lines(char *line, int len)
101{ 101{
102 if (line && (len > 0)) { 102 if (line && (len > 0)) {
103 if (line[0] == '+') 103 if (line[0] == '+')
104 lines_added++; 104 lines_added++;
105 else if (line[0] == '-') 105 else if (line[0] == '-')
106 lines_removed++; 106 lines_removed++;
107 } 107 }
108} 108}
109 109
110void inspect_filepair(struct diff_filepair *pair) 110void inspect_filepair(struct diff_filepair *pair)
111{ 111{
112 files++; 112 files++;
113 lines_added = 0; 113 lines_added = 0;
114 lines_removed = 0; 114 lines_removed = 0;
115 cgit_diff_files(pair->one->sha1, pair->two->sha1, cgit_count_diff_lines); 115 cgit_diff_files(pair->one->sha1, pair->two->sha1, cgit_count_diff_lines);
116 if (files >= slots) { 116 if (files >= slots) {
117 if (slots == 0) 117 if (slots == 0)
118 slots = 4; 118 slots = 4;
119 else 119 else
120 slots = slots * 2; 120 slots = slots * 2;
121 items = xrealloc(items, slots * sizeof(struct fileinfo)); 121 items = xrealloc(items, slots * sizeof(struct fileinfo));
122 } 122 }
123 items[files-1].status = pair->status; 123 items[files-1].status = pair->status;
124 hashcpy(items[files-1].old_sha1, pair->one->sha1); 124 hashcpy(items[files-1].old_sha1, pair->one->sha1);
125 hashcpy(items[files-1].new_sha1, pair->two->sha1); 125 hashcpy(items[files-1].new_sha1, pair->two->sha1);
126 items[files-1].old_mode = pair->one->mode; 126 items[files-1].old_mode = pair->one->mode;
127 items[files-1].new_mode = pair->two->mode; 127 items[files-1].new_mode = pair->two->mode;
128 items[files-1].old_path = xstrdup(pair->one->path); 128 items[files-1].old_path = xstrdup(pair->one->path);
129 items[files-1].new_path = xstrdup(pair->two->path); 129 items[files-1].new_path = xstrdup(pair->two->path);
130 items[files-1].added = lines_added; 130 items[files-1].added = lines_added;
131 items[files-1].removed = lines_removed; 131 items[files-1].removed = lines_removed;
132 if (lines_added + lines_removed > max_changes) 132 if (lines_added + lines_removed > max_changes)
133 max_changes = lines_added + lines_removed; 133 max_changes = lines_added + lines_removed;
134 total_adds += lines_added; 134 total_adds += lines_added;
135 total_rems += lines_removed; 135 total_rems += lines_removed;
136} 136}
137 137
138 138
139void cgit_print_commit(char *hex) 139void cgit_print_commit(char *hex)
140{ 140{
141 struct commit *commit, *parent; 141 struct commit *commit, *parent;
142 struct commitinfo *info; 142 struct commitinfo *info;
143 struct commit_list *p; 143 struct commit_list *p;
144 unsigned char sha1[20]; 144 unsigned char sha1[20];
145 char *tmp; 145 char *tmp;
146 int i; 146 int i;
147 147
148 if (!hex) 148 if (!hex)
149 hex = ctx.qry.head; 149 hex = ctx.qry.head;
150 curr_rev = hex; 150 curr_rev = hex;
151 151
152 if (get_sha1(hex, sha1)) { 152 if (get_sha1(hex, sha1)) {
153 cgit_print_error(fmt("Bad object id: %s", hex)); 153 cgit_print_error(fmt("Bad object id: %s", hex));
154 return; 154 return;
155 } 155 }
156 commit = lookup_commit_reference(sha1); 156 commit = lookup_commit_reference(sha1);
157 if (!commit) { 157 if (!commit) {
158 cgit_print_error(fmt("Bad commit reference: %s", hex)); 158 cgit_print_error(fmt("Bad commit reference: %s", hex));
159 return; 159 return;
160 } 160 }
161 info = cgit_parse_commit(commit); 161 info = cgit_parse_commit(commit);
162 162
163 html("<table summary='commit info' class='commit-info'>\n"); 163 html("<table summary='commit info' class='commit-info'>\n");
164 html("<tr><th>author</th><td>"); 164 html("<tr><th>author</th><td>");
165 html_txt(info->author); 165 html_txt(info->author);
166 html(" "); 166 html(" ");
167 html_txt(info->author_email); 167 html_txt(info->author_email);
168 html("</td><td class='right'>"); 168 html("</td><td class='right'>");
169 cgit_print_date(info->author_date, FMT_LONGDATE); 169 cgit_print_date(info->author_date, FMT_LONGDATE);
170 html("</td></tr>\n"); 170 html("</td></tr>\n");
171 html("<tr><th>committer</th><td>"); 171 html("<tr><th>committer</th><td>");
172 html_txt(info->committer); 172 html_txt(info->committer);
173 html(" "); 173 html(" ");
174 html_txt(info->committer_email); 174 html_txt(info->committer_email);
175 html("</td><td class='right'>"); 175 html("</td><td class='right'>");
176 cgit_print_date(info->committer_date, FMT_LONGDATE); 176 cgit_print_date(info->committer_date, FMT_LONGDATE);
177 html("</td></tr>\n"); 177 html("</td></tr>\n");
178 html("<tr><th>commit</th><td colspan='2' class='sha1'>");
179 tmp = sha1_to_hex(commit->object.sha1);
180 cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp);
181 html(" (");
182 cgit_patch_link("patch", NULL, NULL, NULL, tmp);
183 html(")</td></tr>\n");
178 html("<tr><th>tree</th><td colspan='2' class='sha1'>"); 184 html("<tr><th>tree</th><td colspan='2' class='sha1'>");
179 tmp = xstrdup(hex); 185 tmp = xstrdup(hex);
180 cgit_tree_link(sha1_to_hex(commit->tree->object.sha1), NULL, NULL, 186 cgit_tree_link(sha1_to_hex(commit->tree->object.sha1), NULL, NULL,
181 ctx.qry.head, tmp, NULL); 187 ctx.qry.head, tmp, NULL);
182 html("</td></tr>\n"); 188 html("</td></tr>\n");
183 for (p = commit->parents; p ; p = p->next) { 189 for (p = commit->parents; p ; p = p->next) {
184 parent = lookup_commit_reference(p->item->object.sha1); 190 parent = lookup_commit_reference(p->item->object.sha1);
185 if (!parent) { 191 if (!parent) {
186 html("<tr><td colspan='3'>"); 192 html("<tr><td colspan='3'>");
187 cgit_print_error("Error reading parent commit"); 193 cgit_print_error("Error reading parent commit");
188 html("</td></tr>"); 194 html("</td></tr>");
189 continue; 195 continue;
190 } 196 }
191 html("<tr><th>parent</th>" 197 html("<tr><th>parent</th>"
192 "<td colspan='2' class='sha1'>"); 198 "<td colspan='2' class='sha1'>");
193 cgit_commit_link(sha1_to_hex(p->item->object.sha1), NULL, NULL, 199 cgit_commit_link(sha1_to_hex(p->item->object.sha1), NULL, NULL,
194 ctx.qry.head, sha1_to_hex(p->item->object.sha1)); 200 ctx.qry.head, sha1_to_hex(p->item->object.sha1));
195 html(" ("); 201 html(" (");
196 cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex, 202 cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex,
197 sha1_to_hex(p->item->object.sha1), NULL); 203 sha1_to_hex(p->item->object.sha1), NULL);
198 html(")</td></tr>"); 204 html(")</td></tr>");
199 } 205 }
200 if (ctx.repo->snapshots) { 206 if (ctx.repo->snapshots) {
201 html("<tr><th>download</th><td colspan='2' class='sha1'>"); 207 html("<tr><th>download</th><td colspan='2' class='sha1'>");
202 cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head, 208 cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head,
203 hex, ctx.repo->snapshots); 209 hex, ctx.repo->snapshots);
204 html("</td></tr>"); 210 html("</td></tr>");
205 } 211 }
206 html("</table>\n"); 212 html("</table>\n");
207 html("<div class='commit-subject'>"); 213 html("<div class='commit-subject'>");
208 html_txt(info->subject); 214 html_txt(info->subject);
209 html("</div>"); 215 html("</div>");
210 html("<div class='commit-msg'>"); 216 html("<div class='commit-msg'>");
211 html_txt(info->msg); 217 html_txt(info->msg);
212 html("</div>"); 218 html("</div>");
213 if (!(commit->parents && commit->parents->next && commit->parents->next->next)) { 219 if (!(commit->parents && commit->parents->next && commit->parents->next->next)) {
214 html("<div class='diffstat-header'>Diffstat</div>"); 220 html("<div class='diffstat-header'>Diffstat</div>");
215 html("<table summary='diffstat' class='diffstat'>"); 221 html("<table summary='diffstat' class='diffstat'>");
216 max_changes = 0; 222 max_changes = 0;
217 cgit_diff_commit(commit, inspect_filepair); 223 cgit_diff_commit(commit, inspect_filepair);
218 for(i = 0; i<files; i++) 224 for(i = 0; i<files; i++)
219 print_fileinfo(&items[i]); 225 print_fileinfo(&items[i]);
220 html("</table>"); 226 html("</table>");
221 html("<div class='diffstat-summary'>"); 227 html("<div class='diffstat-summary'>");
222 htmlf("%d files changed, %d insertions, %d deletions", 228 htmlf("%d files changed, %d insertions, %d deletions",
223 files, total_adds, total_rems); 229 files, total_adds, total_rems);
224 cgit_print_diff(ctx.qry.sha1, 230 cgit_print_diff(ctx.qry.sha1,
225 sha1_to_hex(commit->parents->item->object.sha1), 231 sha1_to_hex(commit->parents->item->object.sha1),
226 NULL); 232 NULL);
227 html(")</div>"); 233 html(")</div>");
228 } 234 }
229 cgit_free_commitinfo(info); 235 cgit_free_commitinfo(info);
230} 236}
diff --git a/ui-shared.c b/ui-shared.c
index 6253a90..bb08c4a 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -448,164 +448,162 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page)
448 if (ctx.qry.path) 448 if (ctx.qry.path)
449 url = fmt("%s/%s", url, ctx.qry.path); 449 url = fmt("%s/%s", url, ctx.qry.path);
450 html_hidden("url", url); 450 html_hidden("url", url);
451 } 451 }
452 452
453 if (incl_head && strcmp(ctx.qry.head, ctx.repo->defbranch)) 453 if (incl_head && strcmp(ctx.qry.head, ctx.repo->defbranch))
454 html_hidden("h", ctx.qry.head); 454 html_hidden("h", ctx.qry.head);
455 455
456 if (ctx.qry.sha1) 456 if (ctx.qry.sha1)
457 html_hidden("id", ctx.qry.sha1); 457 html_hidden("id", ctx.qry.sha1);
458 if (ctx.qry.sha2) 458 if (ctx.qry.sha2)
459 html_hidden("id2", ctx.qry.sha2); 459 html_hidden("id2", ctx.qry.sha2);
460 460
461 if (incl_search) { 461 if (incl_search) {
462 if (ctx.qry.grep) 462 if (ctx.qry.grep)
463 html_hidden("qt", ctx.qry.grep); 463 html_hidden("qt", ctx.qry.grep);
464 if (ctx.qry.search) 464 if (ctx.qry.search)
465 html_hidden("q", ctx.qry.search); 465 html_hidden("q", ctx.qry.search);
466 } 466 }
467} 467}
468 468
469char *hc(struct cgit_cmd *cmd, const char *page) 469char *hc(struct cgit_cmd *cmd, const char *page)
470{ 470{
471 return (strcmp(cmd->name, page) ? NULL : "active"); 471 return (strcmp(cmd->name, page) ? NULL : "active");
472} 472}
473 473
474void cgit_print_pageheader(struct cgit_context *ctx) 474void cgit_print_pageheader(struct cgit_context *ctx)
475{ 475{
476 struct cgit_cmd *cmd = cgit_get_cmd(ctx); 476 struct cgit_cmd *cmd = cgit_get_cmd(ctx);
477 477
478 html("<table id='header'>\n"); 478 html("<table id='header'>\n");
479 html("<tr>\n"); 479 html("<tr>\n");
480 html("<td class='logo' rowspan='2'><a href='"); 480 html("<td class='logo' rowspan='2'><a href='");
481 if (ctx->cfg.logo_link) 481 if (ctx->cfg.logo_link)
482 html_attr(ctx->cfg.logo_link); 482 html_attr(ctx->cfg.logo_link);
483 else 483 else
484 html_attr(cgit_rooturl()); 484 html_attr(cgit_rooturl());
485 html("'><img src='"); 485 html("'><img src='");
486 html_attr(ctx->cfg.logo); 486 html_attr(ctx->cfg.logo);
487 html("'/></a></td>\n"); 487 html("'/></a></td>\n");
488 488
489 html("<td class='main'>"); 489 html("<td class='main'>");
490 if (ctx->repo) { 490 if (ctx->repo) {
491/* 491/*
492 html("<a href='"); 492 html("<a href='");
493 html_attr(cgit_rooturl()); 493 html_attr(cgit_rooturl());
494 html("'>index</a> : "); 494 html("'>index</a> : ");
495*/ 495*/
496 reporevlink(NULL, ctx->repo->name, NULL, hc(cmd, "summary"), 496 reporevlink(NULL, ctx->repo->name, NULL, hc(cmd, "summary"),
497 ctx->qry.head, NULL, NULL); 497 ctx->qry.head, NULL, NULL);
498 html(" : "); 498 html(" : ");
499 html_txt(ctx->qry.page); 499 html_txt(ctx->qry.page);
500 html("</td><td class='form'>"); 500 html("</td><td class='form'>");
501 html("<form method='get' action=''>\n"); 501 html("<form method='get' action=''>\n");
502 add_hidden_formfields(0, 1, ctx->qry.page); 502 add_hidden_formfields(0, 1, ctx->qry.page);
503 html("<select name='h' onchange='this.form.submit();'>\n"); 503 html("<select name='h' onchange='this.form.submit();'>\n");
504 for_each_branch_ref(print_branch_option, ctx->qry.head); 504 for_each_branch_ref(print_branch_option, ctx->qry.head);
505 html("</select> "); 505 html("</select> ");
506 html("<input type='submit' name='' value='switch'/>"); 506 html("<input type='submit' name='' value='switch'/>");
507 html("</form>"); 507 html("</form>");
508 } else 508 } else
509 html_txt(ctx->cfg.root_title); 509 html_txt(ctx->cfg.root_title);
510 html("</td>\n"); 510 html("</td>\n");
511 511
512 html("<tr><td class='sub'"); 512 html("<tr><td class='sub'");
513 if (ctx->repo) { 513 if (ctx->repo) {
514 html(" colspan='2'>"); 514 html(" colspan='2'>");
515 html_txt(ctx->repo->desc); 515 html_txt(ctx->repo->desc);
516 } 516 }
517/* 517/*
518 else if (ctx->cfg.root_subtitle) 518 else if (ctx->cfg.root_subtitle)
519 html_txt(ctx->cfg.root_subtitle); 519 html_txt(ctx->cfg.root_subtitle);
520*/ 520*/
521 else { 521 else {
522 html(">"); 522 html(">");
523 html_txt("a fast webinterface for the git dscm"); 523 html_txt("a fast webinterface for the git dscm");
524 } 524 }
525 html("</td></tr>\n"); 525 html("</td></tr>\n");
526 526
527 html("</tr>\n"); 527 html("</tr>\n");
528 html("</table>\n"); 528 html("</table>\n");
529 529
530 html("<table class='tabs'><tr><td>\n"); 530 html("<table class='tabs'><tr><td>\n");
531 if (ctx->repo) { 531 if (ctx->repo) {
532 reporevlink(NULL, "summary", NULL, hc(cmd, "summary"), 532 reporevlink(NULL, "summary", NULL, hc(cmd, "summary"),
533 ctx->qry.head, NULL, NULL); 533 ctx->qry.head, NULL, NULL);
534 cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head, 534 cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head,
535 ctx->qry.sha1, NULL); 535 ctx->qry.sha1, NULL);
536 cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head, 536 cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head,
537 NULL, NULL, 0, NULL, NULL); 537 NULL, NULL, 0, NULL, NULL);
538 cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head, 538 cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head,
539 ctx->qry.sha1, NULL); 539 ctx->qry.sha1, NULL);
540 cgit_commit_link("commit", NULL, hc(cmd, "commit"), 540 cgit_commit_link("commit", NULL, hc(cmd, "commit"),
541 ctx->qry.head, ctx->qry.sha1); 541 ctx->qry.head, ctx->qry.sha1);
542 cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, 542 cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head,
543 ctx->qry.sha1, ctx->qry.sha2, NULL); 543 ctx->qry.sha1, ctx->qry.sha2, NULL);
544 cgit_patch_link("patch", NULL, hc(cmd, "patch"), ctx->qry.head,
545 ctx->qry.sha1);
546 html("</td><td class='form'>"); 544 html("</td><td class='form'>");
547 html("<form class='right' method='get' action='"); 545 html("<form class='right' method='get' action='");
548 if (ctx->cfg.virtual_root) 546 if (ctx->cfg.virtual_root)
549 html_attr(cgit_fileurl(ctx->qry.repo, "log", 547 html_attr(cgit_fileurl(ctx->qry.repo, "log",
550 ctx->qry.path, NULL)); 548 ctx->qry.path, NULL));
551 html("'>\n"); 549 html("'>\n");
552 add_hidden_formfields(1, 0, "log"); 550 add_hidden_formfields(1, 0, "log");
553 html("<select name='qt'>\n"); 551 html("<select name='qt'>\n");
554 html_option("grep", "log msg", ctx->qry.grep); 552 html_option("grep", "log msg", ctx->qry.grep);
555 html_option("author", "author", ctx->qry.grep); 553 html_option("author", "author", ctx->qry.grep);
556 html_option("committer", "committer", ctx->qry.grep); 554 html_option("committer", "committer", ctx->qry.grep);
557 html("</select>\n"); 555 html("</select>\n");
558 html("<input class='txt' type='text' size='10' name='q' value='"); 556 html("<input class='txt' type='text' size='10' name='q' value='");
559 html_attr(ctx->qry.search); 557 html_attr(ctx->qry.search);
560 html("'/>\n"); 558 html("'/>\n");
561 html("<input type='submit' value='search'/>\n"); 559 html("<input type='submit' value='search'/>\n");
562 html("</form>\n"); 560 html("</form>\n");
563 } else { 561 } else {
564 html("<a class='active' href='"); 562 html("<a class='active' href='");
565 html_attr(cgit_rooturl()); 563 html_attr(cgit_rooturl());
566 html("'>index</a>\n"); 564 html("'>index</a>\n");
567 html("</td><td class='form'>"); 565 html("</td><td class='form'>");
568 html("<form method='get' action='"); 566 html("<form method='get' action='");
569 html_attr(cgit_rooturl()); 567 html_attr(cgit_rooturl());
570 html("'>\n"); 568 html("'>\n");
571 html("<input type='text' name='q' size='10' value='"); 569 html("<input type='text' name='q' size='10' value='");
572 html_attr(ctx->qry.search); 570 html_attr(ctx->qry.search);
573 html("'/>\n"); 571 html("'/>\n");
574 html("<input type='submit' value='search'/>\n"); 572 html("<input type='submit' value='search'/>\n");
575 html("</form>"); 573 html("</form>");
576 } 574 }
577 html("</td></tr></table>\n"); 575 html("</td></tr></table>\n");
578 html("<div class='content'>"); 576 html("<div class='content'>");
579} 577}
580 578
581void cgit_print_filemode(unsigned short mode) 579void cgit_print_filemode(unsigned short mode)
582{ 580{
583 if (S_ISDIR(mode)) 581 if (S_ISDIR(mode))
584 html("d"); 582 html("d");
585 else if (S_ISLNK(mode)) 583 else if (S_ISLNK(mode))
586 html("l"); 584 html("l");
587 else if (S_ISGITLINK(mode)) 585 else if (S_ISGITLINK(mode))
588 html("m"); 586 html("m");
589 else 587 else
590 html("-"); 588 html("-");
591 html_fileperm(mode >> 6); 589 html_fileperm(mode >> 6);
592 html_fileperm(mode >> 3); 590 html_fileperm(mode >> 3);
593 html_fileperm(mode); 591 html_fileperm(mode);
594} 592}
595 593
596void cgit_print_snapshot_links(const char *repo, const char *head, 594void cgit_print_snapshot_links(const char *repo, const char *head,
597 const char *hex, int snapshots) 595 const char *hex, int snapshots)
598{ 596{
599 const struct cgit_snapshot_format* f; 597 const struct cgit_snapshot_format* f;
600 char *filename; 598 char *filename;
601 599
602 for (f = cgit_snapshot_formats; f->suffix; f++) { 600 for (f = cgit_snapshot_formats; f->suffix; f++) {
603 if (!(snapshots & f->bit)) 601 if (!(snapshots & f->bit))
604 continue; 602 continue;
605 filename = fmt("%s-%s%s", cgit_repobasename(repo), hex, 603 filename = fmt("%s-%s%s", cgit_repobasename(repo), hex,
606 f->suffix); 604 f->suffix);
607 cgit_snapshot_link(filename, NULL, NULL, (char *)head, 605 cgit_snapshot_link(filename, NULL, NULL, (char *)head,
608 (char *)hex, filename); 606 (char *)hex, filename);
609 html("<br/>"); 607 html("<br/>");
610 } 608 }
611} 609}
diff --git a/ui-shared.h b/ui-shared.h
index 94de884..76c2b1f 100644
--- a/ui-shared.h
+++ b/ui-shared.h
@@ -1,36 +1,38 @@
1#ifndef UI_SHARED_H 1#ifndef UI_SHARED_H
2#define UI_SHARED_H 2#define UI_SHARED_H
3 3
4extern char *cgit_repourl(const char *reponame); 4extern char *cgit_repourl(const char *reponame);
5extern char *cgit_fileurl(const char *reponame, const char *pagename, 5extern char *cgit_fileurl(const char *reponame, const char *pagename,
6 const char *filename, const char *query); 6 const char *filename, const char *query);
7extern char *cgit_pageurl(const char *reponame, const char *pagename, 7extern char *cgit_pageurl(const char *reponame, const char *pagename,
8 const char *query); 8 const char *query);
9 9
10extern void cgit_tree_link(char *name, char *title, char *class, char *head, 10extern void cgit_tree_link(char *name, char *title, char *class, char *head,
11 char *rev, char *path); 11 char *rev, char *path);
12extern void cgit_log_link(char *name, char *title, char *class, char *head, 12extern void cgit_log_link(char *name, char *title, char *class, char *head,
13 char *rev, char *path, int ofs, char *grep, 13 char *rev, char *path, int ofs, char *grep,
14 char *pattern); 14 char *pattern);
15extern void cgit_commit_link(char *name, char *title, char *class, char *head, 15extern void cgit_commit_link(char *name, char *title, char *class, char *head,
16 char *rev); 16 char *rev);
17extern void cgit_patch_link(char *name, char *title, char *class, char *head,
18 char *rev);
17extern void cgit_refs_link(char *name, char *title, char *class, char *head, 19extern void cgit_refs_link(char *name, char *title, char *class, char *head,
18 char *rev, char *path); 20 char *rev, char *path);
19extern void cgit_snapshot_link(char *name, char *title, char *class, 21extern void cgit_snapshot_link(char *name, char *title, char *class,
20 char *head, char *rev, char *archivename); 22 char *head, char *rev, char *archivename);
21extern void cgit_diff_link(char *name, char *title, char *class, char *head, 23extern void cgit_diff_link(char *name, char *title, char *class, char *head,
22 char *new_rev, char *old_rev, char *path); 24 char *new_rev, char *old_rev, char *path);
23extern void cgit_object_link(struct object *obj); 25extern void cgit_object_link(struct object *obj);
24 26
25extern void cgit_print_error(char *msg); 27extern void cgit_print_error(char *msg);
26extern void cgit_print_date(time_t secs, char *format); 28extern void cgit_print_date(time_t secs, char *format);
27extern void cgit_print_age(time_t t, time_t max_relative, char *format); 29extern void cgit_print_age(time_t t, time_t max_relative, char *format);
28extern void cgit_print_http_headers(struct cgit_context *ctx); 30extern void cgit_print_http_headers(struct cgit_context *ctx);
29extern void cgit_print_docstart(struct cgit_context *ctx); 31extern void cgit_print_docstart(struct cgit_context *ctx);
30extern void cgit_print_docend(); 32extern void cgit_print_docend();
31extern void cgit_print_pageheader(struct cgit_context *ctx); 33extern void cgit_print_pageheader(struct cgit_context *ctx);
32extern void cgit_print_filemode(unsigned short mode); 34extern void cgit_print_filemode(unsigned short mode);
33extern void cgit_print_snapshot_links(const char *repo, const char *head, 35extern void cgit_print_snapshot_links(const char *repo, const char *head,
34 const char *hex, int snapshots); 36 const char *hex, int snapshots);
35 37
36#endif /* UI_SHARED_H */ 38#endif /* UI_SHARED_H */