History

Merge branch 'lh/about'

* 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

Lars Hjemli committed 18 years ago

Commit 905dbae2 parents d188ed4 71adba18 files · +100 −16Browse files

Unified · Split

8 files
  1. cgit.c +15 −1
  2. cgit.h +2 −0
  3. cmd.c +9 −0
  4. ui-repolist.c +9 −6
  5. ui-repolist.h +1 −0
  6. ui-shared.c +54 −4
  7. ui-summary.c +9 −5
  8. ui-summary.h +1 −0
cgit.c+15−1
@@ -19,6 +19,10 @@ void config_cb(const char *name, const char *value) · 18 unmodified lines
19{19{
20 if (!strcmp(name, "root-title"))20 if (!strcmp(name, "root-title"))
21 ctx.cfg.root_title = xstrdup(value);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 else if (!strcmp(name, "css"))26 else if (!strcmp(name, "css"))
23 ctx.cfg.css = xstrdup(value);27 ctx.cfg.css = xstrdup(value);
24 else if (!strcmp(name, "logo"))28 else if (!strcmp(name, "logo"))
@@ -159,6 +163,7 @@ static void prepare_context(struct cgit_context *ctx) · 134 unmodified lines
159 ctx->cfg.renamelimit = -1;163 ctx->cfg.renamelimit = -1;
160 ctx->cfg.robots = "index, nofollow";164 ctx->cfg.robots = "index, nofollow";
161 ctx->cfg.root_title = "Git repository browser";165 ctx->cfg.root_title = "Git repository browser";
166 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
162 ctx->cfg.script_name = CGIT_SCRIPT_NAME;167 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
163 ctx->page.mimetype = "text/html";168 ctx->page.mimetype = "text/html";
164 ctx->page.charset = PAGE_ENCODING;169 ctx->page.charset = PAGE_ENCODING;
@@ -304,7 +309,16 @@ static void process_request(struct cgit_context *ctx) · 139 unmodified lines
304 return;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 return;322 return;
309 323
310 if (cmd->want_layout) {324 if (cmd->want_layout) {
cgit.h+2−0
@@ -132,6 +132,8 @@ struct cgit_config { · 131 unmodified lines
132 char *repo_group;132 char *repo_group;
133 char *robots;133 char *robots;
134 char *root_title;134 char *root_title;
135 char *root_desc;
136 char *root_readme;
135 char *script_name;137 char *script_name;
136 char *virtual_root;138 char *virtual_root;
137 int cache_dynamic_ttl;139 int cache_dynamic_ttl;
cmd.c+9−0
@@ -20,6 +20,14 @@ · 19 unmodified lines
20#include "ui-tag.h"20#include "ui-tag.h"
21#include "ui-tree.h"21#include "ui-tree.h"
22 22
23static 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
23static void blob_fn(struct cgit_context *ctx)31static void blob_fn(struct cgit_context *ctx)
24{32{
25 cgit_print_blob(ctx->qry.sha1, ctx->qry.path);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
84struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)92struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
85{93{
86 static struct cgit_cmd cmds[] = {94 static struct cgit_cmd cmds[] = {
95 def_cmd(about, 0, 1),
87 def_cmd(blob, 1, 0),96 def_cmd(blob, 1, 0),
88 def_cmd(commit, 1, 1),97 def_cmd(commit, 1, 1),
89 def_cmd(diff, 1, 1),98 def_cmd(diff, 1, 1),
ui-repolist.c+9−6
@@ -61,12 +61,6 @@ int is_match(struct cgit_repo *repo) · 60 unmodified lines
61 61
62void print_header(int columns)62void 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 html("<tr class='nohover'>"64 html("<tr class='nohover'>"
71 "<th class='left'>Name</th>"65 "<th class='left'>Name</th>"
72 "<th class='left'>Description</th>"66 "<th class='left'>Description</th>"
@@ -90,6 +84,9 @@ void cgit_print_repolist() · 17 unmodified lines
90 cgit_print_docstart(&ctx);84 cgit_print_docstart(&ctx);
91 cgit_print_pageheader(&ctx);85 cgit_print_pageheader(&ctx);
92 86
87 if (ctx.cfg.index_header)
88 html_include(ctx.cfg.index_header);
89
93 html("<table summary='repository list' class='list nowrap'>");90 html("<table summary='repository list' class='list nowrap'>");
94 for (i=0; i<cgit_repolist.count; i++) {91 for (i=0; i<cgit_repolist.count; i++) {
95 ctx.repo = &cgit_repolist.repos[i];92 ctx.repo = &cgit_repolist.repos[i];
@@ -139,3 +136,9 @@ void cgit_print_repolist() · 43 unmodified lines
139 cgit_print_error("No repositories found");136 cgit_print_error("No repositories found");
140 cgit_print_docend();137 cgit_print_docend();
141}138}
139
140void cgit_print_site_readme()
141{
142 if (ctx.cfg.root_readme)
143 html_include(ctx.cfg.root_readme);
144}
ui-repolist.h+1−0
@@ -2,5 +2,6 @@ · 1 unmodified line
2#define UI_REPOLIST_H2#define UI_REPOLIST_H
3 3
4extern void cgit_print_repolist();4extern void cgit_print_repolist();
5extern void cgit_print_site_readme();
5 6
6#endif /* UI_REPOLIST_H */7#endif /* UI_REPOLIST_H */
ui-shared.c+54−4
@@ -114,6 +114,49 @@ char *cgit_currurl() · 113 unmodified lines
114 return fmt("%s/", ctx.cfg.virtual_root);114 return fmt("%s/", ctx.cfg.virtual_root);
115}115}
116 116
117static 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
139static 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
117static char *repolink(char *title, char *class, char *page, char *head,160static char *repolink(char *title, char *class, char *page, char *head,
118 char *path)161 char *path)
119{162{
@@ -510,7 +553,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) · 390 unmodified lines
510 html_txt(ctx->repo->desc);553 html_txt(ctx->repo->desc);
511 } else {554 } else {
512 html(">");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 html("</td></tr></table>\n");561 html("</td></tr></table>\n");
516 562
@@ -528,6 +574,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) · 11 unmodified lines
528 ctx->qry.head, ctx->qry.sha1);574 ctx->qry.head, ctx->qry.sha1);
529 cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head,575 cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head,
530 ctx->qry.sha1, ctx->qry.sha2, NULL);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 html("</td><td class='form'>");581 html("</td><td class='form'>");
532 html("<form class='right' method='get' action='");582 html("<form class='right' method='get' action='");
533 if (ctx->cfg.virtual_root)583 if (ctx->cfg.virtual_root)
@@ -546,9 +596,9 @@ void cgit_print_pageheader(struct cgit_context *ctx) · 12 unmodified lines
546 html("<input type='submit' value='search'/>\n");596 html("<input type='submit' value='search'/>\n");
547 html("</form>\n");597 html("</form>\n");
548 } else {598 } else {
549 html("<a class='active' href='");599 site_link(NULL, "index", NULL, hc(cmd, "repolist"), NULL);
550 html_attr(cgit_rooturl());600 if (ctx->cfg.root_readme)
551 html("'>index</a>\n");601 site_link("about", "about", NULL, hc(cmd, "about"), NULL);
552 html("</td><td class='form'>");602 html("</td><td class='form'>");
553 html("<form method='get' action='");603 html("<form method='get' action='");
554 html_attr(cgit_rooturl());604 html_attr(cgit_rooturl());
ui-summary.c+9−5
@@ -13,11 +13,6 @@ · 12 unmodified lines
13 13
14void cgit_print_summary()14void 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 html("<table summary='repository info' class='list nowrap'>");16 html("<table summary='repository info' class='list nowrap'>");
22 cgit_print_branches(ctx.cfg.summary_branches);17 cgit_print_branches(ctx.cfg.summary_branches);
23 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");18 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
@@ -29,3 +24,12 @@ void cgit_print_summary() · 5 unmodified lines
29 }24 }
30 html("</table>");25 html("</table>");
31}26}
27
28void 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}
ui-summary.h+1−0
@@ -2,5 +2,6 @@ · 1 unmodified line
2#define UI_SUMMARY_H2#define UI_SUMMARY_H
3 3
4extern void cgit_print_summary();4extern void cgit_print_summary();
5extern void cgit_print_repo_readme();
5 6
6#endif /* UI_SUMMARY_H */7#endif /* UI_SUMMARY_H */