From 90f64ad96d2e4490d68db71554ebce7a54206f80 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 28 Apr 2008 23:06:57 +0200 Subject: [PATCH 1/6] Prepare for 'about repo' page Each repo can include an external file which used to be included on the top of the summary page, but it will now soon get a page of it own. Signed-off-by: Lars Hjemli --- ui-summary.c | 14 +++++++++----- ui-summary.h | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ui-summary.c b/ui-summary.c index 318148a..ad0b4a7 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -13,11 +13,6 @@ void cgit_print_summary() { - if (ctx.repo->readme) { - html("
"); - html_include(ctx.repo->readme); - html("
"); - } html(""); cgit_print_branches(ctx.cfg.summary_branches); html(""); @@ -29,3 +24,12 @@ void cgit_print_summary() } html("
 
"); } + +void cgit_print_repo_readme() +{ + if (ctx.repo->readme) { + html("
"); + html_include(ctx.repo->readme); + html("
"); + } +} diff --git a/ui-summary.h b/ui-summary.h index 37aedd2..3e13039 100644 --- a/ui-summary.h +++ b/ui-summary.h @@ -2,5 +2,6 @@ #define UI_SUMMARY_H extern void cgit_print_summary(); +extern void cgit_print_repo_readme(); #endif /* UI_SUMMARY_H */ From 8062817885495b07cf70304c484e8f18c78ab2b5 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 29 Apr 2008 00:35:49 +0200 Subject: [PATCH 2/6] Move included header-file out of repolist table When the 'index-header' option is specified in cgitrc we used to print the included file content inside the repolist table, which is bad style. This commit makes the included file be printed before the table. Signed-off-by: Lars Hjemli --- ui-repolist.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ui-repolist.c b/ui-repolist.c index 98009c0..200640c 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -61,12 +61,6 @@ int is_match(struct cgit_repo *repo) void print_header(int columns) { - if (ctx.cfg.index_header) { - htmlf("", - columns); - html_include(ctx.cfg.index_header); - html(""); - } html("" "Name" "Description" @@ -90,6 +84,9 @@ void cgit_print_repolist() cgit_print_docstart(&ctx); cgit_print_pageheader(&ctx); + if (ctx.cfg.index_header) + html_include(ctx.cfg.index_header); + html(""); for (i=0; i Date: Tue, 29 Apr 2008 00:55:34 +0200 Subject: [PATCH 3/6] Re-enable 'index-info' and add support for 'root-desc' in cgitrc The 'index-info' option got lost when the layout was converted from sidebar to old-fashioned header (noticed by Harley Laue, thanks!), and this commit re-enables it. But there is now also an alternative in the 'root-desc' option; where 'index-info' specifies a file to include, 'root-desc' specifies the text literally. This might be nicer for the one-liner descriptions which these options typically provides. Signed-off-by: Lars Hjemli --- cgit.c | 3 +++ cgit.h | 1 + ui-shared.c | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cgit.c b/cgit.c index 38b0ba5..bbde64b 100644 --- a/cgit.c +++ b/cgit.c @@ -19,6 +19,8 @@ void config_cb(const char *name, const char *value) { if (!strcmp(name, "root-title")) ctx.cfg.root_title = xstrdup(value); + else if (!strcmp(name, "root-desc")) + ctx.cfg.root_desc = xstrdup(value); else if (!strcmp(name, "css")) ctx.cfg.css = xstrdup(value); else if (!strcmp(name, "logo")) @@ -159,6 +161,7 @@ static void prepare_context(struct cgit_context *ctx) ctx->cfg.renamelimit = -1; ctx->cfg.robots = "index, nofollow"; ctx->cfg.root_title = "Git repository browser"; + ctx->cfg.root_desc = "a fast webinterface for the git dscm"; ctx->cfg.script_name = CGIT_SCRIPT_NAME; ctx->page.mimetype = "text/html"; ctx->page.charset = PAGE_ENCODING; diff --git a/cgit.h b/cgit.h index a3b6535..7761b6e 100644 --- a/cgit.h +++ b/cgit.h @@ -132,6 +132,7 @@ struct cgit_config { char *repo_group; char *robots; char *root_title; + char *root_desc; char *script_name; char *virtual_root; int cache_dynamic_ttl; diff --git a/ui-shared.c b/ui-shared.c index 8a804c2..83758f7 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -510,7 +510,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) html_txt(ctx->repo->desc); } else { html(">"); - html_txt("a fast webinterface for the git dscm"); + if (ctx->cfg.root_desc) + html_txt(ctx->cfg.root_desc); + else if (ctx->cfg.index_info) + html_include(ctx->cfg.index_info); } html("
\n"); From 651ef79768dde30aabc61189974c9047ee43752f Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 29 Apr 2008 01:01:30 +0200 Subject: [PATCH 4/6] Make it possible for a single cmd to work both with and without a repo When cgit_cmd.want_repo was 0, we used to assume that the cmd would never be invoked for a repo. But soon this will become untrue (the 'about' cmd is rapidly approching), so from now on we will initialize any requested repo even if want_repo==0 (and return an error if want_repo==1 but no repo is specified). Signed-off-by: Lars Hjemli --- cgit.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cgit.c b/cgit.c index bbde64b..d37abc9 100644 --- a/cgit.c +++ b/cgit.c @@ -307,7 +307,16 @@ static void process_request(struct cgit_context *ctx) return; } - if (cmd->want_repo && prepare_repo_cmd(ctx)) + if (cmd->want_repo && !ctx->repo) { + cgit_print_http_headers(ctx); + cgit_print_docstart(ctx); + cgit_print_pageheader(ctx); + cgit_print_error(fmt("No repository selected")); + cgit_print_docend(); + return; + } + + if (ctx->repo && prepare_repo_cmd(ctx)) return; if (cmd->want_layout) { From c6431a71508f1b61a95b01d85fe4534a0245e626 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 29 Apr 2008 01:06:30 +0200 Subject: [PATCH 5/6] Prepare for 'about site' page / add 'root-readme' option to cgitrc The new option names a file which will be included on a new page, next to the current 'index' page. Signed-off-by: Lars Hjemli --- cgit.c | 2 ++ cgit.h | 1 + ui-repolist.c | 6 ++++++ ui-repolist.h | 1 + 4 files changed, 10 insertions(+) diff --git a/cgit.c b/cgit.c index d37abc9..a402758 100644 --- a/cgit.c +++ b/cgit.c @@ -21,6 +21,8 @@ void config_cb(const char *name, const char *value) ctx.cfg.root_title = xstrdup(value); else if (!strcmp(name, "root-desc")) ctx.cfg.root_desc = xstrdup(value); + else if (!strcmp(name, "root-readme")) + ctx.cfg.root_readme = xstrdup(value); else if (!strcmp(name, "css")) ctx.cfg.css = xstrdup(value); else if (!strcmp(name, "logo")) diff --git a/cgit.h b/cgit.h index 7761b6e..daebeff 100644 --- a/cgit.h +++ b/cgit.h @@ -133,6 +133,7 @@ struct cgit_config { char *robots; char *root_title; char *root_desc; + char *root_readme; char *script_name; char *virtual_root; int cache_dynamic_ttl; diff --git a/ui-repolist.c b/ui-repolist.c index 200640c..3f78e28 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -136,3 +136,9 @@ void cgit_print_repolist() cgit_print_error("No repositories found"); cgit_print_docend(); } + +void cgit_print_site_readme() +{ + if (ctx.cfg.root_readme) + html_include(ctx.cfg.root_readme); +} diff --git a/ui-repolist.h b/ui-repolist.h index c23e5d2..5b1e542 100644 --- a/ui-repolist.h +++ b/ui-repolist.h @@ -2,5 +2,6 @@ #define UI_REPOLIST_H extern void cgit_print_repolist(); +extern void cgit_print_site_readme(); #endif /* UI_REPOLIST_H */ From 71adba1f1678914063fc109cf3805afde2c68f75 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 29 Apr 2008 01:09:41 +0200 Subject: [PATCH 6/6] Add 'about site' and 'about repo' pages This commit uses the options and changes from the last few commits to implement a new 'about' command which works both with and without a repo. Signed-off-by: Lars Hjemli --- cmd.c | 9 +++++++++ ui-shared.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/cmd.c b/cmd.c index e0eacbe..6cc91e6 100644 --- a/cmd.c +++ b/cmd.c @@ -20,6 +20,14 @@ #include "ui-tag.h" #include "ui-tree.h" +static void about_fn(struct cgit_context *ctx) +{ + if (ctx->repo) + cgit_print_repo_readme(); + else + cgit_print_site_readme(); +} + static void blob_fn(struct cgit_context *ctx) { cgit_print_blob(ctx->qry.sha1, ctx->qry.path); @@ -84,6 +92,7 @@ static void tree_fn(struct cgit_context *ctx) struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) { static struct cgit_cmd cmds[] = { + def_cmd(about, 0, 1), def_cmd(blob, 1, 0), def_cmd(commit, 1, 1), def_cmd(diff, 1, 1), diff --git a/ui-shared.c b/ui-shared.c index 83758f7..d08ede9 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -114,6 +114,49 @@ char *cgit_currurl() return fmt("%s/", ctx.cfg.virtual_root); } +static void site_url(char *page, char *search) +{ + char *delim = "?"; + + if (ctx.cfg.virtual_root) { + html_attr(ctx.cfg.virtual_root); + if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') + html("/"); + } else + html(ctx.cfg.script_name); + + if (page) { + htmlf("?p=%s", page); + delim = "&"; + } + if (search) { + html(delim); + html("q="); + html_attr(search); + } +} + +static void site_link(char *page, char *name, char *title, char *class, + char *search) +{ + html(""); + html_txt(name); + html(""); +} + static char *repolink(char *title, char *class, char *page, char *head, char *path) { @@ -531,6 +574,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) ctx->qry.head, ctx->qry.sha1); cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, ctx->qry.sha1, ctx->qry.sha2, NULL); + if (ctx->repo->readme) + reporevlink("about", "about", NULL, + hc(cmd, "about"), ctx->qry.head, NULL, + NULL); html(""); html("
\n"); html("
\n"); } else { - html("index\n"); + site_link(NULL, "index", NULL, hc(cmd, "repolist"), NULL); + if (ctx->cfg.root_readme) + site_link("about", "about", NULL, hc(cmd, "about"), NULL); html(""); html("