summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c3
-rw-r--r--cgit.h1
-rw-r--r--cgitrc.5.txt5
-rw-r--r--scan-tree.c33
4 files changed, 33 insertions, 9 deletions
diff --git a/cgit.c b/cgit.c
index f9a42bb..eff5b7a 100644
--- a/cgit.c
+++ b/cgit.c
@@ -134,8 +134,10 @@ void config_cb(const char *name, const char *value)
134 else if (!strcmp(name, "snapshots")) 134 else if (!strcmp(name, "snapshots"))
135 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); 135 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
136 else if (!strcmp(name, "enable-filter-overrides")) 136 else if (!strcmp(name, "enable-filter-overrides"))
137 ctx.cfg.enable_filter_overrides = atoi(value); 137 ctx.cfg.enable_filter_overrides = atoi(value);
138 else if (!strcmp(name, "enable-gitweb-owner"))
139 ctx.cfg.enable_gitweb_owner = atoi(value);
138 else if (!strcmp(name, "enable-index-links")) 140 else if (!strcmp(name, "enable-index-links"))
139 ctx.cfg.enable_index_links = atoi(value); 141 ctx.cfg.enable_index_links = atoi(value);
140 else if (!strcmp(name, "enable-log-filecount")) 142 else if (!strcmp(name, "enable-log-filecount"))
141 ctx.cfg.enable_log_filecount = atoi(value); 143 ctx.cfg.enable_log_filecount = atoi(value);
@@ -292,8 +294,9 @@ static void prepare_context(struct cgit_context *ctx)
292 ctx->cfg.cache_static_ttl = -1; 294 ctx->cfg.cache_static_ttl = -1;
293 ctx->cfg.css = "/cgit.css"; 295 ctx->cfg.css = "/cgit.css";
294 ctx->cfg.logo = "/cgit.png"; 296 ctx->cfg.logo = "/cgit.png";
295 ctx->cfg.local_time = 0; 297 ctx->cfg.local_time = 0;
298 ctx->cfg.enable_gitweb_owner = 1;
296 ctx->cfg.enable_tree_linenumbers = 1; 299 ctx->cfg.enable_tree_linenumbers = 1;
297 ctx->cfg.max_repo_count = 50; 300 ctx->cfg.max_repo_count = 50;
298 ctx->cfg.max_commit_count = 50; 301 ctx->cfg.max_commit_count = 50;
299 ctx->cfg.max_lock_attempts = 5; 302 ctx->cfg.max_lock_attempts = 5;
diff --git a/cgit.h b/cgit.h
index ada8535..232099d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -182,8 +182,9 @@ struct cgit_config {
182 int cache_scanrc_ttl; 182 int cache_scanrc_ttl;
183 int cache_static_ttl; 183 int cache_static_ttl;
184 int embedded; 184 int embedded;
185 int enable_filter_overrides; 185 int enable_filter_overrides;
186 int enable_gitweb_owner;
186 int enable_index_links; 187 int enable_index_links;
187 int enable_log_filecount; 188 int enable_log_filecount;
188 int enable_log_linecount; 189 int enable_log_linecount;
189 int enable_remote_branches; 190 int enable_remote_branches;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 6fb1083..5d77973 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -94,8 +94,13 @@ embedded::
94enable-filter-overrides:: 94enable-filter-overrides::
95 Flag which, when set to "1", allows all filter settings to be 95 Flag which, when set to "1", allows all filter settings to be
96 overridden in repository-specific cgitrc files. Default value: none. 96 overridden in repository-specific cgitrc files. Default value: none.
97 97
98enable-gitweb-owner::
99 If set to "1" and scan-path is enabled, we first check each repository
100 for the git config value "gitweb.owner" to determine the owner.
101 Default value: "1". See also: scan-path.
102
98enable-index-links:: 103enable-index-links::
99 Flag which, when set to "1", will make cgit generate extra links for 104 Flag which, when set to "1", will make cgit generate extra links for
100 each repo in the repository index (specifically, to the "summary", 105 each repo in the repository index (specifically, to the "summary",
101 "commit" and "tree" pages). Default value: "0". 106 "commit" and "tree" pages). Default value: "0".
diff --git a/scan-tree.c b/scan-tree.c
index a83a78c..e987824 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -46,14 +46,22 @@ static int is_git_dir(const char *path)
46} 46}
47 47
48struct cgit_repo *repo; 48struct cgit_repo *repo;
49repo_config_fn config_fn; 49repo_config_fn config_fn;
50char *owner;
50 51
51static void repo_config(const char *name, const char *value) 52static void repo_config(const char *name, const char *value)
52{ 53{
53 config_fn(repo, name, value); 54 config_fn(repo, name, value);
54} 55}
55 56
57static int git_owner_config(const char *key, const char *value, void *cb)
58{
59 if (!strcmp(key, "gitweb.owner"))
60 owner = xstrdup(value);
61 return 0;
62}
63
56static void add_repo(const char *base, const char *path, repo_config_fn fn) 64static void add_repo(const char *base, const char *path, repo_config_fn fn)
57{ 65{
58 struct stat st; 66 struct stat st;
59 struct passwd *pwd; 67 struct passwd *pwd;
@@ -66,13 +74,12 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
66 return; 74 return;
67 } 75 }
68 if (!stat(fmt("%s/noweb", path), &st)) 76 if (!stat(fmt("%s/noweb", path), &st))
69 return; 77 return;
70 if ((pwd = getpwuid(st.st_uid)) == NULL) { 78
71 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", 79 owner = NULL;
72 path, strerror(errno), errno); 80 if (ctx.cfg.enable_gitweb_owner)
73 return; 81 git_config_from_file(git_owner_config, fmt("%s/config", path), NULL);
74 }
75 if (base == path) 82 if (base == path)
76 p = fmt("%s", path); 83 p = fmt("%s", path);
77 else 84 else
78 p = fmt("%s", path + strlen(base) + 1); 85 p = fmt("%s", path + strlen(base) + 1);
@@ -85,12 +92,20 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
85 if ((p = strrchr(repo->url, '.')) && !strcmp(p, ".git")) 92 if ((p = strrchr(repo->url, '.')) && !strcmp(p, ".git"))
86 *p = '\0'; 93 *p = '\0';
87 repo->name = repo->url; 94 repo->name = repo->url;
88 repo->path = xstrdup(path); 95 repo->path = xstrdup(path);
89 p = (pwd && pwd->pw_gecos) ? strchr(pwd->pw_gecos, ',') : NULL; 96 while (!owner) {
90 if (p) 97 if ((pwd = getpwuid(st.st_uid)) == NULL) {
91 *p = '\0'; 98 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",
92 repo->owner = (pwd ? xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name) : ""); 99 path, strerror(errno), errno);
100 break;
101 }
102 if (pwd->pw_gecos)
103 if ((p = strchr(pwd->pw_gecos, ',')))
104 *p = '\0';
105 owner = xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name);
106 }
107 repo->owner = owner;
93 108
94 p = fmt("%s/description", path); 109 p = fmt("%s/description", path);
95 if (!stat(p, &st)) 110 if (!stat(p, &st))
96 readfile(p, &repo->desc, &size); 111 readfile(p, &repo->desc, &size);