diff options
Diffstat (limited to 'ui-ci.c')
| -rw-r--r-- | ui-ci.c | 29 |
1 files changed, 26 insertions, 3 deletions
@@ -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; } |