-rw-r--r-- | cgit.c | 3 | ||||
-rw-r--r-- | cgit.h | 1 | ||||
-rw-r--r-- | cgitrc.5.txt | 5 | ||||
-rw-r--r-- | scan-tree.c | 33 |
4 files changed, 33 insertions, 9 deletions
@@ -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; |
@@ -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:: | |||
94 | enable-filter-overrides:: | 94 | enable-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 | ||
98 | enable-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 | |||
98 | enable-index-links:: | 103 | enable-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 | ||
48 | struct cgit_repo *repo; | 48 | struct cgit_repo *repo; |
49 | repo_config_fn config_fn; | 49 | repo_config_fn config_fn; |
50 | char *owner; | ||
50 | 51 | ||
51 | static void repo_config(const char *name, const char *value) | 52 | static 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 | ||
57 | static 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 | |||
56 | static void add_repo(const char *base, const char *path, repo_config_fn fn) | 64 | static 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); |