Signed-off-by: Jason A. Donenfeld <ja...@zx2c4.com>
---
 cgit.c       |  6 ++++++
 cgit.h       |  4 +++-
 cgitrc.5.txt | 18 ++++++++++++++++++
 filter.c     |  3 +++
 shared.c     |  1 +
 ui-commit.c  |  4 ++++
 ui-log.c     |  2 ++
 ui-refs.c    |  9 ++++++++-
 ui-tag.c     |  2 ++
 9 files changed, 47 insertions(+), 2 deletions(-)

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("<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");
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("</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>");
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("</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 @@ static int print_tag(struct refinfo *ref)
                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) {
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("<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'>");
-- 
1.8.5.2

_______________________________________________
CGit mailing list
CGit@lists.zx2c4.com
http://lists.zx2c4.com/mailman/listinfo/cgit

Reply via email to