Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
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);
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"))
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 : "");
typedef void (*linediff_fn)(char *line, int len);
typedef enum {
typedef void (*linediff_fn)(char *line, int len);
typedef enum {
+ ABOUT, COMMIT, SOURCE, EMAIL
} filter_type;
struct cgit_filter {
} filter_type;
struct cgit_filter {
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;
};
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;
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
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.
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
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);
colon = NULL;
switch (filtertype) {
colon = NULL;
switch (filtertype) {
case SOURCE:
case ABOUT:
argument_count = 1;
case SOURCE:
case ABOUT:
argument_count = 1;
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;
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");
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);
+ cgit_close_filter(ctx.repo->email_filter);
if (revs->graph) {
html("</td><td>");
if (revs->graph) {
html("</td><td>");
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);
+ 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 {
cgit_object_link(obj);
html("</td><td>");
if (info) {
cgit_object_link(obj);
html("</td><td>");
if (info) {
+ if (info->tagger) {
+ cgit_open_filter(ctx.repo->email_filter, info->tagger_email);
+ 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) {
}
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'>");