From: John Keeping <j...@keeping.me.uk>

This allows different filter implementations to be specified in the
configuration file.  Currently only "exec" is supported, but it may now
be specified either with or without the "exec:" prefix.

Signed-off-by: John Keeping <j...@keeping.me.uk>
---
 cgitrc.5.txt |  9 +++++++++
 filter.c     | 33 +++++++++++++++++++++++++++++++--
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 52caed0..60159f6 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -557,6 +557,15 @@ config files, e.g. "repo.desc" becomes "desc".
 
 FILTER API
 ----------
+By default, filters are separate processes that are executed each time they
+are needed.  Alternative technologies may be used by prefixing the filter
+specification with the relevant string; available values are:
+
+'exec:'::
+       The default "one process per filter" mode.
+
+Parameters are provided to filters as follows.
+
 about 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
diff --git a/filter.c b/filter.c
index 0f3edb0..ba66e46 100644
--- a/filter.c
+++ b/filter.c
@@ -64,7 +64,7 @@ done:
 static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char 
*prefix)
 {
        struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base;
-       fprintf(f, "%s%s\n", prefix, filter->cmd);
+       fprintf(f, "%sexec:%s\n", prefix, filter->cmd);
 }
 
 int cgit_open_filter(struct cgit_filter *filter, ...)
@@ -125,10 +125,39 @@ static struct cgit_filter *new_exec_filter(const char 
*cmd, filter_type filterty
        return &f->base;
 }
 
+static const struct {
+       const char *prefix;
+       struct cgit_filter *(*ctor)(const char *cmd, filter_type filtertype);
+} filter_specs[] = {
+       { "exec", new_exec_filter },
+};
+
 struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
 {
+       char *colon;
+       int i;
+       size_t len;
        if (!cmd || !cmd[0])
                return NULL;
 
-       return new_exec_filter(cmd, filtertype);
+       colon = strchr(cmd, ':');
+       len = colon - cmd;
+       /*
+        * In case we're running on Windows, don't allow a single letter before
+        * the colon.
+        */
+       if (len == 1)
+               colon = NULL;
+
+       /* If no prefix is given, exec filter is the default. */
+       if (!colon)
+               return new_exec_filter(cmd, filtertype);
+
+       for (i = 0; i < ARRAY_SIZE(filter_specs); i++) {
+               if (len == strlen(filter_specs[i].prefix) &&
+                   !strncmp(filter_specs[i].prefix, cmd, len))
+                       return filter_specs[i].ctor(colon + 1, filtertype);
+       }
+
+       die("Invalid filter type: %.*s", (int) len, cmd);
 }
-- 
1.8.5.2

_______________________________________________
CGit mailing list
CGit@lists.zx2c4.com
http://lists.zx2c4.com/mailman/listinfo/cgit

Reply via email to