From d746827ec43a6dd53bce56ee8d8100a03383329e Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Thu, 20 Aug 2009 17:41:54 +0200 Subject: cgit.c: add support for caching autodetected repositories Signed-off-by: Lars Hjemli --- cgit.h | 1 + 1 file changed, 1 insertion(+) (limited to 'cgit.h') diff --git a/cgit.h b/cgit.h index adb8da4..5659580 100644 --- a/cgit.h +++ b/cgit.h @@ -168,6 +168,7 @@ struct cgit_config { int cache_max_create_time; int cache_repo_ttl; int cache_root_ttl; + int cache_scanrc_ttl; int cache_static_ttl; int embedded; int enable_index_links; -- cgit v1.2.3-59-g8ed1b From e7af002d5c405c82652f739d08ced3908d1f57e7 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sun, 23 Aug 2009 22:58:39 +0200 Subject: Introduce 'section' as canonical spelling for 'repo.group' The 'repo.' prefix should be reserved for repo-specific options, but the option 'repo.group' must still be honored to stay backwards compatible. Signed-off-by: Lars Hjemli --- cgit.c | 4 ++-- cgit.css | 2 +- cgit.h | 4 ++-- cgitrc.5.txt | 9 +++++++-- shared.c | 2 +- ui-repolist.c | 18 +++++++++--------- 6 files changed, 22 insertions(+), 17 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index a792fe4..013a0fe 100644 --- a/cgit.c +++ b/cgit.c @@ -143,8 +143,8 @@ void config_cb(const char *name, const char *value) ctx.cfg.local_time = atoi(value); else if (!prefixcmp(name, "mimetype.")) add_mimetype(name + 9, value); - else if (!strcmp(name, "repo.group")) - ctx.cfg.repo_group = xstrdup(value); + else if (!strcmp(name, "section") || !strcmp(name, "repo.group")) + ctx.cfg.section = xstrdup(value); else if (!strcmp(name, "repo.url")) ctx.repo = cgit_add_repo(value); else if (!strcmp(name, "repo.name")) diff --git a/cgit.css b/cgit.css index e3b32e7..3c65114 100644 --- a/cgit.css +++ b/cgit.css @@ -429,7 +429,7 @@ table.diff td div.del { text-align: right; } -table.list td.repogroup { +table.list td.reposection { font-style: italic; color: #888; } diff --git a/cgit.h b/cgit.h index 5659580..fc7c7d5 100644 --- a/cgit.h +++ b/cgit.h @@ -65,9 +65,9 @@ struct cgit_repo { char *desc; char *owner; char *defbranch; - char *group; char *module_link; char *readme; + char *section; char *clone_url; int snapshots; int enable_log_filecount; @@ -156,12 +156,12 @@ struct cgit_config { char *logo; char *logo_link; char *module_link; - char *repo_group; char *robots; char *root_title; char *root_desc; char *root_readme; char *script_name; + char *section; char *virtual_root; int cache_size; int cache_dynamic_ttl; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 2abbd41..4d009f9 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -200,8 +200,8 @@ renamelimit:: `man git-diff`). Default value: "-1". repo.group:: - A value for the current repository group, which all repositories - specified after this setting will inherit. Default value: none. + Legacy alias for 'section' which will be deprecated starting with + cgit-1.0. robots:: Text used as content for the "robots" meta-tag. Default value: @@ -225,6 +225,11 @@ scan-path:: the result will be cached as a cgitrc include-file in the cache directory. Default value: none. See also: cache-scanrc-ttl. +section: + The name of the current repository section - all repositories defined + after this option will inherit the current section name. Default value: + none. + snapshots:: Text which specifies the default set of snapshot formats generated by cgit. The value is a space-separated list of zero or more of the diff --git a/shared.c b/shared.c index 4cb9573..9475581 100644 --- a/shared.c +++ b/shared.c @@ -53,7 +53,7 @@ struct cgit_repo *cgit_add_repo(const char *url) ret->path = NULL; ret->desc = "[no description]"; ret->owner = NULL; - ret->group = ctx.cfg.repo_group; + ret->section = ctx.cfg.section; ret->defbranch = "master"; ret->snapshots = ctx.cfg.snapshots; ret->enable_log_filecount = ctx.cfg.enable_log_filecount; diff --git a/ui-repolist.c b/ui-repolist.c index 7c7aa9b..4dea3b3 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -203,7 +203,7 @@ int sort_repolist(char *field) void cgit_print_repolist() { int i, columns = 4, hits = 0, header = 0; - char *last_group = NULL; + char *last_section = NULL; int sorted = 0; if (ctx.cfg.enable_index_links) @@ -233,18 +233,18 @@ void cgit_print_repolist() if (!header++) print_header(columns); if (!sorted && - ((last_group == NULL && ctx.repo->group != NULL) || - (last_group != NULL && ctx.repo->group == NULL) || - (last_group != NULL && ctx.repo->group != NULL && - strcmp(ctx.repo->group, last_group)))) { - htmlf("", + ((last_section == NULL && ctx.repo->section != NULL) || + (last_section != NULL && ctx.repo->section == NULL) || + (last_section != NULL && ctx.repo->section != NULL && + strcmp(ctx.repo->section, last_section)))) { + htmlf("", columns); - html_txt(ctx.repo->group); + html_txt(ctx.repo->section); html(""); - last_group = ctx.repo->group; + last_section = ctx.repo->section; } htmlf("", - !sorted && ctx.repo->group ? "sublevel-repo" : "toplevel-repo"); + !sorted && ctx.repo->section ? "sublevel-repo" : "toplevel-repo"); cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL); html(""); html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL); -- cgit v1.2.3-59-g8ed1b From 74061ed5f03e72796450aa3b8ca1cf6ced5d59e2 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Aug 2009 00:04:58 +0200 Subject: Add support for repo-local cgitrc file When recursively scanning a directory tree looking for git repositories, cgit will now parse cgitrc files found within such repositories. The repo-specific config files can include any repo-specific options except 'repo.url' and 'repo.path'. Also, in such config files the 'repo.' prefix can not be used, i.e. the valid options then becomes: * name * clone-url * desc * ower * defbranch * snapshots * enable-log-filecount * enable-log-linecount * max-stats * module-link * section * about-filter * commit-filter * source-filter * readme Signed-off-by: Lars Hjemli --- cgit.c | 8 ++++---- cgit.h | 3 +++ cgitrc.5.txt | 9 +++++++++ scan-tree.c | 30 ++++++++++++++++++++++-------- scan-tree.h | 2 +- 5 files changed, 39 insertions(+), 13 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index 90ae124..e281aa9 100644 --- a/cgit.c +++ b/cgit.c @@ -168,7 +168,7 @@ void config_cb(const char *name, const char *value) if (!ctx.cfg.nocache && ctx.cfg.cache_size) process_cached_repolist(value); else - scan_tree(value); + scan_tree(value, repo_config); else if (!strcmp(name, "source-filter")) ctx.cfg.source_filter = new_filter(value, 1); else if (!strcmp(name, "summary-log")) @@ -476,7 +476,7 @@ static int generate_cached_repolist(const char *path, const char *cached_rc) return errno; } idx = cgit_repolist.count; - scan_tree(path); + scan_tree(path, repo_config); print_repolist(f, &cgit_repolist, idx); if (rename(locked_rc, cached_rc)) fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", @@ -500,7 +500,7 @@ static void process_cached_repolist(const char *path) * invoke scan_tree manually. */ if (generate_cached_repolist(path, cached_rc)) - scan_tree(path); + scan_tree(path, repo_config); return; } @@ -559,7 +559,7 @@ static void cgit_parse_args(int argc, const char **argv) if (!strncmp(argv[i], "--scan-tree=", 12) || !strncmp(argv[i], "--scan-path=", 12)) { scan++; - scan_tree(argv[i] + 12); + scan_tree(argv[i] + 12, repo_config); } } if (scan) { diff --git a/cgit.h b/cgit.h index fc7c7d5..3359be9 100644 --- a/cgit.h +++ b/cgit.h @@ -79,6 +79,9 @@ struct cgit_repo { struct cgit_filter *source_filter; }; +typedef void (*repo_config_fn)(struct cgit_repo *repo, const char *name, + const char *value); + struct cgit_repolist { int length; int count; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index e99c9f7..df494aa 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -326,6 +326,15 @@ repo.url:: setting specified for each repo. Default value: none. +REPOSITORY-SPECIFIC CGITRC FILE +------------------------------- +When the option 'scan-path' is used to auto-discover git repositories, cgit +will try to parse the file 'cgitrc' within any found repository. Such a repo- +specific config file may contain any of the repo-specific options described +above, except 'repo.url' and 'repo.path'. Also, in a repo-specific config +file, the 'repo.' prefix is dropped from the config option names. + + EXAMPLE CGITRC FILE ------------------- diff --git a/scan-tree.c b/scan-tree.c index 67f4550..dbca797 100644 --- a/scan-tree.c +++ b/scan-tree.c @@ -1,4 +1,5 @@ #include "cgit.h" +#include "configfile.h" #include "html.h" #define MAX_PATH 4096 @@ -35,9 +36,16 @@ static int is_git_dir(const char *path) return 1; } -static void add_repo(const char *base, const char *path) +struct cgit_repo *repo; +repo_config_fn config_fn; + +static void repo_config(const char *name, const char *value) +{ + config_fn(repo, name, value); +} + +static void add_repo(const char *base, const char *path, repo_config_fn fn) { - struct cgit_repo *repo; struct stat st; struct passwd *pwd; char *p; @@ -76,9 +84,15 @@ static void add_repo(const char *base, const char *path) p = fmt("%s/README.html", path); if (!stat(p, &st)) repo->readme = "README.html"; + + p = fmt("%s/cgitrc", path); + if (!stat(p, &st)) { + config_fn = fn; + parse_configfile(xstrdup(p), &repo_config); + } } -static void scan_path(const char *base, const char *path) +static void scan_path(const char *base, const char *path, repo_config_fn fn) { DIR *dir; struct dirent *ent; @@ -86,11 +100,11 @@ static void scan_path(const char *base, const char *path) struct stat st; if (is_git_dir(path)) { - add_repo(base, path); + add_repo(base, path, fn); return; } if (is_git_dir(fmt("%s/.git", path))) { - add_repo(base, fmt("%s/.git", path)); + add_repo(base, fmt("%s/.git", path), fn); return; } dir = opendir(path); @@ -120,13 +134,13 @@ static void scan_path(const char *base, const char *path) continue; } if (S_ISDIR(st.st_mode)) - scan_path(base, buf); + scan_path(base, buf, fn); free(buf); } closedir(dir); } -void scan_tree(const char *path) +void scan_tree(const char *path, repo_config_fn fn) { - scan_path(path, path); + scan_path(path, path, fn); } diff --git a/scan-tree.h b/scan-tree.h index b103b16..11539f4 100644 --- a/scan-tree.h +++ b/scan-tree.h @@ -1,3 +1,3 @@ -extern void scan_tree(const char *path); +extern void scan_tree(const char *path, repo_config_fn fn); -- cgit v1.2.3-59-g8ed1b From 2273c2c821bfc77d492d7e97ae38f162d7fc91aa Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Aug 2009 08:53:21 +0200 Subject: Add config option 'enable-filter-overrides' This option must be enabled if repo-specific cgitrc files should be allowed to override any of the 'filter' options. Signed-off-by: Lars Hjemli --- cgit.c | 15 +++++++++------ cgit.h | 1 + cgitrc.5.txt | 21 ++++++++++++++++----- 3 files changed, 26 insertions(+), 11 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index 167b5dd..f1ea03c 100644 --- a/cgit.c +++ b/cgit.c @@ -66,17 +66,18 @@ void repo_config(struct cgit_repo *repo, const char *name, const char *value) repo->module_link= xstrdup(value); else if (!strcmp(name, "section")) repo->section = xstrdup(value); - else if (!strcmp(name, "about-filter")) - repo->about_filter = new_filter(value, 0); - else if (!strcmp(name, "commit-filter")) - repo->commit_filter = new_filter(value, 0); - else if (!strcmp(name, "source-filter")) - repo->source_filter = new_filter(value, 1); else if (!strcmp(name, "readme") && value != NULL) { if (*value == '/') ctx.repo->readme = xstrdup(value); else ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); + } else if (ctx.cfg.enable_filter_overrides) { + if (!strcmp(name, "about-filter")) + repo->about_filter = new_filter(value, 0); + else if (!strcmp(name, "commit-filter")) + repo->commit_filter = new_filter(value, 0); + else if (!strcmp(name, "source-filter")) + repo->source_filter = new_filter(value, 1); } } @@ -128,6 +129,8 @@ void config_cb(const char *name, const char *value) ctx.cfg.noheader = atoi(value); else if (!strcmp(name, "snapshots")) ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); + else if (!strcmp(name, "enable-filter-overrides")) + ctx.cfg.enable_filter_overrides = atoi(value); else if (!strcmp(name, "enable-index-links")) ctx.cfg.enable_index_links = atoi(value); else if (!strcmp(name, "enable-log-filecount")) diff --git a/cgit.h b/cgit.h index 3359be9..ef109aa 100644 --- a/cgit.h +++ b/cgit.h @@ -174,6 +174,7 @@ struct cgit_config { int cache_scanrc_ttl; int cache_static_ttl; int embedded; + int enable_filter_overrides; int enable_index_links; int enable_log_filecount; int enable_log_linecount; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 46df291..617b7c3 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -88,6 +88,10 @@ embedded:: suitable for embedding in other html pages. Default value: none. See also: "noheader". +enable-filter-overrides:: + Flag which, when set to "1", allows all filter settings to be + overridden in repository-specific cgitrc files. Default value: none. + enable-index-links:: Flag which, when set to "1", will make cgit generate extra links for each repo in the repository index (specifically, to the "summary", @@ -266,14 +270,16 @@ virtual-root:: REPOSITORY SETTINGS ------------------- repo.about-filter:: - Override the default about-filter. Default value: . + Override the default about-filter. Default value: none. See also: + "enable-filter-overrides". repo.clone-url:: A list of space-separated urls which can be used to clone this repo. Default value: none. repo.commit-filter:: - Override the default commit-filter. Default value: . + Override the default commit-filter. Default value: none. See also: + "enable-filter-overrides". repo.defbranch:: The name of the default branch for this repository. If no such branch @@ -320,7 +326,8 @@ repo.section:: none. repo.source-filter:: - Override the default source-filter. Default value: . + Override the default source-filter. Default value: none. See also: + "enable-filter-overrides". repo.url:: The relative url used to access the repository. This must be the first @@ -332,8 +339,12 @@ REPOSITORY-SPECIFIC CGITRC FILE When the option "scan-path" is used to auto-discover git repositories, cgit will try to parse the file "cgitrc" within any found repository. Such a repo-specific config file may contain any of the repo-specific options -described above, except "repo.url" and "repo.path". Also, in a repo-specific -config file, the "repo." prefix is dropped from the config option names. +described above, except "repo.url" and "repo.path". Additionally, the "filter" +options are only acknowledged in repo-specific config files when +"enable-filter-overrides" is set to "1". + +Note: the "repo." prefix is dropped from the option names in repo-specific +config files, e.g. "repo.desc" becomes "desc". EXAMPLE CGITRC FILE -- cgit v1.2.3-59-g8ed1b