From a5e15537268410e268c7b26aa69d03b347c326c8 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 13 Jan 2014 04:04:52 +0100 Subject: filter: add support for email filter Signed-off-by: Jason A. Donenfeld diff --git a/cgit.c b/cgit.c index 725fd65..f3fe56b 100644 --- a/cgit.c +++ b/cgit.c @@ -89,6 +89,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va 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 @@ static void config_cb(const char *name, const char *value) 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 @@ static void print_repo(FILE *f, struct cgit_repo *repo) 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 : ""); diff --git a/cgit.h b/cgit.h index 519d2af..e200a06 100644 --- a/cgit.h +++ b/cgit.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 @@ struct cgit_repo { 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 cgit_config { struct cgit_filter *about_filter; struct cgit_filter *commit_filter; struct cgit_filter *source_filter; + struct cgit_filter *email_filter; }; struct cgit_page { diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 78f33c8..b7dc5a4 100644 --- a/cgitrc.5.txt +++ b/cgitrc.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.defbranch:: 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. @@ -607,6 +619,12 @@ commit filter:: 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 file to filter. The filter can use the filename to determine (for diff --git a/filter.c b/filter.c index 7983737..08ce7a5 100644 --- a/filter.c +++ b/filter.c @@ -37,10 +37,12 @@ void cgit_cleanup_filters(void) 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 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) colon = NULL; switch (filtertype) { + case EMAIL: case SOURCE: case ABOUT: argument_count = 1; diff --git a/shared.c b/shared.c index 4626148..7e88bbd 100644 --- a/shared.c +++ b/shared.c @@ -71,6 +71,7 @@ struct cgit_repo *cgit_add_repo(const char *url) 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; diff --git a/ui-commit.c b/ui-commit.c index 5ac79c0..bd14ef0 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -44,20 +44,24 @@ void cgit_print_commit(char *hex, const char *prefix) cgit_print_diff_ctrls(); html("\n"); html("\n"); html("\n"); diff --git a/ui-log.c b/ui-log.c index 584336a..957d887 100644 --- a/ui-log.c +++ b/ui-log.c @@ -168,7 +168,9 @@ static void print_commit(struct commit *commit, struct rev_info *revs) sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); show_commit_decorations(commit); html("\n"); } html("
author"); + 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(""); cgit_print_date(info->author_date, FMT_LONGDATE, ctx.cfg.local_time); html("
committer"); + 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(""); cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time); html("
"); + 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(""); diff --git a/ui-refs.c b/ui-refs.c index c97b0c6..d125459 100644 --- a/ui-refs.c +++ b/ui-refs.c @@ -77,7 +77,9 @@ static int print_branch(struct refinfo *ref) if (ref->object->type == OBJ_COMMIT) { cgit_commit_link(info->subject, NULL, NULL, name, NULL, NULL, 0); html(""); + cgit_open_filter(ctx.repo->email_filter, info->author_email); html_txt(info->author); + cgit_close_filter(ctx.repo->email_filter); html(""); cgit_print_age(info->commit->date, -1, NULL); } else { @@ -154,10 +156,15 @@ static int print_tag(struct refinfo *ref) cgit_object_link(obj); html(""); 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(""); if (info) { diff --git a/ui-tag.c b/ui-tag.c index ec9c757..adbdb90 100644 --- a/ui-tag.c +++ b/ui-tag.c @@ -77,11 +77,13 @@ void cgit_print_tag(char *revname) } if (info->tagger) { html("
tagged by"); + 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("
tagged object"); -- cgit v0.10.1