From efe96cc0e19d69e74e235c431c634040ee08baa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Mon, 9 Dec 2019 19:38:14 +0100 Subject: Make default pages configurable --- 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 08d81a1..8753afc 100644 --- a/cgit.c +++ b/cgit.c @@ -56,6 +56,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")) @@ -141,6 +143,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")) @@ -155,6 +159,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")) @@ -377,6 +383,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; @@ -397,6 +404,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 = ""; @@ -806,6 +814,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 69b5c13..a50c545 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 33a6a8c..a7fa5d0 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". @@ -475,6 +485,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 0eb75b1..669c345 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 529a203..75db72a 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 acd8ab5..cbf0752 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -328,10 +328,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, @@ -995,7 +1001,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"); @@ -1084,7 +1090,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, -- cgit v1.2.3