On Sat, May 18, 2013 at 05:46:35PM +0200, Jason A. Donenfeld wrote: > On Sat, May 18, 2013 at 5:27 PM, Florian Pritz <[email protected]> wrote: > > The point is that I want to keep already cloned repositories (as in "git > > clone git://foo" via git-daemon) working and mod_rewrite won't help with > > that even though it would probably work fine with the http clones. > > Make a directory elsewhere on the file system. > Symlink everything you need into it. > Point git-daemon at that.
That might still break SSH; for a proper solution I think we need something like this (untested). It might be good to force USE_WILDCARD=YesPlease in the makefile on top of this patch, which will replace fnmatch with Git's wildmatch, adding support for "**" to match any number of directory levels. -- >8 -- Subject: [PATCH] Add scan-exclude option to filter out repositories Signed-off-by: John Keeping <[email protected]> --- cgit.c | 4 ++++ cgit.h | 1 + cgitrc.5.txt | 7 +++++++ scan-tree.c | 15 +++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/cgit.c b/cgit.c index 6f44ef2..c621439 100644 --- a/cgit.c +++ b/cgit.c @@ -229,6 +229,8 @@ static void config_cb(const char *name, const char *value) ctx.cfg.max_commit_count = atoi(value); else if (!strcmp(name, "project-list")) ctx.cfg.project_list = xstrdup(expand_macros(value)); + else if (!strcmp(name, "scan-exclude")) + string_list_append(&ctx.cfg.scan_exclude, expand_macros(value)); else if (!strcmp(name, "scan-path")) if (!ctx.cfg.nocache && ctx.cfg.cache_size) process_cached_repolist(expand_macros(value)); @@ -405,6 +407,8 @@ static void prepare_context(struct cgit_context *ctx) ctx->page.expires = ctx->page.modified; ctx->page.etag = NULL; memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); + memset(&ctx->cfg.scan_exclude, 0, sizeof(struct string_list)); + ctx->cfg.scan_exclude.strdup_strings = 1; if (ctx->env.script_name) ctx->cfg.script_name = xstrdup(ctx->env.script_name); if (ctx->env.query_string) diff --git a/cgit.h b/cgit.h index 850b792..ee6a545 100644 --- a/cgit.h +++ b/cgit.h @@ -238,6 +238,7 @@ struct cgit_config { int branch_sort; int commit_sort; struct string_list mimetypes; + struct string_list scan_exclude; struct cgit_filter *about_filter; struct cgit_filter *commit_filter; struct cgit_filter *source_filter; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 9b803b3..71db425 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -329,6 +329,13 @@ root-title:: Text printed as heading on the repository index page. Default value: "Git Repository Browser". +scan-exclude:: + Specified a pattern to be used to exclude repositories found by + "scan-path". This option may be specified more than once, with each + pattern being compared to discovered repositories with fnmatch(3). + Any matches will cause the repository to be omitted from CGit's index. + This must be defined prior to scan-path. See also: scan-path. + scan-hidden-path:: If set to "1" and scan-path is enabled, scan-path will recurse into directories whose name starts with a period ('.'). Otherwise, diff --git a/scan-tree.c b/scan-tree.c index a1ec8fb..6ab49e5 100644 --- a/scan-tree.c +++ b/scan-tree.c @@ -75,6 +75,18 @@ static char *xstrrchr(char *s, char *from, int c) return from < s ? NULL : from; } +static int exclude_repo(const char *path) +{ + int i; + struct string_list *exclude = &ctx.cfg.scan_exclude; + + for (i = 0; i < exclude->nr; i++) + if (!fnmatch(exclude->items[i].string, path, FNM_PATHNAME)) + return 1; + + return 0; +} + static void add_repo(const char *base, struct strbuf *path, repo_config_fn fn) { struct stat st; @@ -91,6 +103,9 @@ static void add_repo(const char *base, struct strbuf *path, repo_config_fn fn) return; } + if (exclude_repo(path->buf)) + return; + strbuf_addch(path, '/'); pathlen = path->len; -- 1.8.3.rc2.285.gfc18c2c _______________________________________________ CGit mailing list [email protected] http://lists.zx2c4.com/mailman/listinfo/cgit
