filter: add support for email filter

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Bu işleme şunda yer alıyor:
Jason A. Donenfeld 2014-01-13 04:04:52 +01:00
ebeveyn 800380dde7
işleme a5e1553726
9 değiştirilmiş dosya ile 47 ekleme ve 2 silme

6
cgit.c
Dosyayı Görüntüle

@ -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 : "");

4
cgit.h
Dosyayı Görüntüle

@ -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 {

Dosyayı Görüntüle

@ -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

Dosyayı Görüntüle

@ -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;

Dosyayı Görüntüle

@ -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;

Dosyayı Görüntüle

@ -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");

Dosyayı Görüntüle

@ -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>");

Dosyayı Görüntüle

@ -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) {

Dosyayı Görüntüle

@ -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'>");