diff options
| -rw-r--r-- | cgit.c | 6 | ||||
| -rw-r--r-- | cgit.h | 4 | ||||
| -rw-r--r-- | cgitrc.5.txt | 18 | ||||
| -rw-r--r-- | filter.c | 3 | ||||
| -rw-r--r-- | shared.c | 1 | ||||
| -rw-r--r-- | ui-commit.c | 4 | ||||
| -rw-r--r-- | ui-log.c | 2 | ||||
| -rw-r--r-- | ui-refs.c | 9 | ||||
| -rw-r--r-- | ui-tag.c | 2 |
9 files changed, 47 insertions, 2 deletions
| @@ -89,6 +89,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va | |||
| 89 | repo->commit_filter = cgit_new_filter(value, COMMIT); | 89 | repo->commit_filter = cgit_new_filter(value, COMMIT); |
| 90 | else if (!strcmp(name, "source-filter")) | 90 | else if (!strcmp(name, "source-filter")) |
| 91 | repo->source_filter = cgit_new_filter(value, SOURCE); | 91 | repo->source_filter = cgit_new_filter(value, SOURCE); |
| 92 | else if (!strcmp(name, "email-filter")) | ||
| 93 | repo->email_filter = cgit_new_filter(value, EMAIL); | ||
| 92 | } | 94 | } |
| 93 | } | 95 | } |
| 94 | 96 | ||
| @@ -188,6 +190,8 @@ static void config_cb(const char *name, const char *value) | |||
| 188 | ctx.cfg.about_filter = cgit_new_filter(value, ABOUT); | 190 | ctx.cfg.about_filter = cgit_new_filter(value, ABOUT); |
| 189 | else if (!strcmp(name, "commit-filter")) | 191 | else if (!strcmp(name, "commit-filter")) |
| 190 | ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT); | 192 | ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT); |
| 193 | else if (!strcmp(name, "email-filter")) | ||
| 194 | ctx.cfg.email_filter = cgit_new_filter(value, EMAIL); | ||
| 191 | else if (!strcmp(name, "embedded")) | 195 | else if (!strcmp(name, "embedded")) |
| 192 | ctx.cfg.embedded = atoi(value); | 196 | ctx.cfg.embedded = atoi(value); |
| 193 | else if (!strcmp(name, "max-atom-items")) | 197 | else if (!strcmp(name, "max-atom-items")) |
| @@ -711,6 +715,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo) | |||
| 711 | cgit_fprintf_filter(repo->commit_filter, f, "repo.commit-filter="); | 715 | cgit_fprintf_filter(repo->commit_filter, f, "repo.commit-filter="); |
| 712 | if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter) | 716 | if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter) |
| 713 | cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter="); | 717 | cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter="); |
| 718 | if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter) | ||
| 719 | cgit_fprintf_filter(repo->email_filter, f, "repo.email-filter="); | ||
| 714 | if (repo->snapshots != ctx.cfg.snapshots) { | 720 | if (repo->snapshots != ctx.cfg.snapshots) { |
| 715 | char *tmp = build_snapshot_setting(repo->snapshots); | 721 | char *tmp = build_snapshot_setting(repo->snapshots); |
| 716 | fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : ""); | 722 | fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : ""); |
| @@ -53,7 +53,7 @@ typedef void (*filepair_fn)(struct diff_filepair *pair); | |||
| 53 | typedef void (*linediff_fn)(char *line, int len); | 53 | typedef void (*linediff_fn)(char *line, int len); |
| 54 | 54 | ||
| 55 | typedef enum { | 55 | typedef enum { |
| 56 | ABOUT, COMMIT, SOURCE | 56 | ABOUT, COMMIT, SOURCE, EMAIL |
| 57 | } filter_type; | 57 | } filter_type; |
| 58 | 58 | ||
| 59 | struct cgit_filter { | 59 | struct cgit_filter { |
| @@ -99,6 +99,7 @@ struct cgit_repo { | |||
| 99 | struct cgit_filter *about_filter; | 99 | struct cgit_filter *about_filter; |
| 100 | struct cgit_filter *commit_filter; | 100 | struct cgit_filter *commit_filter; |
| 101 | struct cgit_filter *source_filter; | 101 | struct cgit_filter *source_filter; |
| 102 | struct cgit_filter *email_filter; | ||
| 102 | struct string_list submodules; | 103 | struct string_list submodules; |
| 103 | }; | 104 | }; |
| 104 | 105 | ||
| @@ -250,6 +251,7 @@ struct cgit_config { | |||
| 250 | struct cgit_filter *about_filter; | 251 | struct cgit_filter *about_filter; |
| 251 | struct cgit_filter *commit_filter; | 252 | struct cgit_filter *commit_filter; |
| 252 | struct cgit_filter *source_filter; | 253 | struct cgit_filter *source_filter; |
| 254 | struct cgit_filter *email_filter; | ||
| 253 | }; | 255 | }; |
| 254 | 256 | ||
| 255 | struct cgit_page { | 257 | 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:: | |||
| 117 | Url which specifies the css document to include in all cgit pages. | 117 | Url which specifies the css document to include in all cgit pages. |
| 118 | Default value: "/cgit.css". | 118 | Default value: "/cgit.css". |
| 119 | 119 | ||
| 120 | email-filter:: | ||
| 121 | Specifies a command which will be invoked to format names and email | ||
| 122 | address of committers, authors, and taggers, as represented in various | ||
| 123 | places throughout the cgit interface. This command will receive an | ||
| 124 | email address as its only command line argument, and the text to | ||
| 125 | format on STDIN. It is to write the formatted text back out onto | ||
| 126 | STDOUT. Default value: none. See also: "FILTER API". | ||
| 127 | |||
| 120 | embedded:: | 128 | embedded:: |
| 121 | Flag which, when set to "1", will make cgit generate a html fragment | 129 | Flag which, when set to "1", will make cgit generate a html fragment |
| 122 | suitable for embedding in other html pages. Default value: none. See | 130 | suitable for embedding in other html pages. Default value: none. See |
| @@ -457,6 +465,10 @@ repo.defbranch:: | |||
| 457 | repo.desc:: | 465 | repo.desc:: |
| 458 | The value to show as repository description. Default value: none. | 466 | The value to show as repository description. Default value: none. |
| 459 | 467 | ||
| 468 | repo.email-filter:: | ||
| 469 | Override the default email-filter. Default value: none. See also: | ||
| 470 | "enable-filter-overrides". See also: "FILTER API". | ||
| 471 | |||
| 460 | repo.enable-commit-graph:: | 472 | repo.enable-commit-graph:: |
| 461 | A flag which can be used to disable the global setting | 473 | A flag which can be used to disable the global setting |
| 462 | `enable-commit-graph'. Default value: none. | 474 | `enable-commit-graph'. Default value: none. |
| @@ -607,6 +619,12 @@ commit filter:: | |||
| 607 | be filtered is available on standard input and the filtered text is | 619 | be filtered is available on standard input and the filtered text is |
| 608 | expected on standard output. | 620 | expected on standard output. |
| 609 | 621 | ||
| 622 | email filter:: | ||
| 623 | This filter is given a single parameter: the email address of the | ||
| 624 | relevent user. The filter will then receive the text string to format | ||
| 625 | on standard input and is expected to write to standard output the | ||
| 626 | formatted text to be included in the page. | ||
| 627 | |||
| 610 | source filter:: | 628 | source filter:: |
| 611 | This filter is given a single parameter: the filename of the source | 629 | This filter is given a single parameter: the filename of the source |
| 612 | file to filter. The filter can use the filename to determine (for | 630 | file to filter. The filter can use the filename to determine (for |
| @@ -37,10 +37,12 @@ void cgit_cleanup_filters(void) | |||
| 37 | reap_filter(ctx.cfg.about_filter); | 37 | reap_filter(ctx.cfg.about_filter); |
| 38 | reap_filter(ctx.cfg.commit_filter); | 38 | reap_filter(ctx.cfg.commit_filter); |
| 39 | reap_filter(ctx.cfg.source_filter); | 39 | reap_filter(ctx.cfg.source_filter); |
| 40 | reap_filter(ctx.cfg.email_filter); | ||
| 40 | for (i = 0; i < cgit_repolist.count; ++i) { | 41 | for (i = 0; i < cgit_repolist.count; ++i) { |
| 41 | reap_filter(cgit_repolist.repos[i].about_filter); | 42 | reap_filter(cgit_repolist.repos[i].about_filter); |
| 42 | reap_filter(cgit_repolist.repos[i].commit_filter); | 43 | reap_filter(cgit_repolist.repos[i].commit_filter); |
| 43 | reap_filter(cgit_repolist.repos[i].source_filter); | 44 | reap_filter(cgit_repolist.repos[i].source_filter); |
| 45 | reap_filter(cgit_repolist.repos[i].email_filter); | ||
| 44 | } | 46 | } |
| 45 | } | 47 | } |
| 46 | 48 | ||
| @@ -403,6 +405,7 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | |||
| 403 | colon = NULL; | 405 | colon = NULL; |
| 404 | 406 | ||
| 405 | switch (filtertype) { | 407 | switch (filtertype) { |
| 408 | case EMAIL: | ||
| 406 | case SOURCE: | 409 | case SOURCE: |
| 407 | case ABOUT: | 410 | case ABOUT: |
| 408 | argument_count = 1; | 411 | argument_count = 1; |
| @@ -71,6 +71,7 @@ struct cgit_repo *cgit_add_repo(const char *url) | |||
| 71 | ret->about_filter = ctx.cfg.about_filter; | 71 | ret->about_filter = ctx.cfg.about_filter; |
| 72 | ret->commit_filter = ctx.cfg.commit_filter; | 72 | ret->commit_filter = ctx.cfg.commit_filter; |
| 73 | ret->source_filter = ctx.cfg.source_filter; | 73 | ret->source_filter = ctx.cfg.source_filter; |
| 74 | ret->email_filter = ctx.cfg.email_filter; | ||
| 74 | ret->clone_url = ctx.cfg.clone_url; | 75 | ret->clone_url = ctx.cfg.clone_url; |
| 75 | ret->submodules.strdup_strings = 1; | 76 | ret->submodules.strdup_strings = 1; |
| 76 | return ret; | 77 | 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) | |||
| 44 | cgit_print_diff_ctrls(); | 44 | cgit_print_diff_ctrls(); |
| 45 | html("<table summary='commit info' class='commit-info'>\n"); | 45 | html("<table summary='commit info' class='commit-info'>\n"); |
| 46 | html("<tr><th>author</th><td>"); | 46 | html("<tr><th>author</th><td>"); |
| 47 | cgit_open_filter(ctx.repo->email_filter, info->author_email); | ||
| 47 | html_txt(info->author); | 48 | html_txt(info->author); |
| 48 | if (!ctx.cfg.noplainemail) { | 49 | if (!ctx.cfg.noplainemail) { |
| 49 | html(" "); | 50 | html(" "); |
| 50 | html_txt(info->author_email); | 51 | html_txt(info->author_email); |
| 51 | } | 52 | } |
| 53 | cgit_close_filter(ctx.repo->email_filter); | ||
| 52 | html("</td><td class='right'>"); | 54 | html("</td><td class='right'>"); |
| 53 | cgit_print_date(info->author_date, FMT_LONGDATE, ctx.cfg.local_time); | 55 | cgit_print_date(info->author_date, FMT_LONGDATE, ctx.cfg.local_time); |
| 54 | html("</td></tr>\n"); | 56 | html("</td></tr>\n"); |
| 55 | html("<tr><th>committer</th><td>"); | 57 | html("<tr><th>committer</th><td>"); |
| 58 | cgit_open_filter(ctx.repo->email_filter, info->committer_email); | ||
| 56 | html_txt(info->committer); | 59 | html_txt(info->committer); |
| 57 | if (!ctx.cfg.noplainemail) { | 60 | if (!ctx.cfg.noplainemail) { |
| 58 | html(" "); | 61 | html(" "); |
| 59 | html_txt(info->committer_email); | 62 | html_txt(info->committer_email); |
| 60 | } | 63 | } |
| 64 | cgit_close_filter(ctx.repo->email_filter); | ||
| 61 | html("</td><td class='right'>"); | 65 | html("</td><td class='right'>"); |
| 62 | cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time); | 66 | cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time); |
| 63 | html("</td></tr>\n"); | 67 | html("</td></tr>\n"); |
| @@ -168,7 +168,9 @@ static void print_commit(struct commit *commit, struct rev_info *revs) | |||
| 168 | sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); | 168 | sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); |
| 169 | show_commit_decorations(commit); | 169 | show_commit_decorations(commit); |
| 170 | html("</td><td>"); | 170 | html("</td><td>"); |
| 171 | cgit_open_filter(ctx.repo->email_filter, info->author_email); | ||
| 171 | html_txt(info->author); | 172 | html_txt(info->author); |
| 173 | cgit_close_filter(ctx.repo->email_filter); | ||
| 172 | 174 | ||
| 173 | if (revs->graph) { | 175 | if (revs->graph) { |
| 174 | html("</td><td>"); | 176 | html("</td><td>"); |
| @@ -77,7 +77,9 @@ static int print_branch(struct refinfo *ref) | |||
| 77 | if (ref->object->type == OBJ_COMMIT) { | 77 | if (ref->object->type == OBJ_COMMIT) { |
| 78 | cgit_commit_link(info->subject, NULL, NULL, name, NULL, NULL, 0); | 78 | cgit_commit_link(info->subject, NULL, NULL, name, NULL, NULL, 0); |
| 79 | html("</td><td>"); | 79 | html("</td><td>"); |
| 80 | cgit_open_filter(ctx.repo->email_filter, info->author_email); | ||
| 80 | html_txt(info->author); | 81 | html_txt(info->author); |
| 82 | cgit_close_filter(ctx.repo->email_filter); | ||
| 81 | html("</td><td colspan='2'>"); | 83 | html("</td><td colspan='2'>"); |
| 82 | cgit_print_age(info->commit->date, -1, NULL); | 84 | cgit_print_age(info->commit->date, -1, NULL); |
| 83 | } else { | 85 | } else { |
| @@ -154,10 +156,15 @@ static int print_tag(struct refinfo *ref) | |||
| 154 | cgit_object_link(obj); | 156 | cgit_object_link(obj); |
| 155 | html("</td><td>"); | 157 | html("</td><td>"); |
| 156 | if (info) { | 158 | if (info) { |
| 157 | if (info->tagger) | 159 | if (info->tagger) { |
| 160 | cgit_open_filter(ctx.repo->email_filter, info->tagger_email); | ||
| 158 | html_txt(info->tagger); | 161 | html_txt(info->tagger); |
| 162 | cgit_close_filter(ctx.repo->email_filter); | ||
| 163 | } | ||
| 159 | } else if (ref->object->type == OBJ_COMMIT) { | 164 | } else if (ref->object->type == OBJ_COMMIT) { |
| 165 | cgit_open_filter(ctx.repo->email_filter, ref->commit->author_email); | ||
| 160 | html_txt(ref->commit->author); | 166 | html_txt(ref->commit->author); |
| 167 | cgit_close_filter(ctx.repo->email_filter); | ||
| 161 | } | 168 | } |
| 162 | html("</td><td colspan='2'>"); | 169 | html("</td><td colspan='2'>"); |
| 163 | if (info) { | 170 | if (info) { |
| @@ -77,11 +77,13 @@ void cgit_print_tag(char *revname) | |||
| 77 | } | 77 | } |
| 78 | if (info->tagger) { | 78 | if (info->tagger) { |
| 79 | html("<tr><td>tagged by</td><td>"); | 79 | html("<tr><td>tagged by</td><td>"); |
| 80 | cgit_open_filter(ctx.repo->email_filter, info->tagger_email); | ||
| 80 | html_txt(info->tagger); | 81 | html_txt(info->tagger); |
| 81 | if (info->tagger_email && !ctx.cfg.noplainemail) { | 82 | if (info->tagger_email && !ctx.cfg.noplainemail) { |
| 82 | html(" "); | 83 | html(" "); |
| 83 | html_txt(info->tagger_email); | 84 | html_txt(info->tagger_email); |
| 84 | } | 85 | } |
| 86 | cgit_close_filter(ctx.repo->email_filter); | ||
| 85 | html("</td></tr>\n"); | 87 | html("</td></tr>\n"); |
| 86 | } | 88 | } |
| 87 | html("<tr><td>tagged object</td><td class='sha1'>"); | 89 | html("<tr><td>tagged object</td><td class='sha1'>"); |
