From 7e3c60a73613e76b483d5b59dd498f38003ef877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Thu, 15 Aug 2019 14:32:44 +0200 Subject: [PATCH v2] Make default pages configurable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It would be nice to be able to configure the default page to use for the root site and repositories. For example, it might make more sense to have "about" or "tree" as the default landing page for certain repos, instead of the default "summary". This patch introduces the following configuration settings: - "root-default-page": sets the default page for the root site (defaults to "repolist") - "repo.default-page": sets the default page for individual repos (defaults to "summary") - "default-page": global default value for "repo.default-page" The following accessory changes were required to make this work: - the "index" tab link on root pages and the "summary" tab link on repo pages now explicitly point to their respective targets instead of pointing to the site/repo root - trying to access the "about" page on a repository without one results in being redirected to the "summary" page explicitly Signed-off-by: Naïm Favier --- Hope this is better, I went all the way and added a per-repo setting too. cgit.c | 10 ++++++++++ cgit.h | 3 +++ cgitrc.5.txt | 14 ++++++++++++++ cmd.c | 18 +++++++++--------- ui-repolist.c | 2 +- ui-shared.c | 12 +++++++++--- ui-shared.h | 2 ++ 7 files changed, 48 insertions(+), 13 deletions(-) diff --git a/cgit.c b/cgit.c index 2910d4b..89a5ba9 100644 --- a/cgit.c +++ b/cgit.c @@ -46,6 +46,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va repo->homepage = xstrdup(value); else if (!strcmp(name, "defbranch")) repo->defbranch = xstrdup(value); + else if (!strcmp(name, "default-page")) + repo->default_page = xstrdup(value); else if (!strcmp(name, "extra-head-content")) repo->extra_head_content = xstrdup(value); else if (!strcmp(name, "snapshots")) @@ -131,6 +133,8 @@ static void config_cb(const char *name, const char *value) ctx.cfg.root_desc = xstrdup(value); else if (!strcmp(name, "root-readme")) ctx.cfg.root_readme = xstrdup(value); + else if (!strcmp(name, "root-default-page")) + ctx.cfg.root_default_page = xstrdup(value); else if (!strcmp(name, "css")) ctx.cfg.css = xstrdup(value); else if (!strcmp(name, "favicon")) @@ -145,6 +149,8 @@ static void config_cb(const char *name, const char *value) ctx.cfg.logo = xstrdup(value); else if (!strcmp(name, "logo-link")) ctx.cfg.logo_link = xstrdup(value); + else if (!strcmp(name, "default-page")) + ctx.cfg.default_page = xstrdup(value); else if (!strcmp(name, "module-link")) ctx.cfg.module_link = xstrdup(value); else if (!strcmp(name, "strict-export")) @@ -367,6 +373,7 @@ static void prepare_context(void) ctx.cfg.branch_sort = 0; ctx.cfg.commit_sort = 0; ctx.cfg.css = "/cgit.css"; + ctx.cfg.default_page= "summary"; ctx.cfg.logo = "/cgit.png"; ctx.cfg.favicon = "/favicon.ico"; ctx.cfg.local_time = 0; @@ -387,6 +394,7 @@ static void prepare_context(void) 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.root_default_page = "repolist"; ctx.cfg.scan_hidden_path = 0; ctx.cfg.script_name = CGIT_SCRIPT_NAME; ctx.cfg.section = ""; @@ -801,6 +809,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo) } if (repo->defbranch) fprintf(f, "repo.defbranch=%s\n", repo->defbranch); + if (repo->default_page) + fprintf(f, "repo.default-page=%s\n", repo->default_page); if (repo->extra_head_content) fprintf(f, "repo.extra-head-content=%s\n", repo->extra_head_content); if (repo->module_link) diff --git a/cgit.h b/cgit.h index 7ec46b4..06024ea 100644 --- a/cgit.h +++ b/cgit.h @@ -86,6 +86,7 @@ struct cgit_repo { char *owner; char *homepage; char *defbranch; + char *default_page; char *module_link; struct string_list readme; char *section; @@ -196,6 +197,7 @@ struct cgit_config { char *clone_prefix; char *clone_url; char *css; + char *default_page; char *favicon; char *footer; char *head_include; @@ -210,6 +212,7 @@ struct cgit_config { char *root_title; char *root_desc; char *root_readme; + char *root_default_page; char *script_name; char *section; char *repository_sort; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index ba77826..2e59180 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -128,6 +128,12 @@ css:: Url which specifies the css document to include in all cgit pages. Default value: "/cgit.css". +default-page:: + Specifies the default page for repositories. This setting is only used + if `repo.default-page` is unspecified. Possible values: "about", + "summary", "refs", "log", "tree", "commit", "diff", "stats". Default + value: "summary". + email-filter:: Specifies a command which will be invoked to format names and email address of committers, authors, and taggers, as represented in various @@ -352,6 +358,10 @@ robots:: Text used as content for the "robots" meta-tag. Default value: "index, nofollow". +root-default-page:: + Specifies the default root page. Possible values are "repolist" and + "about". Default value: "repolist". + root-desc:: Text printed below the heading on the repository index page. Default value: "a fast webinterface for the git dscm". @@ -472,6 +482,10 @@ repo.commit-sort:: ordering. If unset, the default ordering of "git log" is used. Default value: unset. +repo.default-page:: + Specifies the default page for the repository. Default value: global + default-page. + repo.defbranch:: The name of the default branch for this repository. If no such branch exists in the repository, the first branch name (when sorted) is used diff --git a/cmd.c b/cmd.c index bf6d8f5..9eda2c7 100644 --- a/cmd.c +++ b/cmd.c @@ -51,13 +51,10 @@ static void about_fn(void) free(redirect); } else if (ctx.repo->readme.nr) cgit_print_repo_readme(ctx.qry.path); - else if (ctx.repo->homepage) - cgit_redirect(ctx.repo->homepage, false); else { - char *currenturl = cgit_currenturl(); - char *redirect = fmtalloc("%s../", currenturl); + char *redirect = fmtalloc("%s%s/summary/", + ctx.cfg.virtual_root, ctx.repo->url); cgit_redirect(redirect, false); - free(currenturl); free(redirect); } } else @@ -195,10 +192,13 @@ struct cgit_cmd *cgit_get_cmd(void) int i; if (ctx.qry.page == NULL) { - if (ctx.repo) - ctx.qry.page = "summary"; - else - ctx.qry.page = "repolist"; + if (ctx.repo) { + if (ctx.repo->default_page && *ctx.repo->default_page) + ctx.qry.page = ctx.repo->default_page; + else + ctx.qry.page = ctx.cfg.default_page; + } else + ctx.qry.page = ctx.cfg.root_default_page; } for (i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) diff --git a/ui-repolist.c b/ui-repolist.c index 7cf7638..a49f457 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -321,7 +321,7 @@ void cgit_print_repolist(void) } htmlf("", !sorted && section ? "sublevel-repo" : "toplevel-repo"); - cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL); + cgit_repo_link(ctx.repo->name, ctx.repo->name, NULL, NULL); html(""); repourl = cgit_repourl(ctx.repo->url); html_link_open(repourl, NULL, NULL); diff --git a/ui-shared.c b/ui-shared.c index d2358f2..bb3050e 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -327,10 +327,16 @@ static void reporevlink(const char *page, const char *name, const char *title, html(""); } +void cgit_repo_link(const char *name, const char *title, const char *class, + const char *head) +{ + reporevlink(NULL, name, title, class, head, NULL, NULL); +} + void cgit_summary_link(const char *name, const char *title, const char *class, const char *head) { - reporevlink(NULL, name, title, class, head, NULL, NULL); + reporevlink("summary", name, title, class, head, NULL, NULL); } void cgit_tag_link(const char *name, const char *title, const char *class, @@ -994,7 +1000,7 @@ static void print_header(void) if (ctx.repo) { cgit_index_link("index", NULL, NULL, NULL, NULL, 0, 1); html(" : "); - cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL); + cgit_repo_link(ctx.repo->name, ctx.repo->name, NULL, NULL); if (ctx.env.authenticated) { html(""); html("
\n"); @@ -1083,7 +1089,7 @@ void cgit_print_pageheader(void) html("
\n"); } else if (ctx.env.authenticated) { char *currenturl = cgit_currenturl(); - site_link(NULL, "index", NULL, hc("repolist"), NULL, NULL, 0, 1); + site_link("repolist", "index", NULL, hc("repolist"), NULL, NULL, 0, 1); if (ctx.cfg.root_readme) site_link("about", "about", NULL, hc("about"), NULL, NULL, 0, 1); diff --git a/ui-shared.h b/ui-shared.h index 6964873..4d14858 100644 --- a/ui-shared.h +++ b/ui-shared.h @@ -17,6 +17,8 @@ extern void cgit_add_clone_urls(void (*fn)(const char *)); extern void cgit_index_link(const char *name, const char *title, const char *class, const char *pattern, const char *sort, int ofs, int always_root); +extern void cgit_repo_link(const char *name, const char *title, + const char *class, const char *head); extern void cgit_summary_link(const char *name, const char *title, const char *class, const char *head); extern void cgit_tag_link(const char *name, const char *title, -- 2.22.0