all repos — cgit @ 96ceb9a95a7a321209cff347fefd141a9fffc7ca

a hyperfast web frontend for git written in c

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.
Chris Burroughs chris.burroughs@gmail.com
Mon, 04 Aug 2014 09:23:08 -0400
commit

96ceb9a95a7a321209cff347fefd141a9fffc7ca

parent

3c53ebfb57a5dba8fc65b2f99ebbfb6356666e34

7 files changed, 64 insertions(+), 8 deletions(-)

jump to
M cgit.ccgit.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 : "");
M cgit.hcgit.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; };
M cgitrc.5.txtcgitrc.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
M filter.cfilter.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:
A 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
M shared.cshared.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;
M ui-repolist.cui-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);