summaryrefslogtreecommitdiffabout
authorJason A. Donenfeld <Jason@zx2c4.com>2010-07-29 17:47:50 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-08-04 01:09:32 (UTC)
commit2e4a941626c240bc7858aa7564882c01f657f4e8 (patch) (unidiff)
tree505c17fab5afcb99cfddf2c4aad0b95c8670f001
parent3516502aa0df95ecc241caa30161741f59e4e600 (diff)
downloadcgit-2e4a941626c240bc7858aa7564882c01f657f4e8.zip
cgit-2e4a941626c240bc7858aa7564882c01f657f4e8.tar.gz
cgit-2e4a941626c240bc7858aa7564882c01f657f4e8.tar.bz2
Add support for 'remove-suffix' option
When this option is enabled, the '.git' suffix of repository directories found while processing the 'scan-path' option will be removed. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c3
-rw-r--r--cgit.h1
-rw-r--r--cgitrc.5.txt6
-rw-r--r--scan-tree.c3
4 files changed, 13 insertions, 0 deletions
diff --git a/cgit.c b/cgit.c
index 2364d1c..f9a42bb 100644
--- a/cgit.c
+++ b/cgit.c
@@ -184,48 +184,50 @@ void config_cb(const char *name, const char *value)
184 else if (!strcmp(name, "project-list")) 184 else if (!strcmp(name, "project-list"))
185 ctx.cfg.project_list = xstrdup(expand_macros(value)); 185 ctx.cfg.project_list = xstrdup(expand_macros(value));
186 else if (!strcmp(name, "scan-path")) 186 else if (!strcmp(name, "scan-path"))
187 if (!ctx.cfg.nocache && ctx.cfg.cache_size) 187 if (!ctx.cfg.nocache && ctx.cfg.cache_size)
188 process_cached_repolist(expand_macros(value)); 188 process_cached_repolist(expand_macros(value));
189 else if (ctx.cfg.project_list) 189 else if (ctx.cfg.project_list)
190 scan_projects(expand_macros(value), 190 scan_projects(expand_macros(value),
191 ctx.cfg.project_list, repo_config); 191 ctx.cfg.project_list, repo_config);
192 else 192 else
193 scan_tree(expand_macros(value), repo_config); 193 scan_tree(expand_macros(value), repo_config);
194 else if (!strcmp(name, "source-filter")) 194 else if (!strcmp(name, "source-filter"))
195 ctx.cfg.source_filter = new_filter(value, 1); 195 ctx.cfg.source_filter = new_filter(value, 1);
196 else if (!strcmp(name, "summary-log")) 196 else if (!strcmp(name, "summary-log"))
197 ctx.cfg.summary_log = atoi(value); 197 ctx.cfg.summary_log = atoi(value);
198 else if (!strcmp(name, "summary-branches")) 198 else if (!strcmp(name, "summary-branches"))
199 ctx.cfg.summary_branches = atoi(value); 199 ctx.cfg.summary_branches = atoi(value);
200 else if (!strcmp(name, "summary-tags")) 200 else if (!strcmp(name, "summary-tags"))
201 ctx.cfg.summary_tags = atoi(value); 201 ctx.cfg.summary_tags = atoi(value);
202 else if (!strcmp(name, "side-by-side-diffs")) 202 else if (!strcmp(name, "side-by-side-diffs"))
203 ctx.cfg.ssdiff = atoi(value); 203 ctx.cfg.ssdiff = atoi(value);
204 else if (!strcmp(name, "agefile")) 204 else if (!strcmp(name, "agefile"))
205 ctx.cfg.agefile = xstrdup(value); 205 ctx.cfg.agefile = xstrdup(value);
206 else if (!strcmp(name, "renamelimit")) 206 else if (!strcmp(name, "renamelimit"))
207 ctx.cfg.renamelimit = atoi(value); 207 ctx.cfg.renamelimit = atoi(value);
208 else if (!strcmp(name, "remove-suffix"))
209 ctx.cfg.remove_suffix = atoi(value);
208 else if (!strcmp(name, "robots")) 210 else if (!strcmp(name, "robots"))
209 ctx.cfg.robots = xstrdup(value); 211 ctx.cfg.robots = xstrdup(value);
210 else if (!strcmp(name, "clone-prefix")) 212 else if (!strcmp(name, "clone-prefix"))
211 ctx.cfg.clone_prefix = xstrdup(value); 213 ctx.cfg.clone_prefix = xstrdup(value);
212 else if (!strcmp(name, "local-time")) 214 else if (!strcmp(name, "local-time"))
213 ctx.cfg.local_time = atoi(value); 215 ctx.cfg.local_time = atoi(value);
214 else if (!prefixcmp(name, "mimetype.")) 216 else if (!prefixcmp(name, "mimetype."))
215 add_mimetype(name + 9, value); 217 add_mimetype(name + 9, value);
216 else if (!strcmp(name, "include")) 218 else if (!strcmp(name, "include"))
217 parse_configfile(expand_macros(value), config_cb); 219 parse_configfile(expand_macros(value), config_cb);
218} 220}
219 221
220static void querystring_cb(const char *name, const char *value) 222static void querystring_cb(const char *name, const char *value)
221{ 223{
222 if (!value) 224 if (!value)
223 value = ""; 225 value = "";
224 226
225 if (!strcmp(name,"r")) { 227 if (!strcmp(name,"r")) {
226 ctx.qry.repo = xstrdup(value); 228 ctx.qry.repo = xstrdup(value);
227 ctx.repo = cgit_get_repoinfo(value); 229 ctx.repo = cgit_get_repoinfo(value);
228 } else if (!strcmp(name, "p")) { 230 } else if (!strcmp(name, "p")) {
229 ctx.qry.page = xstrdup(value); 231 ctx.qry.page = xstrdup(value);
230 } else if (!strcmp(name, "url")) { 232 } else if (!strcmp(name, "url")) {
231 if (*value == '/') 233 if (*value == '/')
@@ -281,48 +283,49 @@ static void prepare_context(struct cgit_context *ctx)
281 ctx->cfg.agefile = "info/web/last-modified"; 283 ctx->cfg.agefile = "info/web/last-modified";
282 ctx->cfg.nocache = 0; 284 ctx->cfg.nocache = 0;
283 ctx->cfg.cache_size = 0; 285 ctx->cfg.cache_size = 0;
284 ctx->cfg.cache_dynamic_ttl = 5; 286 ctx->cfg.cache_dynamic_ttl = 5;
285 ctx->cfg.cache_max_create_time = 5; 287 ctx->cfg.cache_max_create_time = 5;
286 ctx->cfg.cache_repo_ttl = 5; 288 ctx->cfg.cache_repo_ttl = 5;
287 ctx->cfg.cache_root = CGIT_CACHE_ROOT; 289 ctx->cfg.cache_root = CGIT_CACHE_ROOT;
288 ctx->cfg.cache_root_ttl = 5; 290 ctx->cfg.cache_root_ttl = 5;
289 ctx->cfg.cache_scanrc_ttl = 15; 291 ctx->cfg.cache_scanrc_ttl = 15;
290 ctx->cfg.cache_static_ttl = -1; 292 ctx->cfg.cache_static_ttl = -1;
291 ctx->cfg.css = "/cgit.css"; 293 ctx->cfg.css = "/cgit.css";
292 ctx->cfg.logo = "/cgit.png"; 294 ctx->cfg.logo = "/cgit.png";
293 ctx->cfg.local_time = 0; 295 ctx->cfg.local_time = 0;
294 ctx->cfg.enable_tree_linenumbers = 1; 296 ctx->cfg.enable_tree_linenumbers = 1;
295 ctx->cfg.max_repo_count = 50; 297 ctx->cfg.max_repo_count = 50;
296 ctx->cfg.max_commit_count = 50; 298 ctx->cfg.max_commit_count = 50;
297 ctx->cfg.max_lock_attempts = 5; 299 ctx->cfg.max_lock_attempts = 5;
298 ctx->cfg.max_msg_len = 80; 300 ctx->cfg.max_msg_len = 80;
299 ctx->cfg.max_repodesc_len = 80; 301 ctx->cfg.max_repodesc_len = 80;
300 ctx->cfg.max_blob_size = 0; 302 ctx->cfg.max_blob_size = 0;
301 ctx->cfg.max_stats = 0; 303 ctx->cfg.max_stats = 0;
302 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 304 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
303 ctx->cfg.project_list = NULL; 305 ctx->cfg.project_list = NULL;
304 ctx->cfg.renamelimit = -1; 306 ctx->cfg.renamelimit = -1;
307 ctx->cfg.remove_suffix = 0;
305 ctx->cfg.robots = "index, nofollow"; 308 ctx->cfg.robots = "index, nofollow";
306 ctx->cfg.root_title = "Git repository browser"; 309 ctx->cfg.root_title = "Git repository browser";
307 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 310 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
308 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 311 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
309 ctx->cfg.section = ""; 312 ctx->cfg.section = "";
310 ctx->cfg.summary_branches = 10; 313 ctx->cfg.summary_branches = 10;
311 ctx->cfg.summary_log = 10; 314 ctx->cfg.summary_log = 10;
312 ctx->cfg.summary_tags = 10; 315 ctx->cfg.summary_tags = 10;
313 ctx->cfg.max_atom_items = 10; 316 ctx->cfg.max_atom_items = 10;
314 ctx->cfg.ssdiff = 0; 317 ctx->cfg.ssdiff = 0;
315 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG")); 318 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
316 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST")); 319 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
317 ctx->env.https = xstrdupn(getenv("HTTPS")); 320 ctx->env.https = xstrdupn(getenv("HTTPS"));
318 ctx->env.no_http = xstrdupn(getenv("NO_HTTP")); 321 ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
319 ctx->env.path_info = xstrdupn(getenv("PATH_INFO")); 322 ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
320 ctx->env.query_string = xstrdupn(getenv("QUERY_STRING")); 323 ctx->env.query_string = xstrdupn(getenv("QUERY_STRING"));
321 ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD")); 324 ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD"));
322 ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME")); 325 ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME"));
323 ctx->env.server_name = xstrdupn(getenv("SERVER_NAME")); 326 ctx->env.server_name = xstrdupn(getenv("SERVER_NAME"));
324 ctx->env.server_port = xstrdupn(getenv("SERVER_PORT")); 327 ctx->env.server_port = xstrdupn(getenv("SERVER_PORT"));
325 ctx->page.mimetype = "text/html"; 328 ctx->page.mimetype = "text/html";
326 ctx->page.charset = PAGE_ENCODING; 329 ctx->page.charset = PAGE_ENCODING;
327 ctx->page.filename = NULL; 330 ctx->page.filename = NULL;
328 ctx->page.size = 0; 331 ctx->page.size = 0;
diff --git a/cgit.h b/cgit.h
index 4591f8c..ada8535 100644
--- a/cgit.h
+++ b/cgit.h
@@ -181,48 +181,49 @@ struct cgit_config {
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_index_links; 186 int enable_index_links;
187 int enable_log_filecount; 187 int enable_log_filecount;
188 int enable_log_linecount; 188 int enable_log_linecount;
189 int enable_remote_branches; 189 int enable_remote_branches;
190 int enable_subject_links; 190 int enable_subject_links;
191 int enable_tree_linenumbers; 191 int enable_tree_linenumbers;
192 int local_time; 192 int local_time;
193 int max_atom_items; 193 int max_atom_items;
194 int max_repo_count; 194 int max_repo_count;
195 int max_commit_count; 195 int max_commit_count;
196 int max_lock_attempts; 196 int max_lock_attempts;
197 int max_msg_len; 197 int max_msg_len;
198 int max_repodesc_len; 198 int max_repodesc_len;
199 int max_blob_size; 199 int max_blob_size;
200 int max_stats; 200 int max_stats;
201 int nocache; 201 int nocache;
202 int noplainemail; 202 int noplainemail;
203 int noheader; 203 int noheader;
204 int renamelimit; 204 int renamelimit;
205 int remove_suffix;
205 int snapshots; 206 int snapshots;
206 int summary_branches; 207 int summary_branches;
207 int summary_log; 208 int summary_log;
208 int summary_tags; 209 int summary_tags;
209 int ssdiff; 210 int ssdiff;
210 struct string_list mimetypes; 211 struct string_list mimetypes;
211 struct cgit_filter *about_filter; 212 struct cgit_filter *about_filter;
212 struct cgit_filter *commit_filter; 213 struct cgit_filter *commit_filter;
213 struct cgit_filter *source_filter; 214 struct cgit_filter *source_filter;
214}; 215};
215 216
216struct cgit_page { 217struct cgit_page {
217 time_t modified; 218 time_t modified;
218 time_t expires; 219 time_t expires;
219 size_t size; 220 size_t size;
220 char *mimetype; 221 char *mimetype;
221 char *charset; 222 char *charset;
222 char *filename; 223 char *filename;
223 char *etag; 224 char *etag;
224 char *title; 225 char *title;
225 int status; 226 int status;
226 char *statusmsg; 227 char *statusmsg;
227}; 228};
228 229
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index ec004d4..6fb1083 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -208,48 +208,53 @@ mimetype.<ext>::
208module-link:: 208module-link::
209 Text which will be used as the formatstring for a hyperlink when a 209 Text which will be used as the formatstring for a hyperlink when a
210 submodule is printed in a directory listing. The arguments for the 210 submodule is printed in a directory listing. The arguments for the
211 formatstring are the path and SHA1 of the submodule commit. Default 211 formatstring are the path and SHA1 of the submodule commit. Default
212 value: "./?repo=%s&page=commit&id=%s" 212 value: "./?repo=%s&page=commit&id=%s"
213 213
214nocache:: 214nocache::
215 If set to the value "1" caching will be disabled. This settings is 215 If set to the value "1" caching will be disabled. This settings is
216 deprecated, and will not be honored starting with cgit-1.0. Default 216 deprecated, and will not be honored starting with cgit-1.0. Default
217 value: "0". 217 value: "0".
218 218
219noplainemail:: 219noplainemail::
220 If set to "1" showing full author email adresses will be disabled. 220 If set to "1" showing full author email adresses will be disabled.
221 Default value: "0". 221 Default value: "0".
222 222
223noheader:: 223noheader::
224 Flag which, when set to "1", will make cgit omit the standard header 224 Flag which, when set to "1", will make cgit omit the standard header
225 on all pages. Default value: none. See also: "embedded". 225 on all pages. Default value: none. See also: "embedded".
226 226
227project-list:: 227project-list::
228 A list of subdirectories inside of scan-path, relative to it, that 228 A list of subdirectories inside of scan-path, relative to it, that
229 should loaded as git repositories. This must be defined prior to 229 should loaded as git repositories. This must be defined prior to
230 scan-path. Default value: none. See also: scan-path. 230 scan-path. Default value: none. See also: scan-path.
231 231
232remove-suffix::
233 If set to "1" and scan-path is enabled, if any repositories are found
234 with a suffix of ".git", this suffix will be removed for the url and
235 name. Default value: "0". See also: scan-path.
236
232renamelimit:: 237renamelimit::
233 Maximum number of files to consider when detecting renames. The value 238 Maximum number of files to consider when detecting renames. The value
234 "-1" uses the compiletime value in git (for further info, look at 239 "-1" uses the compiletime value in git (for further info, look at
235 `man git-diff`). Default value: "-1". 240 `man git-diff`). Default value: "-1".
236 241
237repo.group:: 242repo.group::
238 Legacy alias for "section". This option is deprecated and will not be 243 Legacy alias for "section". This option is deprecated and will not be
239 supported in cgit-1.0. 244 supported in cgit-1.0.
240 245
241robots:: 246robots::
242 Text used as content for the "robots" meta-tag. Default value: 247 Text used as content for the "robots" meta-tag. Default value:
243 "index, nofollow". 248 "index, nofollow".
244 249
245root-desc:: 250root-desc::
246 Text printed below the heading on the repository index page. Default 251 Text printed below the heading on the repository index page. Default
247 value: "a fast webinterface for the git dscm". 252 value: "a fast webinterface for the git dscm".
248 253
249root-readme:: 254root-readme::
250 The content of the file specified with this option will be included 255 The content of the file specified with this option will be included
251 verbatim below the "about" link on the repository index page. Default 256 verbatim below the "about" link on the repository index page. Default
252 value: none. 257 value: none.
253 258
254root-title:: 259root-title::
255 Text printed as heading on the repository index page. Default value: 260 Text printed as heading on the repository index page. Default value:
@@ -517,24 +522,25 @@ repo.snapshots=0
517# Disable line-counts for this repo 522# Disable line-counts for this repo
518repo.enable-log-linecount=0 523repo.enable-log-linecount=0
519 524
520# Restrict the max statistics period for this repo 525# Restrict the max statistics period for this repo
521repo.max-stats=month 526repo.max-stats=month
522.... 527....
523 528
524 529
525BUGS 530BUGS
526---- 531----
527Comments currently cannot appear on the same line as a setting; the comment 532Comments currently cannot appear on the same line as a setting; the comment
528will be included as part of the value. E.g. this line: 533will be included as part of the value. E.g. this line:
529 534
530 robots=index # allow indexing 535 robots=index # allow indexing
531 536
532will generate the following html element: 537will generate the following html element:
533 538
534 <meta name='robots' content='index # allow indexing'/> 539 <meta name='robots' content='index # allow indexing'/>
535 540
536 541
537 542
538AUTHOR 543AUTHOR
539------ 544------
540Lars Hjemli <hjemli@gmail.com> 545Lars Hjemli <hjemli@gmail.com>
546Jason A. Donenfeld <Jason@zx2c4.com>
diff --git a/scan-tree.c b/scan-tree.c
index 9bf9b38..a83a78c 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -60,48 +60,51 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
60 char *p; 60 char *p;
61 size_t size; 61 size_t size;
62 62
63 if (stat(path, &st)) { 63 if (stat(path, &st)) {
64 fprintf(stderr, "Error accessing %s: %s (%d)\n", 64 fprintf(stderr, "Error accessing %s: %s (%d)\n",
65 path, strerror(errno), errno); 65 path, strerror(errno), errno);
66 return; 66 return;
67 } 67 }
68 if (!stat(fmt("%s/noweb", path), &st)) 68 if (!stat(fmt("%s/noweb", path), &st))
69 return; 69 return;
70 if ((pwd = getpwuid(st.st_uid)) == NULL) { 70 if ((pwd = getpwuid(st.st_uid)) == NULL) {
71 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", 71 fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",
72 path, strerror(errno), errno); 72 path, strerror(errno), errno);
73 return; 73 return;
74 } 74 }
75 if (base == path) 75 if (base == path)
76 p = fmt("%s", path); 76 p = fmt("%s", path);
77 else 77 else
78 p = fmt("%s", path + strlen(base) + 1); 78 p = fmt("%s", path + strlen(base) + 1);
79 79
80 if (!strcmp(p + strlen(p) - 5, "/.git")) 80 if (!strcmp(p + strlen(p) - 5, "/.git"))
81 p[strlen(p) - 5] = '\0'; 81 p[strlen(p) - 5] = '\0';
82 82
83 repo = cgit_add_repo(xstrdup(p)); 83 repo = cgit_add_repo(xstrdup(p));
84 if (ctx.cfg.remove_suffix)
85 if ((p = strrchr(repo->url, '.')) && !strcmp(p, ".git"))
86 *p = '\0';
84 repo->name = repo->url; 87 repo->name = repo->url;
85 repo->path = xstrdup(path); 88 repo->path = xstrdup(path);
86 p = (pwd && pwd->pw_gecos) ? strchr(pwd->pw_gecos, ',') : NULL; 89 p = (pwd && pwd->pw_gecos) ? strchr(pwd->pw_gecos, ',') : NULL;
87 if (p) 90 if (p)
88 *p = '\0'; 91 *p = '\0';
89 repo->owner = (pwd ? xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name) : ""); 92 repo->owner = (pwd ? xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name) : "");
90 93
91 p = fmt("%s/description", path); 94 p = fmt("%s/description", path);
92 if (!stat(p, &st)) 95 if (!stat(p, &st))
93 readfile(p, &repo->desc, &size); 96 readfile(p, &repo->desc, &size);
94 97
95 p = fmt("%s/README.html", path); 98 p = fmt("%s/README.html", path);
96 if (!stat(p, &st)) 99 if (!stat(p, &st))
97 repo->readme = "README.html"; 100 repo->readme = "README.html";
98 101
99 p = fmt("%s/cgitrc", path); 102 p = fmt("%s/cgitrc", path);
100 if (!stat(p, &st)) { 103 if (!stat(p, &st)) {
101 config_fn = fn; 104 config_fn = fn;
102 parse_configfile(xstrdup(p), &repo_config); 105 parse_configfile(xstrdup(p), &repo_config);
103 } 106 }
104} 107}
105 108
106static void scan_path(const char *base, const char *path, repo_config_fn fn) 109static void scan_path(const char *base, const char *path, repo_config_fn fn)
107{ 110{