Make default pages configurable

Signed-off-by: Christian Hesse <mail@eworm.de>
This commit is contained in:
Naïm Favier 2019-12-09 19:38:14 +01:00 committed by Christian Hesse
parent 00ecfaadea
commit d9f3d6fb18
7 changed files with 48 additions and 13 deletions

10
cgit.c
View File

@ -56,6 +56,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va
repo->homepage = xstrdup(value); repo->homepage = xstrdup(value);
else if (!strcmp(name, "defbranch")) else if (!strcmp(name, "defbranch"))
repo->defbranch = xstrdup(value); repo->defbranch = xstrdup(value);
else if (!strcmp(name, "default-page"))
repo->default_page = xstrdup(value);
else if (!strcmp(name, "extra-head-content")) else if (!strcmp(name, "extra-head-content"))
repo->extra_head_content = xstrdup(value); repo->extra_head_content = xstrdup(value);
else if (!strcmp(name, "snapshots")) 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); ctx.cfg.root_desc = xstrdup(value);
else if (!strcmp(name, "root-readme")) else if (!strcmp(name, "root-readme"))
ctx.cfg.root_readme = xstrdup(value); 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")) else if (!strcmp(name, "css"))
string_list_append(&ctx.cfg.css, xstrdup(value)); string_list_append(&ctx.cfg.css, xstrdup(value));
else if (!strcmp(name, "js")) else if (!strcmp(name, "js"))
@ -157,6 +161,8 @@ static void config_cb(const char *name, const char *value)
ctx.cfg.logo = xstrdup(value); ctx.cfg.logo = xstrdup(value);
else if (!strcmp(name, "logo-link")) else if (!strcmp(name, "logo-link"))
ctx.cfg.logo_link = xstrdup(value); ctx.cfg.logo_link = xstrdup(value);
else if (!strcmp(name, "default-page"))
ctx.cfg.default_page = xstrdup(value);
else if (!strcmp(name, "module-link")) else if (!strcmp(name, "module-link"))
ctx.cfg.module_link = xstrdup(value); ctx.cfg.module_link = xstrdup(value);
else if (!strcmp(name, "strict-export")) else if (!strcmp(name, "strict-export"))
@ -380,6 +386,7 @@ static void prepare_context(void)
ctx.cfg.case_sensitive_sort = 1; ctx.cfg.case_sensitive_sort = 1;
ctx.cfg.branch_sort = 0; ctx.cfg.branch_sort = 0;
ctx.cfg.commit_sort = 0; ctx.cfg.commit_sort = 0;
ctx.cfg.default_page= "summary";
ctx.cfg.logo = "/cgit.png"; ctx.cfg.logo = "/cgit.png";
ctx.cfg.favicon = "/favicon.ico"; ctx.cfg.favicon = "/favicon.ico";
ctx.cfg.local_time = 0; ctx.cfg.local_time = 0;
@ -400,6 +407,7 @@ static void prepare_context(void)
ctx.cfg.robots = "index, nofollow"; ctx.cfg.robots = "index, nofollow";
ctx.cfg.root_title = "Git repository browser"; ctx.cfg.root_title = "Git repository browser";
ctx.cfg.root_desc = "a fast webinterface for the git dscm"; 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.scan_hidden_path = 0;
ctx.cfg.script_name = CGIT_SCRIPT_NAME; ctx.cfg.script_name = CGIT_SCRIPT_NAME;
ctx.cfg.section = ""; ctx.cfg.section = "";
@ -811,6 +819,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo)
} }
if (repo->defbranch) if (repo->defbranch)
fprintf(f, "repo.defbranch=%s\n", 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) if (repo->extra_head_content)
fprintf(f, "repo.extra-head-content=%s\n", repo->extra_head_content); fprintf(f, "repo.extra-head-content=%s\n", repo->extra_head_content);
if (repo->module_link) if (repo->module_link)

3
cgit.h
View File

@ -87,6 +87,7 @@ struct cgit_repo {
char *owner; char *owner;
char *homepage; char *homepage;
char *defbranch; char *defbranch;
char *default_page;
char *module_link; char *module_link;
struct string_list readme; struct string_list readme;
char *section; char *section;
@ -196,6 +197,7 @@ struct cgit_config {
char *cache_root; char *cache_root;
char *clone_prefix; char *clone_prefix;
char *clone_url; char *clone_url;
char *default_page;
char *favicon; char *favicon;
char *footer; char *footer;
char *head_include; char *head_include;
@ -211,6 +213,7 @@ struct cgit_config {
char *root_title; char *root_title;
char *root_desc; char *root_desc;
char *root_readme; char *root_readme;
char *root_default_page;
char *script_name; char *script_name;
char *section; char *section;
char *repository_sort; char *repository_sort;

View File

@ -129,6 +129,12 @@ css::
Default value: "/cgit.css". May be given multiple times, each Default value: "/cgit.css". May be given multiple times, each
css URL path is added in the head section of the document in turn. css URL path is added in the head section of the document in turn.
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:: email-filter::
Specifies a command which will be invoked to format names and email Specifies a command which will be invoked to format names and email
address of committers, authors, and taggers, as represented in various address of committers, authors, and taggers, as represented in various
@ -359,6 +365,10 @@ robots::
Text used as content for the "robots" meta-tag. Default value: Text used as content for the "robots" meta-tag. Default value:
"index, nofollow". "index, nofollow".
root-default-page::
Specifies the default root page. Possible values are "repolist" and
"about". Default value: "repolist".
root-desc:: root-desc::
Text printed below the heading on the repository index page. Default Text printed below the heading on the repository index page. Default
value: "a fast webinterface for the git dscm". value: "a fast webinterface for the git dscm".
@ -482,6 +492,10 @@ repo.commit-sort::
ordering. If unset, the default ordering of "git log" is used. Default ordering. If unset, the default ordering of "git log" is used. Default
value: unset. value: unset.
repo.default-page::
Specifies the default page for the repository. Default value: global
default-page.
repo.defbranch:: repo.defbranch::
The name of the default branch for this repository. If no such branch 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 exists in the repository, the first branch name (when sorted) is used

18
cmd.c
View File

@ -51,13 +51,10 @@ static void about_fn(void)
free(redirect); free(redirect);
} else if (ctx.repo->readme.nr) } else if (ctx.repo->readme.nr)
cgit_print_repo_readme(ctx.qry.path); cgit_print_repo_readme(ctx.qry.path);
else if (ctx.repo->homepage)
cgit_redirect(ctx.repo->homepage, false);
else { else {
char *currenturl = cgit_currenturl(); char *redirect = fmtalloc("%s%s/summary/",
char *redirect = fmtalloc("%s../", currenturl); ctx.cfg.virtual_root, ctx.repo->url);
cgit_redirect(redirect, false); cgit_redirect(redirect, false);
free(currenturl);
free(redirect); free(redirect);
} }
} else } else
@ -195,10 +192,13 @@ struct cgit_cmd *cgit_get_cmd(void)
int i; int i;
if (ctx.qry.page == NULL) { if (ctx.qry.page == NULL) {
if (ctx.repo) if (ctx.repo) {
ctx.qry.page = "summary"; if (ctx.repo->default_page && *ctx.repo->default_page)
else ctx.qry.page = ctx.repo->default_page;
ctx.qry.page = "repolist"; 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++) for (i = 0; i < sizeof(cmds)/sizeof(*cmds); i++)

View File

@ -321,7 +321,7 @@ void cgit_print_repolist(void)
} }
htmlf("<tr><td class='%s'>", htmlf("<tr><td class='%s'>",
!sorted && section ? "sublevel-repo" : "toplevel-repo"); !sorted && section ? "sublevel-repo" : "toplevel-repo");
cgit_summary_link(ctx.repo->name, NULL, NULL, NULL); cgit_repo_link(ctx.repo->name, NULL, NULL, NULL);
html("</td><td>"); html("</td><td>");
repourl = cgit_repourl(ctx.repo->url); repourl = cgit_repourl(ctx.repo->url);
html_link_open(repourl, NULL, NULL); html_link_open(repourl, NULL, NULL);

View File

@ -328,10 +328,16 @@ static void reporevlink(const char *page, const char *name, const char *title,
html("</a>"); html("</a>");
} }
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, void cgit_summary_link(const char *name, const char *title, const char *class,
const char *head) 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, void cgit_tag_link(const char *name, const char *title, const char *class,
@ -1035,7 +1041,7 @@ static void print_header(void)
if (ctx.repo) { if (ctx.repo) {
cgit_index_link("index", NULL, NULL, NULL, NULL, 0, 1); cgit_index_link("index", NULL, NULL, NULL, NULL, 0, 1);
html(" : "); html(" : ");
cgit_summary_link(ctx.repo->name, NULL, NULL, NULL); cgit_repo_link(ctx.repo->name, NULL, NULL, NULL);
if (ctx.env.authenticated) { if (ctx.env.authenticated) {
html("</td><td class='form'>"); html("</td><td class='form'>");
html("<form method='get'>\n"); html("<form method='get'>\n");
@ -1130,7 +1136,7 @@ void cgit_print_pageheader(void)
html("</form>\n"); html("</form>\n");
} else if (ctx.env.authenticated) { } else if (ctx.env.authenticated) {
char *currenturl = cgit_currenturl(); 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) if (ctx.cfg.root_readme)
site_link("about", "about", NULL, hc("about"), site_link("about", "about", NULL, hc("about"),
NULL, NULL, 0, 1); NULL, NULL, 0, 1);

View File

@ -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, 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); 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, extern void cgit_summary_link(const char *name, const char *title,
const char *class, const char *head); const char *class, const char *head);
extern void cgit_tag_link(const char *name, const char *title, extern void cgit_tag_link(const char *name, const char *title,