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
@@ -126,24 +126,26 @@ void config_cb(const char *name, const char *value)
126 if (!ctx.cfg.virtual_root && (!strcmp(value, "/"))) 126 if (!ctx.cfg.virtual_root && (!strcmp(value, "/")))
127 ctx.cfg.virtual_root = ""; 127 ctx.cfg.virtual_root = "";
128 } else if (!strcmp(name, "nocache")) 128 } else if (!strcmp(name, "nocache"))
129 ctx.cfg.nocache = atoi(value); 129 ctx.cfg.nocache = atoi(value);
130 else if (!strcmp(name, "noplainemail")) 130 else if (!strcmp(name, "noplainemail"))
131 ctx.cfg.noplainemail = atoi(value); 131 ctx.cfg.noplainemail = atoi(value);
132 else if (!strcmp(name, "noheader")) 132 else if (!strcmp(name, "noheader"))
133 ctx.cfg.noheader = atoi(value); 133 ctx.cfg.noheader = atoi(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);
142 else if (!strcmp(name, "enable-log-linecount")) 144 else if (!strcmp(name, "enable-log-linecount"))
143 ctx.cfg.enable_log_linecount = atoi(value); 145 ctx.cfg.enable_log_linecount = atoi(value);
144 else if (!strcmp(name, "enable-remote-branches")) 146 else if (!strcmp(name, "enable-remote-branches"))
145 ctx.cfg.enable_remote_branches = atoi(value); 147 ctx.cfg.enable_remote_branches = atoi(value);
146 else if (!strcmp(name, "enable-subject-links")) 148 else if (!strcmp(name, "enable-subject-links"))
147 ctx.cfg.enable_subject_links = atoi(value); 149 ctx.cfg.enable_subject_links = atoi(value);
148 else if (!strcmp(name, "enable-tree-linenumbers")) 150 else if (!strcmp(name, "enable-tree-linenumbers"))
149 ctx.cfg.enable_tree_linenumbers = atoi(value); 151 ctx.cfg.enable_tree_linenumbers = atoi(value);
@@ -284,24 +286,25 @@ static void prepare_context(struct cgit_context *ctx)
284 ctx->cfg.nocache = 0; 286 ctx->cfg.nocache = 0;
285 ctx->cfg.cache_size = 0; 287 ctx->cfg.cache_size = 0;
286 ctx->cfg.cache_dynamic_ttl = 5; 288 ctx->cfg.cache_dynamic_ttl = 5;
287 ctx->cfg.cache_max_create_time = 5; 289 ctx->cfg.cache_max_create_time = 5;
288 ctx->cfg.cache_repo_ttl = 5; 290 ctx->cfg.cache_repo_ttl = 5;
289 ctx->cfg.cache_root = CGIT_CACHE_ROOT; 291 ctx->cfg.cache_root = CGIT_CACHE_ROOT;
290 ctx->cfg.cache_root_ttl = 5; 292 ctx->cfg.cache_root_ttl = 5;
291 ctx->cfg.cache_scanrc_ttl = 15; 293 ctx->cfg.cache_scanrc_ttl = 15;
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;
300 ctx->cfg.max_msg_len = 80; 303 ctx->cfg.max_msg_len = 80;
301 ctx->cfg.max_repodesc_len = 80; 304 ctx->cfg.max_repodesc_len = 80;
302 ctx->cfg.max_blob_size = 0; 305 ctx->cfg.max_blob_size = 0;
303 ctx->cfg.max_stats = 0; 306 ctx->cfg.max_stats = 0;
304 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 307 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
305 ctx->cfg.project_list = NULL; 308 ctx->cfg.project_list = NULL;
306 ctx->cfg.renamelimit = -1; 309 ctx->cfg.renamelimit = -1;
307 ctx->cfg.remove_suffix = 0; 310 ctx->cfg.remove_suffix = 0;
diff --git a/cgit.h b/cgit.h
index ada8535..232099d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -174,24 +174,25 @@ struct cgit_config {
174 char *script_name; 174 char *script_name;
175 char *section; 175 char *section;
176 char *virtual_root; 176 char *virtual_root;
177 int cache_size; 177 int cache_size;
178 int cache_dynamic_ttl; 178 int cache_dynamic_ttl;
179 int cache_max_create_time; 179 int cache_max_create_time;
180 int cache_repo_ttl; 180 int cache_repo_ttl;
181 int cache_root_ttl; 181 int cache_root_ttl;
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;
190 int enable_subject_links; 191 int enable_subject_links;
191 int enable_tree_linenumbers; 192 int enable_tree_linenumbers;
192 int local_time; 193 int local_time;
193 int max_atom_items; 194 int max_atom_items;
194 int max_repo_count; 195 int max_repo_count;
195 int max_commit_count; 196 int max_commit_count;
196 int max_lock_attempts; 197 int max_lock_attempts;
197 int max_msg_len; 198 int max_msg_len;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 6fb1083..5d77973 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -86,24 +86,29 @@ css::
86 Url which specifies the css document to include in all cgit pages. 86 Url which specifies the css document to include in all cgit pages.
87 Default value: "/cgit.css". 87 Default value: "/cgit.css".
88 88
89embedded:: 89embedded::
90 Flag which, when set to "1", will make cgit generate a html fragment 90 Flag which, when set to "1", will make cgit generate a html fragment
91 suitable for embedding in other html pages. Default value: none. See 91 suitable for embedding in other html pages. Default value: none. See
92 also: "noheader". 92 also: "noheader".
93 93
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".
102 107
103enable-log-filecount:: 108enable-log-filecount::
104 Flag which, when set to "1", will make cgit print the number of 109 Flag which, when set to "1", will make cgit print the number of
105 modified files for each commit on the repository log page. Default 110 modified files for each commit on the repository log page. Default
106 value: "0". 111 value: "0".
107 112
108enable-log-linecount:: 113enable-log-linecount::
109 Flag which, when set to "1", will make cgit print the number of added 114 Flag which, when set to "1", will make cgit print the number of added
diff --git a/scan-tree.c b/scan-tree.c
index a83a78c..e987824 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -38,67 +38,82 @@ static int is_git_dir(const char *path)
38 fprintf(stderr, "Error checking path %s: %s (%d)\n", 38 fprintf(stderr, "Error checking path %s: %s (%d)\n",
39 path, strerror(errno), errno); 39 path, strerror(errno), errno);
40 return 0; 40 return 0;
41 } 41 }
42 if (!S_ISREG(st.st_mode)) 42 if (!S_ISREG(st.st_mode))
43 return 0; 43 return 0;
44 44
45 return 1; 45 return 1;
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;
60 char *p; 68 char *p;
61 size_t size; 69 size_t size;
62 70
63 if (stat(path, &st)) { 71 if (stat(path, &st)) {
64 fprintf(stderr, "Error accessing %s: %s (%d)\n", 72 fprintf(stderr, "Error accessing %s: %s (%d)\n",
65 path, strerror(errno), errno); 73 path, strerror(errno), errno);
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);
79 86
80 if (!strcmp(p + strlen(p) - 5, "/.git")) 87 if (!strcmp(p + strlen(p) - 5, "/.git"))
81 p[strlen(p) - 5] = '\0'; 88 p[strlen(p) - 5] = '\0';
82 89
83 repo = cgit_add_repo(xstrdup(p)); 90 repo = cgit_add_repo(xstrdup(p));
84 if (ctx.cfg.remove_suffix) 91 if (ctx.cfg.remove_suffix)
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);
97 112
98 p = fmt("%s/README.html", path); 113 p = fmt("%s/README.html", path);
99 if (!stat(p, &st)) 114 if (!stat(p, &st))
100 repo->readme = "README.html"; 115 repo->readme = "README.html";
101 116
102 p = fmt("%s/cgitrc", path); 117 p = fmt("%s/cgitrc", path);
103 if (!stat(p, &st)) { 118 if (!stat(p, &st)) {
104 config_fn = fn; 119 config_fn = fn;