cgit

commit 96ceb9a95a7a321209cff347fefd141a9fffc7ca

Author: Chris Burroughs <chris.burroughs@gmail.com>

repolist: add owner-filter

This allows custom links to be used for repository owners by
configuring a filter to be applied in the "Owner" column in the
repository list.

 cgit.c | 6 ++++++
 cgit.h | 4 +++-
 cgitrc.5.txt | 18 ++++++++++++++++++
 filter.c | 6 ++++++
 filters/owner-example.lua | 17 +++++++++++++++++
 shared.c | 1 +
 ui-repolist.c | 20 +++++++++++++-------


diff --git a/cgit.c b/cgit.c
index 796cb7fa9127ff2c9576e9567bc421fba9e498cb..79019c268027343e7944ceab6db35477219e861f 100644
--- a/cgit.c
+++ b/cgit.c
@@ -91,6 +91,8 @@ 		else if (!strcmp(name, "source-filter"))
 			repo->source_filter = cgit_new_filter(value, SOURCE);
 		else if (!strcmp(name, "email-filter"))
 			repo->email_filter = cgit_new_filter(value, EMAIL);
+		else if (!strcmp(name, "owner-filter"))
+			repo->owner_filter = cgit_new_filter(value, OWNER);
 	}
 }
 
@@ -194,6 +196,8 @@ 	else if (!strcmp(name, "commit-filter"))
 		ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT);
 	else if (!strcmp(name, "email-filter"))
 		ctx.cfg.email_filter = cgit_new_filter(value, EMAIL);
+	else if (!strcmp(name, "owner-filter"))
+		ctx.cfg.owner_filter = cgit_new_filter(value, OWNER);
 	else if (!strcmp(name, "auth-filter"))
 		ctx.cfg.auth_filter = cgit_new_filter(value, AUTH);
 	else if (!strcmp(name, "embedded"))
@@ -800,6 +804,8 @@ 	if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter)
 		cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter=");
 	if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter)
 		cgit_fprintf_filter(repo->email_filter, f, "repo.email-filter=");
+	if (repo->owner_filter && repo->owner_filter != ctx.cfg.owner_filter)
+		cgit_fprintf_filter(repo->owner_filter, f, "repo.owner-filter=");
 	if (repo->snapshots != ctx.cfg.snapshots) {
 		char *tmp = build_snapshot_setting(repo->snapshots);
 		fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : "");




diff --git a/cgit.h b/cgit.h
index 0c1585d34cdd4872f0ad5fc3d1cac8e01388ef02..42140ac4acdb8d59942a5e0abcfb9f7bbbb3bf4b 100644
--- a/cgit.h
+++ b/cgit.h
@@ -57,7 +57,7 @@ 	DIFF_UNIFIED, DIFF_SSDIFF, DIFF_STATONLY
 } diff_type;
 
 typedef enum {
-	ABOUT, COMMIT, SOURCE, EMAIL, AUTH
+	ABOUT, COMMIT, SOURCE, EMAIL, AUTH, OWNER
 } filter_type;
 
 struct cgit_filter {
@@ -104,6 +104,7 @@ 	struct cgit_filter *about_filter;
 	struct cgit_filter *commit_filter;
 	struct cgit_filter *source_filter;
 	struct cgit_filter *email_filter;
+	struct cgit_filter *owner_filter;
 	struct string_list submodules;
 };
 
@@ -257,6 +258,7 @@ 	struct cgit_filter *about_filter;
 	struct cgit_filter *commit_filter;
 	struct cgit_filter *source_filter;
 	struct cgit_filter *email_filter;
+	struct cgit_filter *owner_filter;
 	struct cgit_filter *auth_filter;
 };
 




diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 104b223b9b9e64c62c5c6d2c8e7c35db8fbb1960..be6703fdb1e0bfce51907c4420dab4ce3d47cff1 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -247,6 +247,15 @@ 	Url loaded when clicking on the cgit logo image. If unspecified the
 	calculated url of the repository index page will be used. Default
 	value: none.
 
+owner-filter::
+	Specifies a command which will be invoked to format the Owner
+	column of the main page.  The command will get the owner on STDIN,
+	and the STDOUT from the command will be included verbatim in the
+	table.  This can be used to link to additional context such as an
+	owners home page.  When active this filter is used instead of the
+	default owner query url.  Default value: none.
+	See also: "FILTER API".
+
 max-atom-items::
 	Specifies the number of items to display in atom feeds view. Default
 	value: "10".
@@ -509,6 +518,10 @@ 	Url loaded when clicking on the cgit logo image. If unspecified the
 	calculated url of the repository index page will be used. Default
 	value: global logo-link.
 
+repo.owner-filter::
+	Override the default owner-filter. Default value: none. See also:
+	"enable-filter-overrides". See also: "FILTER API".
+
 repo.module-link::
 	Text which will be used as the formatstring for a hyperlink when a
 	submodule is printed in a directory listing. The arguments for the
@@ -640,6 +653,11 @@ 	author and a string indicating the originating page. The filter will
 	then receive the text string to format on standard input and is
 	expected to write to standard output the formatted text to be included
 	in the page.
+
+owner filter::
+	This filter is given no arguments.  The owner text is avilable on
+	standard input and the filter is expected to write to standard
+	output.  The output is included in the Owner column.
 
 source filter::
 	This filter is given a single parameter: the filename of the source




diff --git a/filter.c b/filter.c
index 270f0098612862e3980d8c89a2991200b2925329..9f433dbc178df40259245ba7b8b18702920e33fd 100644
--- a/filter.c
+++ b/filter.c
@@ -38,12 +38,14 @@ 	reap_filter(ctx.cfg.about_filter);
 	reap_filter(ctx.cfg.commit_filter);
 	reap_filter(ctx.cfg.source_filter);
 	reap_filter(ctx.cfg.email_filter);
+	reap_filter(ctx.cfg.owner_filter);
 	reap_filter(ctx.cfg.auth_filter);
 	for (i = 0; i < cgit_repolist.count; ++i) {
 		reap_filter(cgit_repolist.repos[i].about_filter);
 		reap_filter(cgit_repolist.repos[i].commit_filter);
 		reap_filter(cgit_repolist.repos[i].source_filter);
 		reap_filter(cgit_repolist.repos[i].email_filter);
+		reap_filter(cgit_repolist.repos[i].owner_filter);
 	}
 }
 
@@ -423,6 +425,10 @@ 			break;
 
 		case EMAIL:
 			argument_count = 2;
+			break;
+
+		case OWNER:
+			argument_count = 0;
 			break;
 
 		case SOURCE:




diff --git a/filters/owner-example.lua b/filters/owner-example.lua
new file mode 100644
index 0000000000000000000000000000000000000000..50fc25a8e53c8ee8610a0cba277e1f0a7bef3545
--- /dev/null
+++ b/filters/owner-example.lua
@@ -0,0 +1,17 @@
+-- This script is an example of an owner-filter.  It replaces the
+-- usual query link with one to a fictional homepage.  This script may
+-- be used with the owner-filter or repo.owner-filter settings in
+-- cgitrc with the `lua:` prefix.
+
+function filter_open()
+	buffer = ""
+end
+
+function filter_close()
+	html(string.format("<a href=\"%s\">%s</a>", "http://wiki.example.com/about/" .. buffer, buffer))
+	return 0
+end
+
+function filter_write(str)
+	buffer = buffer .. str
+end




diff --git a/shared.c b/shared.c
index 8ed14c0bdbcbf378dd2adc439e21f5895b6e4ac9..6e91857066a03faf40ea1153bc8868ee9b29f404 100644
--- a/shared.c
+++ b/shared.c
@@ -72,6 +72,7 @@ 	ret->about_filter = ctx.cfg.about_filter;
 	ret->commit_filter = ctx.cfg.commit_filter;
 	ret->source_filter = ctx.cfg.source_filter;
 	ret->email_filter = ctx.cfg.email_filter;
+	ret->owner_filter = ctx.cfg.owner_filter;
 	ret->clone_url = ctx.cfg.clone_url;
 	ret->submodules.strdup_strings = 1;
 	return ret;




diff --git a/ui-repolist.c b/ui-repolist.c
index 49c991f616a74a5fdf24f4c0c65d959c88275378..f929cb79ec05ded2e92deb90e50743dde88d6681 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -307,13 +307,19 @@ 		html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc);
 		html_link_close();
 		html("</td><td>");
 		if (ctx.cfg.enable_index_owner) {
-			html("<a href='");
-			html_attr(cgit_rooturl());
-			html("?q=");
-			html_url_arg(ctx.repo->owner);
-			html("'>");
-			html_txt(ctx.repo->owner);
-			html("</a>");
+			if (ctx.repo->owner_filter) {
+				cgit_open_filter(ctx.repo->owner_filter);
+				html_txt(ctx.repo->owner);
+				cgit_close_filter(ctx.repo->owner_filter);
+			} else {
+				html("<a href='");
+				html_attr(cgit_rooturl());
+				html("?=");
+				html_url_arg(ctx.repo->owner);
+				html("'>");
+				html_txt(ctx.repo->owner);
+				html("</a>");
+			}
 			html("</td><td>");
 		}
 		print_modtime(ctx.repo);