* lh/about: Add 'about site' and 'about repo' pages Prepare for 'about site' page / add 'root-readme' option to cgitrc Make it possible for a single cmd to work both with and without a repo Re-enable 'index-info' and add support for 'root-desc' in cgitrc Move included header-file out of repolist table Prepare for 'about repo' page
Unified · Split
| @@ -19,6 +19,10 @@ void config_cb(const char *name, const char *value) · 18 unmodified lines | ||
| 19 | 19 | { |
| 20 | 20 | if (!strcmp(name, "root-title")) |
| 21 | 21 | ctx.cfg.root_title = xstrdup(value); |
| 22 | + else if (!strcmp(name, "root-desc")) | |
| 23 | + ctx.cfg.root_desc = xstrdup(value); | |
| 24 | + else if (!strcmp(name, "root-readme")) | |
| 25 | + ctx.cfg.root_readme = xstrdup(value); | |
| 22 | 26 | else if (!strcmp(name, "css")) |
| 23 | 27 | ctx.cfg.css = xstrdup(value); |
| 24 | 28 | else if (!strcmp(name, "logo")) |
| @@ -159,6 +163,7 @@ static void prepare_context(struct cgit_context *ctx) · 134 unmodified lines | ||
| 159 | 163 | ctx->cfg.renamelimit = -1; |
| 160 | 164 | ctx->cfg.robots = "index, nofollow"; |
| 161 | 165 | ctx->cfg.root_title = "Git repository browser"; |
| 166 | + ctx->cfg.root_desc = "a fast webinterface for the git dscm"; | |
| 162 | 167 | ctx->cfg.script_name = CGIT_SCRIPT_NAME; |
| 163 | 168 | ctx->page.mimetype = "text/html"; |
| 164 | 169 | ctx->page.charset = PAGE_ENCODING; |
| @@ -304,7 +309,16 @@ static void process_request(struct cgit_context *ctx) · 139 unmodified lines | ||
| 304 | 309 | return; |
| 305 | 310 | } |
| 306 | 311 | |
| 307 | − if (cmd->want_repo && prepare_repo_cmd(ctx)) | |
| 312 | + if (cmd->want_repo && !ctx->repo) { | |
| 313 | + cgit_print_http_headers(ctx); | |
| 314 | + cgit_print_docstart(ctx); | |
| 315 | + cgit_print_pageheader(ctx); | |
| 316 | + cgit_print_error(fmt("No repository selected")); | |
| 317 | + cgit_print_docend(); | |
| 318 | + return; | |
| 319 | + } | |
| 320 | + | |
| 321 | + if (ctx->repo && prepare_repo_cmd(ctx)) | |
| 308 | 322 | return; |
| 309 | 323 | |
| 310 | 324 | if (cmd->want_layout) { |
| @@ -132,6 +132,8 @@ struct cgit_config { · 131 unmodified lines | ||
| 132 | 132 | char *repo_group; |
| 133 | 133 | char *robots; |
| 134 | 134 | char *root_title; |
| 135 | + char *root_desc; | |
| 136 | + char *root_readme; | |
| 135 | 137 | char *script_name; |
| 136 | 138 | char *virtual_root; |
| 137 | 139 | int cache_dynamic_ttl; |
| @@ -20,6 +20,14 @@ · 19 unmodified lines | ||
| 20 | 20 | #include "ui-tag.h" |
| 21 | 21 | #include "ui-tree.h" |
| 22 | 22 | |
| 23 | +static void about_fn(struct cgit_context *ctx) | |
| 24 | +{ | |
| 25 | + if (ctx->repo) | |
| 26 | + cgit_print_repo_readme(); | |
| 27 | + else | |
| 28 | + cgit_print_site_readme(); | |
| 29 | +} | |
| 30 | + | |
| 23 | 31 | static void blob_fn(struct cgit_context *ctx) |
| 24 | 32 | { |
| 25 | 33 | cgit_print_blob(ctx->qry.sha1, ctx->qry.path); |
| @@ -84,6 +92,7 @@ static void tree_fn(struct cgit_context *ctx) · 58 unmodified lines | ||
| 84 | 92 | struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) |
| 85 | 93 | { |
| 86 | 94 | static struct cgit_cmd cmds[] = { |
| 95 | + def_cmd(about, 0, 1), | |
| 87 | 96 | def_cmd(blob, 1, 0), |
| 88 | 97 | def_cmd(commit, 1, 1), |
| 89 | 98 | def_cmd(diff, 1, 1), |
| @@ -61,12 +61,6 @@ int is_match(struct cgit_repo *repo) · 60 unmodified lines | ||
| 61 | 61 | |
| 62 | 62 | void print_header(int columns) |
| 63 | 63 | { |
| 64 | − if (ctx.cfg.index_header) { | |
| 65 | − htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>", | |
| 66 | − columns); | |
| 67 | − html_include(ctx.cfg.index_header); | |
| 68 | − html("</td></tr>"); | |
| 69 | − } | |
| 70 | 64 | html("<tr class='nohover'>" |
| 71 | 65 | "<th class='left'>Name</th>" |
| 72 | 66 | "<th class='left'>Description</th>" |
| @@ -90,6 +84,9 @@ void cgit_print_repolist() · 17 unmodified lines | ||
| 90 | 84 | cgit_print_docstart(&ctx); |
| 91 | 85 | cgit_print_pageheader(&ctx); |
| 92 | 86 | |
| 87 | + if (ctx.cfg.index_header) | |
| 88 | + html_include(ctx.cfg.index_header); | |
| 89 | + | |
| 93 | 90 | html("<table summary='repository list' class='list nowrap'>"); |
| 94 | 91 | for (i=0; i<cgit_repolist.count; i++) { |
| 95 | 92 | ctx.repo = &cgit_repolist.repos[i]; |
| @@ -139,3 +136,9 @@ void cgit_print_repolist() · 43 unmodified lines | ||
| 139 | 136 | cgit_print_error("No repositories found"); |
| 140 | 137 | cgit_print_docend(); |
| 141 | 138 | } |
| 139 | + | |
| 140 | +void cgit_print_site_readme() | |
| 141 | +{ | |
| 142 | + if (ctx.cfg.root_readme) | |
| 143 | + html_include(ctx.cfg.root_readme); | |
| 144 | +} | |
| @@ -2,5 +2,6 @@ · 1 unmodified line | ||
| 2 | 2 | #define UI_REPOLIST_H |
| 3 | 3 | |
| 4 | 4 | extern void cgit_print_repolist(); |
| 5 | +extern void cgit_print_site_readme(); | |
| 5 | 6 | |
| 6 | 7 | #endif /* UI_REPOLIST_H */ |
| @@ -114,6 +114,49 @@ char *cgit_currurl() · 113 unmodified lines | ||
| 114 | 114 | return fmt("%s/", ctx.cfg.virtual_root); |
| 115 | 115 | } |
| 116 | 116 | |
| 117 | +static void site_url(char *page, char *search) | |
| 118 | +{ | |
| 119 | + char *delim = "?"; | |
| 120 | + | |
| 121 | + if (ctx.cfg.virtual_root) { | |
| 122 | + html_attr(ctx.cfg.virtual_root); | |
| 123 | + if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') | |
| 124 | + html("/"); | |
| 125 | + } else | |
| 126 | + html(ctx.cfg.script_name); | |
| 127 | + | |
| 128 | + if (page) { | |
| 129 | + htmlf("?p=%s", page); | |
| 130 | + delim = "&"; | |
| 131 | + } | |
| 132 | + if (search) { | |
| 133 | + html(delim); | |
| 134 | + html("q="); | |
| 135 | + html_attr(search); | |
| 136 | + } | |
| 137 | +} | |
| 138 | + | |
| 139 | +static void site_link(char *page, char *name, char *title, char *class, | |
| 140 | + char *search) | |
| 141 | +{ | |
| 142 | + html("<a"); | |
| 143 | + if (title) { | |
| 144 | + html(" title='"); | |
| 145 | + html_attr(title); | |
| 146 | + html("'"); | |
| 147 | + } | |
| 148 | + if (class) { | |
| 149 | + html(" class='"); | |
| 150 | + html_attr(class); | |
| 151 | + html("'"); | |
| 152 | + } | |
| 153 | + html(" href='"); | |
| 154 | + site_url(page, search); | |
| 155 | + html("'>"); | |
| 156 | + html_txt(name); | |
| 157 | + html("</a>"); | |
| 158 | +} | |
| 159 | + | |
| 117 | 160 | static char *repolink(char *title, char *class, char *page, char *head, |
| 118 | 161 | char *path) |
| 119 | 162 | { |
| @@ -510,7 +553,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) · 390 unmodified lines | ||
| 510 | 553 | html_txt(ctx->repo->desc); |
| 511 | 554 | } else { |
| 512 | 555 | html(">"); |
| 513 | − html_txt("a fast webinterface for the git dscm"); | |
| 556 | + if (ctx->cfg.root_desc) | |
| 557 | + html_txt(ctx->cfg.root_desc); | |
| 558 | + else if (ctx->cfg.index_info) | |
| 559 | + html_include(ctx->cfg.index_info); | |
| 514 | 560 | } |
| 515 | 561 | html("</td></tr></table>\n"); |
| 516 | 562 | |
| @@ -528,6 +574,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) · 11 unmodified lines | ||
| 528 | 574 | ctx->qry.head, ctx->qry.sha1); |
| 529 | 575 | cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, |
| 530 | 576 | ctx->qry.sha1, ctx->qry.sha2, NULL); |
| 577 | + if (ctx->repo->readme) | |
| 578 | + reporevlink("about", "about", NULL, | |
| 579 | + hc(cmd, "about"), ctx->qry.head, NULL, | |
| 580 | + NULL); | |
| 531 | 581 | html("</td><td class='form'>"); |
| 532 | 582 | html("<form class='right' method='get' action='"); |
| 533 | 583 | if (ctx->cfg.virtual_root) |
| @@ -546,9 +596,9 @@ void cgit_print_pageheader(struct cgit_context *ctx) · 12 unmodified lines | ||
| 546 | 596 | html("<input type='submit' value='search'/>\n"); |
| 547 | 597 | html("</form>\n"); |
| 548 | 598 | } else { |
| 549 | − html("<a class='active' href='"); | |
| 550 | − html_attr(cgit_rooturl()); | |
| 551 | − html("'>index</a>\n"); | |
| 599 | + site_link(NULL, "index", NULL, hc(cmd, "repolist"), NULL); | |
| 600 | + if (ctx->cfg.root_readme) | |
| 601 | + site_link("about", "about", NULL, hc(cmd, "about"), NULL); | |
| 552 | 602 | html("</td><td class='form'>"); |
| 553 | 603 | html("<form method='get' action='"); |
| 554 | 604 | html_attr(cgit_rooturl()); |
| @@ -13,11 +13,6 @@ · 12 unmodified lines | ||
| 13 | 13 | |
| 14 | 14 | void cgit_print_summary() |
| 15 | 15 | { |
| 16 | − if (ctx.repo->readme) { | |
| 17 | − html("<div id='summary'>"); | |
| 18 | − html_include(ctx.repo->readme); | |
| 19 | − html("</div>"); | |
| 20 | − } | |
| 21 | 16 | html("<table summary='repository info' class='list nowrap'>"); |
| 22 | 17 | cgit_print_branches(ctx.cfg.summary_branches); |
| 23 | 18 | html("<tr class='nohover'><td colspan='4'> </td></tr>"); |
| @@ -29,3 +24,12 @@ void cgit_print_summary() · 5 unmodified lines | ||
| 29 | 24 | } |
| 30 | 25 | html("</table>"); |
| 31 | 26 | } |
| 27 | + | |
| 28 | +void cgit_print_repo_readme() | |
| 29 | +{ | |
| 30 | + if (ctx.repo->readme) { | |
| 31 | + html("<div id='summary'>"); | |
| 32 | + html_include(ctx.repo->readme); | |
| 33 | + html("</div>"); | |
| 34 | + } | |
| 35 | +} | |
| @@ -2,5 +2,6 @@ · 1 unmodified line | ||
| 2 | 2 | #define UI_SUMMARY_H |
| 3 | 3 | |
| 4 | 4 | extern void cgit_print_summary(); |
| 5 | +extern void cgit_print_repo_readme(); | |
| 5 | 6 | |
| 6 | 7 | #endif /* UI_SUMMARY_H */ |