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.
This commit is contained in:
Chris Burroughs 2014-08-04 09:23:08 -04:00 committed by Jason A. Donenfeld
parent 3c53ebfb57
commit 96ceb9a95a
7 changed files with 64 additions and 8 deletions

6
cgit.c
View File

@ -91,6 +91,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va
repo->source_filter = cgit_new_filter(value, SOURCE); repo->source_filter = cgit_new_filter(value, SOURCE);
else if (!strcmp(name, "email-filter")) else if (!strcmp(name, "email-filter"))
repo->email_filter = cgit_new_filter(value, EMAIL); 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 @@ static void config_cb(const char *name, const char *value)
ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT); ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT);
else if (!strcmp(name, "email-filter")) else if (!strcmp(name, "email-filter"))
ctx.cfg.email_filter = cgit_new_filter(value, EMAIL); 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")) else if (!strcmp(name, "auth-filter"))
ctx.cfg.auth_filter = cgit_new_filter(value, AUTH); ctx.cfg.auth_filter = cgit_new_filter(value, AUTH);
else if (!strcmp(name, "embedded")) else if (!strcmp(name, "embedded"))
@ -800,6 +804,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo)
cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter="); cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter=");
if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter) if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter)
cgit_fprintf_filter(repo->email_filter, f, "repo.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) { if (repo->snapshots != ctx.cfg.snapshots) {
char *tmp = build_snapshot_setting(repo->snapshots); char *tmp = build_snapshot_setting(repo->snapshots);
fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : ""); fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : "");

4
cgit.h
View File

@ -57,7 +57,7 @@ typedef enum {
} diff_type; } diff_type;
typedef enum { typedef enum {
ABOUT, COMMIT, SOURCE, EMAIL, AUTH ABOUT, COMMIT, SOURCE, EMAIL, AUTH, OWNER
} filter_type; } filter_type;
struct cgit_filter { struct cgit_filter {
@ -104,6 +104,7 @@ struct cgit_repo {
struct cgit_filter *commit_filter; struct cgit_filter *commit_filter;
struct cgit_filter *source_filter; struct cgit_filter *source_filter;
struct cgit_filter *email_filter; struct cgit_filter *email_filter;
struct cgit_filter *owner_filter;
struct string_list submodules; struct string_list submodules;
}; };
@ -257,6 +258,7 @@ struct cgit_config {
struct cgit_filter *commit_filter; struct cgit_filter *commit_filter;
struct cgit_filter *source_filter; struct cgit_filter *source_filter;
struct cgit_filter *email_filter; struct cgit_filter *email_filter;
struct cgit_filter *owner_filter;
struct cgit_filter *auth_filter; struct cgit_filter *auth_filter;
}; };

View File

@ -247,6 +247,15 @@ logo-link::
calculated url of the repository index page will be used. Default calculated url of the repository index page will be used. Default
value: none. 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:: max-atom-items::
Specifies the number of items to display in atom feeds view. Default Specifies the number of items to display in atom feeds view. Default
value: "10". value: "10".
@ -509,6 +518,10 @@ repo.logo-link::
calculated url of the repository index page will be used. Default calculated url of the repository index page will be used. Default
value: global logo-link. 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:: repo.module-link::
Text which will be used as the formatstring for a hyperlink when a Text which will be used as the formatstring for a hyperlink when a
submodule is printed in a directory listing. The arguments for the submodule is printed in a directory listing. The arguments for the
@ -641,6 +654,11 @@ email filter::
expected to write to standard output the formatted text to be included expected to write to standard output the formatted text to be included
in the page. 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:: source filter::
This filter is given a single parameter: the filename of the source This filter is given a single parameter: the filename of the source
file to filter. The filter can use the filename to determine (for file to filter. The filter can use the filename to determine (for

View File

@ -38,12 +38,14 @@ void cgit_cleanup_filters(void)
reap_filter(ctx.cfg.commit_filter); reap_filter(ctx.cfg.commit_filter);
reap_filter(ctx.cfg.source_filter); reap_filter(ctx.cfg.source_filter);
reap_filter(ctx.cfg.email_filter); reap_filter(ctx.cfg.email_filter);
reap_filter(ctx.cfg.owner_filter);
reap_filter(ctx.cfg.auth_filter); reap_filter(ctx.cfg.auth_filter);
for (i = 0; i < cgit_repolist.count; ++i) { for (i = 0; i < cgit_repolist.count; ++i) {
reap_filter(cgit_repolist.repos[i].about_filter); reap_filter(cgit_repolist.repos[i].about_filter);
reap_filter(cgit_repolist.repos[i].commit_filter); reap_filter(cgit_repolist.repos[i].commit_filter);
reap_filter(cgit_repolist.repos[i].source_filter); reap_filter(cgit_repolist.repos[i].source_filter);
reap_filter(cgit_repolist.repos[i].email_filter); reap_filter(cgit_repolist.repos[i].email_filter);
reap_filter(cgit_repolist.repos[i].owner_filter);
} }
} }
@ -425,6 +427,10 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
argument_count = 2; argument_count = 2;
break; break;
case OWNER:
argument_count = 0;
break;
case SOURCE: case SOURCE:
case ABOUT: case ABOUT:
argument_count = 1; argument_count = 1;

17
filters/owner-example.lua Normal file
View File

@ -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

View File

@ -72,6 +72,7 @@ struct cgit_repo *cgit_add_repo(const char *url)
ret->commit_filter = ctx.cfg.commit_filter; ret->commit_filter = ctx.cfg.commit_filter;
ret->source_filter = ctx.cfg.source_filter; ret->source_filter = ctx.cfg.source_filter;
ret->email_filter = ctx.cfg.email_filter; ret->email_filter = ctx.cfg.email_filter;
ret->owner_filter = ctx.cfg.owner_filter;
ret->clone_url = ctx.cfg.clone_url; ret->clone_url = ctx.cfg.clone_url;
ret->submodules.strdup_strings = 1; ret->submodules.strdup_strings = 1;
return ret; return ret;

View File

@ -307,13 +307,19 @@ void cgit_print_repolist()
html_link_close(); html_link_close();
html("</td><td>"); html("</td><td>");
if (ctx.cfg.enable_index_owner) { if (ctx.cfg.enable_index_owner) {
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("<a href='");
html_attr(cgit_rooturl()); html_attr(cgit_rooturl());
html("?q="); html("?=");
html_url_arg(ctx.repo->owner); html_url_arg(ctx.repo->owner);
html("'>"); html("'>");
html_txt(ctx.repo->owner); html_txt(ctx.repo->owner);
html("</a>"); html("</a>");
}
html("</td><td>"); html("</td><td>");
} }
print_modtime(ctx.repo); print_modtime(ctx.repo);