repolist: add owner-filter
This allows custom links to be used for repository owners by configuring a filter to be applied in the "Owner" column in the repository list.
This commit is contained in:
джерело
3c53ebfb57
коміт
96ceb9a95a
6
cgit.c
6
cgit.c
@ -91,6 +91,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va
|
|||||||
repo->source_filter = cgit_new_filter(value, SOURCE);
|
repo->source_filter = cgit_new_filter(value, SOURCE);
|
||||||
else if (!strcmp(name, "email-filter"))
|
else if (!strcmp(name, "email-filter"))
|
||||||
repo->email_filter = cgit_new_filter(value, EMAIL);
|
repo->email_filter = cgit_new_filter(value, EMAIL);
|
||||||
|
else if (!strcmp(name, "owner-filter"))
|
||||||
|
repo->owner_filter = cgit_new_filter(value, OWNER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,6 +196,8 @@ static void config_cb(const char *name, const char *value)
|
|||||||
ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT);
|
ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT);
|
||||||
else if (!strcmp(name, "email-filter"))
|
else if (!strcmp(name, "email-filter"))
|
||||||
ctx.cfg.email_filter = cgit_new_filter(value, EMAIL);
|
ctx.cfg.email_filter = cgit_new_filter(value, EMAIL);
|
||||||
|
else if (!strcmp(name, "owner-filter"))
|
||||||
|
ctx.cfg.owner_filter = cgit_new_filter(value, OWNER);
|
||||||
else if (!strcmp(name, "auth-filter"))
|
else if (!strcmp(name, "auth-filter"))
|
||||||
ctx.cfg.auth_filter = cgit_new_filter(value, AUTH);
|
ctx.cfg.auth_filter = cgit_new_filter(value, AUTH);
|
||||||
else if (!strcmp(name, "embedded"))
|
else if (!strcmp(name, "embedded"))
|
||||||
@ -800,6 +804,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo)
|
|||||||
cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter=");
|
cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter=");
|
||||||
if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter)
|
if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter)
|
||||||
cgit_fprintf_filter(repo->email_filter, f, "repo.email-filter=");
|
cgit_fprintf_filter(repo->email_filter, f, "repo.email-filter=");
|
||||||
|
if (repo->owner_filter && repo->owner_filter != ctx.cfg.owner_filter)
|
||||||
|
cgit_fprintf_filter(repo->owner_filter, f, "repo.owner-filter=");
|
||||||
if (repo->snapshots != ctx.cfg.snapshots) {
|
if (repo->snapshots != ctx.cfg.snapshots) {
|
||||||
char *tmp = build_snapshot_setting(repo->snapshots);
|
char *tmp = build_snapshot_setting(repo->snapshots);
|
||||||
fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : "");
|
fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : "");
|
||||||
|
4
cgit.h
4
cgit.h
@ -57,7 +57,7 @@ typedef enum {
|
|||||||
} diff_type;
|
} diff_type;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ABOUT, COMMIT, SOURCE, EMAIL, AUTH
|
ABOUT, COMMIT, SOURCE, EMAIL, AUTH, OWNER
|
||||||
} filter_type;
|
} filter_type;
|
||||||
|
|
||||||
struct cgit_filter {
|
struct cgit_filter {
|
||||||
@ -104,6 +104,7 @@ struct cgit_repo {
|
|||||||
struct cgit_filter *commit_filter;
|
struct cgit_filter *commit_filter;
|
||||||
struct cgit_filter *source_filter;
|
struct cgit_filter *source_filter;
|
||||||
struct cgit_filter *email_filter;
|
struct cgit_filter *email_filter;
|
||||||
|
struct cgit_filter *owner_filter;
|
||||||
struct string_list submodules;
|
struct string_list submodules;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -257,6 +258,7 @@ struct cgit_config {
|
|||||||
struct cgit_filter *commit_filter;
|
struct cgit_filter *commit_filter;
|
||||||
struct cgit_filter *source_filter;
|
struct cgit_filter *source_filter;
|
||||||
struct cgit_filter *email_filter;
|
struct cgit_filter *email_filter;
|
||||||
|
struct cgit_filter *owner_filter;
|
||||||
struct cgit_filter *auth_filter;
|
struct cgit_filter *auth_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
18
cgitrc.5.txt
18
cgitrc.5.txt
@ -247,6 +247,15 @@ logo-link::
|
|||||||
calculated url of the repository index page will be used. Default
|
calculated url of the repository index page will be used. Default
|
||||||
value: none.
|
value: none.
|
||||||
|
|
||||||
|
owner-filter::
|
||||||
|
Specifies a command which will be invoked to format the Owner
|
||||||
|
column of the main page. The command will get the owner on STDIN,
|
||||||
|
and the STDOUT from the command will be included verbatim in the
|
||||||
|
table. This can be used to link to additional context such as an
|
||||||
|
owners home page. When active this filter is used instead of the
|
||||||
|
default owner query url. Default value: none.
|
||||||
|
See also: "FILTER API".
|
||||||
|
|
||||||
max-atom-items::
|
max-atom-items::
|
||||||
Specifies the number of items to display in atom feeds view. Default
|
Specifies the number of items to display in atom feeds view. Default
|
||||||
value: "10".
|
value: "10".
|
||||||
@ -509,6 +518,10 @@ repo.logo-link::
|
|||||||
calculated url of the repository index page will be used. Default
|
calculated url of the repository index page will be used. Default
|
||||||
value: global logo-link.
|
value: global logo-link.
|
||||||
|
|
||||||
|
repo.owner-filter::
|
||||||
|
Override the default owner-filter. Default value: none. See also:
|
||||||
|
"enable-filter-overrides". See also: "FILTER API".
|
||||||
|
|
||||||
repo.module-link::
|
repo.module-link::
|
||||||
Text which will be used as the formatstring for a hyperlink when a
|
Text which will be used as the formatstring for a hyperlink when a
|
||||||
submodule is printed in a directory listing. The arguments for the
|
submodule is printed in a directory listing. The arguments for the
|
||||||
@ -641,6 +654,11 @@ email filter::
|
|||||||
expected to write to standard output the formatted text to be included
|
expected to write to standard output the formatted text to be included
|
||||||
in the page.
|
in the page.
|
||||||
|
|
||||||
|
owner filter::
|
||||||
|
This filter is given no arguments. The owner text is avilable on
|
||||||
|
standard input and the filter is expected to write to standard
|
||||||
|
output. The output is included in the Owner column.
|
||||||
|
|
||||||
source filter::
|
source filter::
|
||||||
This filter is given a single parameter: the filename of the source
|
This filter is given a single parameter: the filename of the source
|
||||||
file to filter. The filter can use the filename to determine (for
|
file to filter. The filter can use the filename to determine (for
|
||||||
|
6
filter.c
6
filter.c
@ -38,12 +38,14 @@ void cgit_cleanup_filters(void)
|
|||||||
reap_filter(ctx.cfg.commit_filter);
|
reap_filter(ctx.cfg.commit_filter);
|
||||||
reap_filter(ctx.cfg.source_filter);
|
reap_filter(ctx.cfg.source_filter);
|
||||||
reap_filter(ctx.cfg.email_filter);
|
reap_filter(ctx.cfg.email_filter);
|
||||||
|
reap_filter(ctx.cfg.owner_filter);
|
||||||
reap_filter(ctx.cfg.auth_filter);
|
reap_filter(ctx.cfg.auth_filter);
|
||||||
for (i = 0; i < cgit_repolist.count; ++i) {
|
for (i = 0; i < cgit_repolist.count; ++i) {
|
||||||
reap_filter(cgit_repolist.repos[i].about_filter);
|
reap_filter(cgit_repolist.repos[i].about_filter);
|
||||||
reap_filter(cgit_repolist.repos[i].commit_filter);
|
reap_filter(cgit_repolist.repos[i].commit_filter);
|
||||||
reap_filter(cgit_repolist.repos[i].source_filter);
|
reap_filter(cgit_repolist.repos[i].source_filter);
|
||||||
reap_filter(cgit_repolist.repos[i].email_filter);
|
reap_filter(cgit_repolist.repos[i].email_filter);
|
||||||
|
reap_filter(cgit_repolist.repos[i].owner_filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,6 +427,10 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
|
|||||||
argument_count = 2;
|
argument_count = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OWNER:
|
||||||
|
argument_count = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
case SOURCE:
|
case SOURCE:
|
||||||
case ABOUT:
|
case ABOUT:
|
||||||
argument_count = 1;
|
argument_count = 1;
|
||||||
|
17
filters/owner-example.lua
Normal file
17
filters/owner-example.lua
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
-- This script is an example of an owner-filter. It replaces the
|
||||||
|
-- usual query link with one to a fictional homepage. This script may
|
||||||
|
-- be used with the owner-filter or repo.owner-filter settings in
|
||||||
|
-- cgitrc with the `lua:` prefix.
|
||||||
|
|
||||||
|
function filter_open()
|
||||||
|
buffer = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
function filter_close()
|
||||||
|
html(string.format("<a href=\"%s\">%s</a>", "http://wiki.example.com/about/" .. buffer, buffer))
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function filter_write(str)
|
||||||
|
buffer = buffer .. str
|
||||||
|
end
|
1
shared.c
1
shared.c
@ -72,6 +72,7 @@ struct cgit_repo *cgit_add_repo(const char *url)
|
|||||||
ret->commit_filter = ctx.cfg.commit_filter;
|
ret->commit_filter = ctx.cfg.commit_filter;
|
||||||
ret->source_filter = ctx.cfg.source_filter;
|
ret->source_filter = ctx.cfg.source_filter;
|
||||||
ret->email_filter = ctx.cfg.email_filter;
|
ret->email_filter = ctx.cfg.email_filter;
|
||||||
|
ret->owner_filter = ctx.cfg.owner_filter;
|
||||||
ret->clone_url = ctx.cfg.clone_url;
|
ret->clone_url = ctx.cfg.clone_url;
|
||||||
ret->submodules.strdup_strings = 1;
|
ret->submodules.strdup_strings = 1;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -307,13 +307,19 @@ void cgit_print_repolist()
|
|||||||
html_link_close();
|
html_link_close();
|
||||||
html("</td><td>");
|
html("</td><td>");
|
||||||
if (ctx.cfg.enable_index_owner) {
|
if (ctx.cfg.enable_index_owner) {
|
||||||
|
if (ctx.repo->owner_filter) {
|
||||||
|
cgit_open_filter(ctx.repo->owner_filter);
|
||||||
|
html_txt(ctx.repo->owner);
|
||||||
|
cgit_close_filter(ctx.repo->owner_filter);
|
||||||
|
} else {
|
||||||
html("<a href='");
|
html("<a href='");
|
||||||
html_attr(cgit_rooturl());
|
html_attr(cgit_rooturl());
|
||||||
html("?q=");
|
html("?=");
|
||||||
html_url_arg(ctx.repo->owner);
|
html_url_arg(ctx.repo->owner);
|
||||||
html("'>");
|
html("'>");
|
||||||
html_txt(ctx.repo->owner);
|
html_txt(ctx.repo->owner);
|
||||||
html("</a>");
|
html("</a>");
|
||||||
|
}
|
||||||
html("</td><td>");
|
html("</td><td>");
|
||||||
}
|
}
|
||||||
print_modtime(ctx.repo);
|
print_modtime(ctx.repo);
|
||||||
|
Завантаження…
Посилання в новій задачі
Block a user