[PATCH v2] Make default pages configurable

Naïm Favier fnaim42 at gmail.com
Thu Aug 15 14:50:21 CEST 2019


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 <fnaim42 at gmail.com>
---
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("<tr><td class='%s'>",
 		      !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("</td><td>");
 		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("</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,
 		       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("</td><td class='form'>");
 			html("<form method='get'>\n");
@@ -1083,7 +1089,7 @@ void cgit_print_pageheader(void)
 		html("</form>\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



More information about the CGit mailing list