]> gitweb.ps.run Git - ps-cgit/commitdiff
filter: add support for email filter
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 13 Jan 2014 03:04:52 +0000 (04:04 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 14 Jan 2014 01:00:07 +0000 (02:00 +0100)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
cgit.c
cgit.h
cgitrc.5.txt
filter.c
shared.c
ui-commit.c
ui-log.c
ui-refs.c
ui-tag.c

diff --git a/cgit.c b/cgit.c
index 725fd65e37ee3ad6e43b58d4066b44f3e599ef5d..f3fe56bb2748bb976061c819f24f4f7ddcd2caf8 100644 (file)
--- 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);
                        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);
                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"))
        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=");
                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 : "");
        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 519d2afb3d4d223c68639d8f12235e35f5e98cc5..e200a06994c178468f670f63dcb13cc36de19d2a 100644 (file)
--- 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 {
 typedef void (*linediff_fn)(char *line, int len);
 
 typedef enum {
-       ABOUT, COMMIT, SOURCE
+       ABOUT, COMMIT, SOURCE, EMAIL
 } filter_type;
 
 struct cgit_filter {
 } 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 *about_filter;
        struct cgit_filter *commit_filter;
        struct cgit_filter *source_filter;
+       struct cgit_filter *email_filter;
        struct string_list submodules;
 };
 
        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 *about_filter;
        struct cgit_filter *commit_filter;
        struct cgit_filter *source_filter;
+       struct cgit_filter *email_filter;
 };
 
 struct cgit_page {
 };
 
 struct cgit_page {
index 78f33c8308e6379a9e643da006c660b122f571bd..b7dc5a4ca665e092a7f5f03a9f749fccd02984b1 100644 (file)
@@ -117,6 +117,14 @@ css::
        Url which specifies the css document to include in all cgit pages.
        Default value: "/cgit.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
 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.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.
 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.
 
        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
 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
index 7983737b6bc24ab9a7d6e6e19111755864370199..08ce7a5a021a598bc304f42d3760ac9eda0bfefa 100644 (file)
--- 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.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);
        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) {
                colon = NULL;
 
        switch (filtertype) {
+               case EMAIL:
                case SOURCE:
                case ABOUT:
                        argument_count = 1;
                case SOURCE:
                case ABOUT:
                        argument_count = 1;
index 4626148535bd77dd62aebf08f6ddf60a35fdc990..7e88bbd4fb33555066d14df98402277a97e96bee 100644 (file)
--- 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->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;
        ret->clone_url = ctx.cfg.clone_url;
        ret->submodules.strdup_strings = 1;
        return ret;
index 5ac79c0c5ec35abe805e673fd4103f5c77cc6f9a..bd14ef04c7772da30f5f67457da9f457dd3f1c83 100644 (file)
@@ -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_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);
        }
        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>");
        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);
        }
        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");
        html("</td><td class='right'>");
        cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time);
        html("</td></tr>\n");
index 584336a9766c0a6d6aa4d8bb33d5f28f185d583e..957d887f0c7b5c17fd1b67697baf29ccd6ffc7ca 100644 (file)
--- 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>");
                         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);
        html_txt(info->author);
+       cgit_close_filter(ctx.repo->email_filter);
 
        if (revs->graph) {
                html("</td><td>");
 
        if (revs->graph) {
                html("</td><td>");
index c97b0c62924cc08c1e54bbcb4958d8c5898abb1e..d125459f81264230a6a4422a22321b3375aff518 100644 (file)
--- 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>");
        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);
                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 {
                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) {
                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);
                        html_txt(info->tagger);
+                       cgit_close_filter(ctx.repo->email_filter);
+               }
        } else if (ref->object->type == OBJ_COMMIT) {
        } else if (ref->object->type == OBJ_COMMIT) {
+               cgit_open_filter(ctx.repo->email_filter, ref->commit->author_email);
                html_txt(ref->commit->author);
                html_txt(ref->commit->author);
+               cgit_close_filter(ctx.repo->email_filter);
        }
        html("</td><td colspan='2'>");
        if (info) {
        }
        html("</td><td colspan='2'>");
        if (info) {
index ec9c757db22d8196bebefb1ae020ac33ca30b627..adbdb90e3771b566e808b56629bffb78d0334aa3 100644 (file)
--- 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>");
                }
                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);
                        }
                        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'>");
                        html("</td></tr>\n");
                }
                html("<tr><td>tagged object</td><td class='sha1'>");