aboutsummaryrefslogtreecommitdiff
path: root/ui-ci.c
diff options
from:
to:
context:
space:
mode:
Diffstat (limited to 'ui-ci.c')
-rw-r--r--ui-ci.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/ui-ci.c b/ui-ci.c
index 1c9f39c..ffd3a65 100644
--- a/ui-ci.c
+++ b/ui-ci.c
@@ -73,9 +73,24 @@ static char *expand_ci_url(const char *template)
return strbuf_detach(&buf, NULL);
}
+/* Ask the ci filter whether the pipeline denoted by url actually exists.
+ * The filter must not write to stdout, and signals "yes" by exiting with
+ * a zero status.
+ */
+static int ci_filter_accepts(const char *refkind, const char *url)
+{
+ struct cgit_filter *filter = ctx.repo->ci_filter;
+
+ if (!filter)
+ return 1;
+ if (cgit_open_filter(filter, ctx.qry.head, refkind, url))
+ return 0;
+ return !cgit_close_filter(filter);
+}
+
static void resolve_ci_url(void)
{
- const char *template;
+ const char *template, *refkind;
if (ci_resolved != -1)
return;
@@ -84,16 +99,24 @@ static void resolve_ci_url(void)
if (!ctx.repo || !ctx.qry.head || !cgit_have_repository())
return;
- if (ref_is_tag(ctx.qry.head))
+ if (ref_is_tag(ctx.qry.head)) {
+ refkind = "tag";
template = ctx.repo->ci_tag_url;
- else
+ } else {
+ refkind = "branch";
template = ctx.repo->ci_branch_url;
+ }
if (!template)
template = ctx.repo->ci_url;
if (!template)
return;
ci_url = expand_ci_url(template);
+ if (!ci_filter_accepts(refkind, ci_url)) {
+ free(ci_url);
+ ci_url = NULL;
+ return;
+ }
ci_resolved = 1;
}