all repos — cgit @ a5e15537268410e268c7b26aa69d03b347c326c8

a hyperfast web frontend for git written in c

filter: add support for email filter

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Jason A. Donenfeld Jason@zx2c4.com
Mon, 13 Jan 2014 04:04:52 +0100
commit

a5e15537268410e268c7b26aa69d03b347c326c8

parent

800380dde797ae35d738a644acdae2fabb9a0d44

9 files changed, 47 insertions(+), 2 deletions(-)

jump to
M cgit.ccgit.c

@@ -89,6 +89,8 @@ else if (!strcmp(name, "commit-filter"))

repo->commit_filter = cgit_new_filter(value, COMMIT); 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); } }

@@ -188,6 +190,8 @@ else if (!strcmp(name, "about-filter"))

ctx.cfg.about_filter = cgit_new_filter(value, ABOUT); 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, "embedded")) ctx.cfg.embedded = atoi(value); else if (!strcmp(name, "max-atom-items"))

@@ -711,6 +715,8 @@ if (repo->commit_filter && repo->commit_filter != ctx.cfg.commit_filter)

cgit_fprintf_filter(repo->commit_filter, f, "repo.commit-filter="); 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->snapshots != ctx.cfg.snapshots) { char *tmp = build_snapshot_setting(repo->snapshots); fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : "");
M cgit.hcgit.h

@@ -53,7 +53,7 @@ typedef void (*filepair_fn)(struct diff_filepair *pair);

typedef void (*linediff_fn)(char *line, int len); typedef enum { - ABOUT, COMMIT, SOURCE + ABOUT, COMMIT, SOURCE, EMAIL } filter_type; struct cgit_filter {

@@ -99,6 +99,7 @@ time_t mtime;

struct cgit_filter *about_filter; struct cgit_filter *commit_filter; struct cgit_filter *source_filter; + struct cgit_filter *email_filter; struct string_list submodules; };

@@ -250,6 +251,7 @@ struct string_list mimetypes;

struct cgit_filter *about_filter; struct cgit_filter *commit_filter; struct cgit_filter *source_filter; + struct cgit_filter *email_filter; }; struct cgit_page {
M cgitrc.5.txtcgitrc.5.txt

@@ -117,6 +117,14 @@ css::

Url which specifies the css document to include in all cgit pages. Default value: "/cgit.css". +email-filter:: + Specifies a command which will be invoked to format names and email + address of committers, authors, and taggers, as represented in various + places throughout the cgit interface. This command will receive an + email address as its only command line argument, and the text to + format on STDIN. It is to write the formatted text back out onto + STDOUT. Default value: none. See also: "FILTER API". + embedded:: Flag which, when set to "1", will make cgit generate a html fragment suitable for embedding in other html pages. Default value: none. See

@@ -457,6 +465,10 @@

repo.desc:: The value to show as repository description. Default value: none. +repo.email-filter:: + Override the default email-filter. Default value: none. See also: + "enable-filter-overrides". See also: "FILTER API". + repo.enable-commit-graph:: A flag which can be used to disable the global setting `enable-commit-graph'. Default value: none.

@@ -606,6 +618,12 @@ commit filter::

This filter is given no arguments. The commit message text that is to be filtered is available on standard input and the filtered text is expected on standard output. + +email filter:: + This filter is given a single parameter: the email address of the + relevent user. 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. source filter:: This filter is given a single parameter: the filename of the source
M filter.cfilter.c

@@ -37,10 +37,12 @@ int i;

reap_filter(ctx.cfg.about_filter); reap_filter(ctx.cfg.commit_filter); reap_filter(ctx.cfg.source_filter); + reap_filter(ctx.cfg.email_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); } }

@@ -403,6 +405,7 @@ if (len == 1)

colon = NULL; switch (filtertype) { + case EMAIL: case SOURCE: case ABOUT: argument_count = 1;
M shared.cshared.c

@@ -71,6 +71,7 @@ ret->mtime = -1;

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->clone_url = ctx.cfg.clone_url; ret->submodules.strdup_strings = 1; return ret;
M ui-commit.cui-commit.c

@@ -44,20 +44,24 @@

cgit_print_diff_ctrls(); html("<table summary='commit info' class='commit-info'>\n"); html("<tr><th>author</th><td>"); + cgit_open_filter(ctx.repo->email_filter, info->author_email); html_txt(info->author); if (!ctx.cfg.noplainemail) { html(" "); html_txt(info->author_email); } + cgit_close_filter(ctx.repo->email_filter); html("</td><td class='right'>"); cgit_print_date(info->author_date, FMT_LONGDATE, ctx.cfg.local_time); html("</td></tr>\n"); html("<tr><th>committer</th><td>"); + cgit_open_filter(ctx.repo->email_filter, info->committer_email); html_txt(info->committer); if (!ctx.cfg.noplainemail) { html(" "); html_txt(info->committer_email); } + cgit_close_filter(ctx.repo->email_filter); html("</td><td class='right'>"); cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time); html("</td></tr>\n");
M ui-log.cui-log.c

@@ -168,7 +168,9 @@ cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,

sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); show_commit_decorations(commit); html("</td><td>"); + cgit_open_filter(ctx.repo->email_filter, info->author_email); html_txt(info->author); + cgit_close_filter(ctx.repo->email_filter); if (revs->graph) { html("</td><td>");
M ui-refs.cui-refs.c

@@ -77,7 +77,9 @@

if (ref->object->type == OBJ_COMMIT) { cgit_commit_link(info->subject, NULL, NULL, name, NULL, NULL, 0); html("</td><td>"); + cgit_open_filter(ctx.repo->email_filter, info->author_email); html_txt(info->author); + cgit_close_filter(ctx.repo->email_filter); html("</td><td colspan='2'>"); cgit_print_age(info->commit->date, -1, NULL); } else {

@@ -154,10 +156,15 @@ else

cgit_object_link(obj); html("</td><td>"); if (info) { - if (info->tagger) + if (info->tagger) { + cgit_open_filter(ctx.repo->email_filter, info->tagger_email); html_txt(info->tagger); + cgit_close_filter(ctx.repo->email_filter); + } } else if (ref->object->type == OBJ_COMMIT) { + cgit_open_filter(ctx.repo->email_filter, ref->commit->author_email); html_txt(ref->commit->author); + cgit_close_filter(ctx.repo->email_filter); } html("</td><td colspan='2'>"); if (info) {
M ui-tag.cui-tag.c

@@ -77,11 +77,13 @@ html("</td></tr>\n");

} if (info->tagger) { html("<tr><td>tagged by</td><td>"); + cgit_open_filter(ctx.repo->email_filter, info->tagger_email); html_txt(info->tagger); if (info->tagger_email && !ctx.cfg.noplainemail) { html(" "); html_txt(info->tagger_email); } + cgit_close_filter(ctx.repo->email_filter); html("</td></tr>\n"); } html("<tr><td>tagged object</td><td class='sha1'>");