aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--cgit.c42
-rw-r--r--cgit.css27
-rw-r--r--cgit.h8
-rw-r--r--cgitrc.5.txt67
-rw-r--r--cmd.c44
-rw-r--r--cmd.h3
-rwxr-xr-xfilters/commit-links.sh18
-rwxr-xr-xfilters/syntax-highlighting.sh11
-rw-r--r--html.c8
-rw-r--r--html.h1
-rw-r--r--shared.c29
-rwxr-xr-xtests/setup.sh1
-rwxr-xr-xtests/t0102-summary.sh6
-rw-r--r--ui-commit.c10
-rw-r--r--ui-diff.c83
-rw-r--r--ui-diff.h4
-rw-r--r--ui-log.c29
-rw-r--r--ui-repolist.c15
-rw-r--r--ui-stats.c51
-rw-r--r--ui-summary.c2
21 files changed, 341 insertions, 124 deletions
diff --git a/Makefile b/Makefile
index 3ddd728..30f7575 100644
--- a/Makefile
+++ b/Makefile
@@ -198,9 +198,9 @@ install-pdf: doc-pdf
198 $(INSTALL) -m 0644 $(DOC_PDF) $(DESTDIR)$(pdfdir) 198 $(INSTALL) -m 0644 $(DOC_PDF) $(DESTDIR)$(pdfdir)
199 199
200uninstall: 200uninstall:
201 rm -f $(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) 201 rm -f $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
202 rm -f $(CGIT_DATA_PATH)/cgit.css 202 rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css
203 rm -f $(CGIT_DATA_PATH)/cgit.png 203 rm -f $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png
204 204
205uninstall-doc: uninstall-man uninstall-html uninstall-pdf 205uninstall-doc: uninstall-man uninstall-html uninstall-pdf
206 206
diff --git a/cgit.c b/cgit.c
index 435ce5a..1d50129 100644
--- a/cgit.c
+++ b/cgit.c
@@ -26,14 +26,27 @@ void add_mimetype(const char *name, const char *value)
26 item->util = xstrdup(value); 26 item->util = xstrdup(value);
27} 27}
28 28
29struct cgit_filter *new_filter(const char *cmd, int extra_args) 29struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
30{ 30{
31 struct cgit_filter *f; 31 struct cgit_filter *f;
32 int args_size = 0; 32 int args_size = 0;
33 int extra_args;
33 34
34 if (!cmd || !cmd[0]) 35 if (!cmd || !cmd[0])
35 return NULL; 36 return NULL;
36 37
38 switch (filtertype) {
39 case SOURCE:
40 extra_args = 1;
41 break;
42
43 case ABOUT:
44 case COMMIT:
45 default:
46 extra_args = 0;
47 break;
48 }
49
37 f = xmalloc(sizeof(struct cgit_filter)); 50 f = xmalloc(sizeof(struct cgit_filter));
38 f->cmd = xstrdup(cmd); 51 f->cmd = xstrdup(cmd);
39 args_size = (2 + extra_args) * sizeof(char *); 52 args_size = (2 + extra_args) * sizeof(char *);
@@ -83,11 +96,11 @@ void repo_config(struct cgit_repo *repo, const char *name, const char *value)
83 repo->logo_link = xstrdup(value); 96 repo->logo_link = xstrdup(value);
84 else if (ctx.cfg.enable_filter_overrides) { 97 else if (ctx.cfg.enable_filter_overrides) {
85 if (!strcmp(name, "about-filter")) 98 if (!strcmp(name, "about-filter"))
86 repo->about_filter = new_filter(value, 0); 99 repo->about_filter = new_filter(value, ABOUT);
87 else if (!strcmp(name, "commit-filter")) 100 else if (!strcmp(name, "commit-filter"))
88 repo->commit_filter = new_filter(value, 0); 101 repo->commit_filter = new_filter(value, COMMIT);
89 else if (!strcmp(name, "source-filter")) 102 else if (!strcmp(name, "source-filter"))
90 repo->source_filter = new_filter(value, 1); 103 repo->source_filter = new_filter(value, SOURCE);
91 } 104 }
92} 105}
93 106
@@ -147,6 +160,8 @@ void config_cb(const char *name, const char *value)
147 ctx.cfg.enable_filter_overrides = atoi(value); 160 ctx.cfg.enable_filter_overrides = atoi(value);
148 else if (!strcmp(name, "enable-gitweb-owner")) 161 else if (!strcmp(name, "enable-gitweb-owner"))
149 ctx.cfg.enable_gitweb_owner = atoi(value); 162 ctx.cfg.enable_gitweb_owner = atoi(value);
163 else if (!strcmp(name, "enable-http-clone"))
164 ctx.cfg.enable_http_clone = atoi(value);
150 else if (!strcmp(name, "enable-index-links")) 165 else if (!strcmp(name, "enable-index-links"))
151 ctx.cfg.enable_index_links = atoi(value); 166 ctx.cfg.enable_index_links = atoi(value);
152 else if (!strcmp(name, "enable-commit-graph")) 167 else if (!strcmp(name, "enable-commit-graph"))
@@ -178,9 +193,9 @@ void config_cb(const char *name, const char *value)
178 else if (!strcmp(name, "cache-dynamic-ttl")) 193 else if (!strcmp(name, "cache-dynamic-ttl"))
179 ctx.cfg.cache_dynamic_ttl = atoi(value); 194 ctx.cfg.cache_dynamic_ttl = atoi(value);
180 else if (!strcmp(name, "about-filter")) 195 else if (!strcmp(name, "about-filter"))
181 ctx.cfg.about_filter = new_filter(value, 0); 196 ctx.cfg.about_filter = new_filter(value, ABOUT);
182 else if (!strcmp(name, "commit-filter")) 197 else if (!strcmp(name, "commit-filter"))
183 ctx.cfg.commit_filter = new_filter(value, 0); 198 ctx.cfg.commit_filter = new_filter(value, COMMIT);
184 else if (!strcmp(name, "embedded")) 199 else if (!strcmp(name, "embedded"))
185 ctx.cfg.embedded = atoi(value); 200 ctx.cfg.embedded = atoi(value);
186 else if (!strcmp(name, "max-atom-items")) 201 else if (!strcmp(name, "max-atom-items"))
@@ -210,7 +225,7 @@ void config_cb(const char *name, const char *value)
210 else if (!strcmp(name, "section-from-path")) 225 else if (!strcmp(name, "section-from-path"))
211 ctx.cfg.section_from_path = atoi(value); 226 ctx.cfg.section_from_path = atoi(value);
212 else if (!strcmp(name, "source-filter")) 227 else if (!strcmp(name, "source-filter"))
213 ctx.cfg.source_filter = new_filter(value, 1); 228 ctx.cfg.source_filter = new_filter(value, SOURCE);
214 else if (!strcmp(name, "summary-log")) 229 else if (!strcmp(name, "summary-log"))
215 ctx.cfg.summary_log = atoi(value); 230 ctx.cfg.summary_log = atoi(value);
216 else if (!strcmp(name, "summary-branches")) 231 else if (!strcmp(name, "summary-branches"))
@@ -229,6 +244,8 @@ void config_cb(const char *name, const char *value)
229 ctx.cfg.robots = xstrdup(value); 244 ctx.cfg.robots = xstrdup(value);
230 else if (!strcmp(name, "clone-prefix")) 245 else if (!strcmp(name, "clone-prefix"))
231 ctx.cfg.clone_prefix = xstrdup(value); 246 ctx.cfg.clone_prefix = xstrdup(value);
247 else if (!strcmp(name, "clone-url"))
248 ctx.cfg.clone_url = xstrdup(value);
232 else if (!strcmp(name, "local-time")) 249 else if (!strcmp(name, "local-time"))
233 ctx.cfg.local_time = atoi(value); 250 ctx.cfg.local_time = atoi(value);
234 else if (!prefixcmp(name, "mimetype.")) 251 else if (!prefixcmp(name, "mimetype."))
@@ -313,6 +330,7 @@ static void prepare_context(struct cgit_context *ctx)
313 ctx->cfg.logo = "/cgit.png"; 330 ctx->cfg.logo = "/cgit.png";
314 ctx->cfg.local_time = 0; 331 ctx->cfg.local_time = 0;
315 ctx->cfg.enable_gitweb_owner = 1; 332 ctx->cfg.enable_gitweb_owner = 1;
333 ctx->cfg.enable_http_clone = 1;
316 ctx->cfg.enable_tree_linenumbers = 1; 334 ctx->cfg.enable_tree_linenumbers = 1;
317 ctx->cfg.max_repo_count = 50; 335 ctx->cfg.max_repo_count = 50;
318 ctx->cfg.max_commit_count = 50; 336 ctx->cfg.max_commit_count = 50;
@@ -444,7 +462,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
444 tmp = xstrdup(ctx->qry.head); 462 tmp = xstrdup(ctx->qry.head);
445 ctx->qry.head = ctx->repo->defbranch; 463 ctx->qry.head = ctx->repo->defbranch;
446 ctx->page.status = 404; 464 ctx->page.status = 404;
447 ctx->page.statusmsg = "not found"; 465 ctx->page.statusmsg = "Not found";
448 cgit_print_http_headers(ctx); 466 cgit_print_http_headers(ctx);
449 cgit_print_docstart(ctx); 467 cgit_print_docstart(ctx);
450 cgit_print_pageheader(ctx); 468 cgit_print_pageheader(ctx);
@@ -452,6 +470,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
452 cgit_print_docend(); 470 cgit_print_docend();
453 return 1; 471 return 1;
454 } 472 }
473 cgit_prepare_repo_env(ctx->repo);
455 return 0; 474 return 0;
456} 475}
457 476
@@ -463,6 +482,8 @@ static void process_request(void *cbdata)
463 cmd = cgit_get_cmd(ctx); 482 cmd = cgit_get_cmd(ctx);
464 if (!cmd) { 483 if (!cmd) {
465 ctx->page.title = "cgit error"; 484 ctx->page.title = "cgit error";
485 ctx->page.status = 404;
486 ctx->page.statusmsg = "Not found";
466 cgit_print_http_headers(ctx); 487 cgit_print_http_headers(ctx);
467 cgit_print_docstart(ctx); 488 cgit_print_docstart(ctx);
468 cgit_print_pageheader(ctx); 489 cgit_print_pageheader(ctx);
@@ -471,6 +492,11 @@ static void process_request(void *cbdata)
471 return; 492 return;
472 } 493 }
473 494
495 if (!ctx->cfg.enable_http_clone && cmd->is_clone) {
496 html_status(404, "Not found", 0);
497 return;
498 }
499
474 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual" 500 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual"
475 * in-project path limit to be made available at ctx->qry.vpath. 501 * in-project path limit to be made available at ctx->qry.vpath.
476 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL). 502 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL).
diff --git a/cgit.css b/cgit.css
index 1d90057..55afa94 100644
--- a/cgit.css
+++ b/cgit.css
@@ -331,6 +331,33 @@ table.commit-info {
331 margin-top: 1.5em; 331 margin-top: 1.5em;
332} 332}
333 333
334div.cgit-panel {
335 float: right;
336 margin-top: 1.5em;
337}
338
339div.cgit-panel table {
340 border-collapse: collapse;
341 border: solid 1px #aaa;
342 background-color: #eee;
343}
344
345div.cgit-panel th {
346 text-align: center;
347}
348
349div.cgit-panel td {
350 padding: 0.25em 0.5em;
351}
352
353div.cgit-panel td.label {
354 padding-right: 0.5em;
355}
356
357div.cgit-panel td.ctrl {
358 padding-left: 0.5em;
359}
360
334table.commit-info th { 361table.commit-info th {
335 text-align: left; 362 text-align: left;
336 font-weight: normal; 363 font-weight: normal;
diff --git a/cgit.h b/cgit.h
index 63847ff..c7ab5c6 100644
--- a/cgit.h
+++ b/cgit.h
@@ -51,6 +51,10 @@ typedef void (*configfn)(const char *name, const char *value);
51typedef void (*filepair_fn)(struct diff_filepair *pair); 51typedef void (*filepair_fn)(struct diff_filepair *pair);
52typedef void (*linediff_fn)(char *line, int len); 52typedef void (*linediff_fn)(char *line, int len);
53 53
54typedef enum {
55 ABOUT, COMMIT, SOURCE
56} filter_type;
57
54struct cgit_filter { 58struct cgit_filter {
55 char *cmd; 59 char *cmd;
56 char **argv; 60 char **argv;
@@ -162,6 +166,7 @@ struct cgit_config {
162 char *agefile; 166 char *agefile;
163 char *cache_root; 167 char *cache_root;
164 char *clone_prefix; 168 char *clone_prefix;
169 char *clone_url;
165 char *css; 170 char *css;
166 char *favicon; 171 char *favicon;
167 char *footer; 172 char *footer;
@@ -192,6 +197,7 @@ struct cgit_config {
192 int embedded; 197 int embedded;
193 int enable_filter_overrides; 198 int enable_filter_overrides;
194 int enable_gitweb_owner; 199 int enable_gitweb_owner;
200 int enable_http_clone;
195 int enable_index_links; 201 int enable_index_links;
196 int enable_commit_graph; 202 int enable_commit_graph;
197 int enable_log_filecount; 203 int enable_log_filecount;
@@ -318,6 +324,8 @@ extern int cgit_parse_snapshots_mask(const char *str);
318extern int cgit_open_filter(struct cgit_filter *filter); 324extern int cgit_open_filter(struct cgit_filter *filter);
319extern int cgit_close_filter(struct cgit_filter *filter); 325extern int cgit_close_filter(struct cgit_filter *filter);
320 326
327extern void cgit_prepare_repo_env(struct cgit_repo * repo);
328
321extern int readfile(const char *path, char **buf, size_t *size); 329extern int readfile(const char *path, char **buf, size_t *size);
322 330
323extern char *expand_macros(const char *txt); 331extern char *expand_macros(const char *txt);
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 26c4bfc..a22423b 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -31,7 +31,7 @@ about-filter::
31 about pages (both top-level and for each repository). The command will 31 about pages (both top-level and for each repository). The command will
32 get the content of the about-file on its STDIN, and the STDOUT from the 32 get the content of the about-file on its STDIN, and the STDOUT from the
33 command will be included verbatim on the about page. Default value: 33 command will be included verbatim on the about page. Default value:
34 none. 34 none. See also: "FILTER API".
35 35
36agefile:: 36agefile::
37 Specifies a path, relative to each repository path, which can be used 37 Specifies a path, relative to each repository path, which can be used
@@ -76,11 +76,17 @@ clone-prefix::
76 setting is only used if `repo.clone-url` is unspecified. Default value: 76 setting is only used if `repo.clone-url` is unspecified. Default value:
77 none. 77 none.
78 78
79clone-url::
80 Space-separated list of clone-url templates. This setting is only
81 used if `repo.clone-url` is unspecified. Default value: none. See
82 also: "MACRO EXPANSION", "FILTER API".
83
79commit-filter:: 84commit-filter::
80 Specifies a command which will be invoked to format commit messages. 85 Specifies a command which will be invoked to format commit messages.
81 The command will get the message on its STDIN, and the STDOUT from the 86 The command will get the message on its STDIN, and the STDOUT from the
82 command will be included verbatim as the commit message, i.e. this can 87 command will be included verbatim as the commit message, i.e. this can
83 be used to implement bugtracker integration. Default value: none. 88 be used to implement bugtracker integration. Default value: none.
89 See also: "FILTER API".
84 90
85css:: 91css::
86 Url which specifies the css document to include in all cgit pages. 92 Url which specifies the css document to include in all cgit pages.
@@ -105,6 +111,11 @@ enable-gitweb-owner::
105 for the git config value "gitweb.owner" to determine the owner. 111 for the git config value "gitweb.owner" to determine the owner.
106 Default value: "1". See also: scan-path. 112 Default value: "1". See also: scan-path.
107 113
114enable-http-clone::
115 If set to "1", cgit will act as an dumb HTTP endpoint for git clones.
116 If you use an alternate way of serving git repositories, you may wish
117 to disable this. Default value: "1".
118
108enable-index-links:: 119enable-index-links::
109 Flag which, when set to "1", will make cgit generate extra links for 120 Flag which, when set to "1", will make cgit generate extra links for
110 each repo in the repository index (specifically, to the "summary", 121 each repo in the repository index (specifically, to the "summary",
@@ -320,7 +331,7 @@ source-filter::
320 and the name of the blob as its only command line argument. The STDOUT 331 and the name of the blob as its only command line argument. The STDOUT
321 from the command will be included verbatim as the blob contents, i.e. 332 from the command will be included verbatim as the blob contents, i.e.
322 this can be used to implement e.g. syntax highlighting. Default value: 333 this can be used to implement e.g. syntax highlighting. Default value:
323 none. 334 none. See also: "FILTER API".
324 335
325summary-branches:: 336summary-branches::
326 Specifies the number of branches to display in the repository "summary" 337 Specifies the number of branches to display in the repository "summary"
@@ -353,15 +364,15 @@ REPOSITORY SETTINGS
353------------------- 364-------------------
354repo.about-filter:: 365repo.about-filter::
355 Override the default about-filter. Default value: none. See also: 366 Override the default about-filter. Default value: none. See also:
356 "enable-filter-overrides". 367 "enable-filter-overrides". See also: "FILTER API".
357 368
358repo.clone-url:: 369repo.clone-url::
359 A list of space-separated urls which can be used to clone this repo. 370 A list of space-separated urls which can be used to clone this repo.
360 Default value: none. 371 Default value: none. See also: "MACRO EXPANSION".
361 372
362repo.commit-filter:: 373repo.commit-filter::
363 Override the default commit-filter. Default value: none. See also: 374 Override the default commit-filter. Default value: none. See also:
364 "enable-filter-overrides". 375 "enable-filter-overrides". See also: "FILTER API".
365 376
366repo.defbranch:: 377repo.defbranch::
367 The name of the default branch for this repository. If no such branch 378 The name of the default branch for this repository. If no such branch
@@ -438,7 +449,7 @@ repo.section::
438 449
439repo.source-filter:: 450repo.source-filter::
440 Override the default source-filter. Default value: none. See also: 451 Override the default source-filter. Default value: none. See also:
441 "enable-filter-overrides". 452 "enable-filter-overrides". See also: "FILTER API".
442 453
443repo.url:: 454repo.url::
444 The relative url used to access the repository. This must be the first 455 The relative url used to access the repository. This must be the first
@@ -458,6 +469,40 @@ Note: the "repo." prefix is dropped from the option names in repo-specific
458config files, e.g. "repo.desc" becomes "desc". 469config files, e.g. "repo.desc" becomes "desc".
459 470
460 471
472FILTER API
473----------
474about filter::
475 This filter is given no arguments. The about text that is to be
476 filtered is available on standard input and the filtered text is
477 expected on standard output.
478
479commit filter::
480 This filter is given no arguments. The commit message text that is to
481 be filtered is available on standard input and the filtered text is
482 expected on standard output.
483
484source filter::
485 This filter is given a single parameter: the filename of the source
486 file to filter. The filter can use the filename to determine (for
487 example) the syntax highlighting mode. The contents of the source
488 file that is to be filtered is available on standard input and the
489 filtered contents is expected on standard output.
490
491Also, all filters are handed the following environment variables:
492
493- CGIT_REPO_URL (from repo.url)
494- CGIT_REPO_NAME (from repo.name)
495- CGIT_REPO_PATH (from repo.path)
496- CGIT_REPO_OWNER (from repo.owner)
497- CGIT_REPO_DEFBRANCH (from repo.defbranch)
498- CGIT_REPO_SECTION (from repo.section)
499- CGIT_REPO_CLONE_URL (from repo.clone-url)
500
501If a setting is not defined for a repository and the corresponding global
502setting is also not defined (if applicable), then the corresponding
503environment variable will be unset.
504
505
461MACRO EXPANSION 506MACRO EXPANSION
462--------------- 507---------------
463The following cgitrc options supports a simple macro expansion feature, 508The following cgitrc options supports a simple macro expansion feature,
@@ -477,6 +522,12 @@ can be accomplished by adding the following line to /etc/cgitrc:
477 522
478 include=/etc/cgitrc.d/$HTTP_HOST 523 include=/etc/cgitrc.d/$HTTP_HOST
479 524
525The following options are expanded during request processing, and support
526the environment variables defined in "FILTER API":
527
528- clone-url
529- repo.clone-url
530
480 531
481EXAMPLE CGITRC FILE 532EXAMPLE CGITRC FILE
482------------------- 533-------------------
@@ -486,8 +537,8 @@ EXAMPLE CGITRC FILE
486cache-size=1000 537cache-size=1000
487 538
488 539
489# Specify some default clone prefixes 540# Specify some default clone urls using macro expansion
490clone-prefix=git://example.com ssh://example.com/pub/git http://example.com/git 541clone-url=git://foo.org/$CGIT_REPO_URL git@foo.org:$CGIT_REPO_URL
491 542
492# Specify the css url 543# Specify the css url
493css=/css/cgit.css 544css=/css/cgit.css
diff --git a/cmd.c b/cmd.c
index 536515b..5a3d157 100644
--- a/cmd.c
+++ b/cmd.c
@@ -56,7 +56,7 @@ static void commit_fn(struct cgit_context *ctx)
56 56
57static void diff_fn(struct cgit_context *ctx) 57static void diff_fn(struct cgit_context *ctx)
58{ 58{
59 cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); 59 cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path, 1);
60} 60}
61 61
62static void info_fn(struct cgit_context *ctx) 62static void info_fn(struct cgit_context *ctx)
@@ -130,31 +130,31 @@ static void tree_fn(struct cgit_context *ctx)
130 cgit_print_tree(ctx->qry.sha1, ctx->qry.path); 130 cgit_print_tree(ctx->qry.sha1, ctx->qry.path);
131} 131}
132 132
133#define def_cmd(name, want_repo, want_layout, want_vpath) \ 133#define def_cmd(name, want_repo, want_layout, want_vpath, is_clone) \
134 {#name, name##_fn, want_repo, want_layout, want_vpath} 134 {#name, name##_fn, want_repo, want_layout, want_vpath, is_clone}
135 135
136struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) 136struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
137{ 137{
138 static struct cgit_cmd cmds[] = { 138 static struct cgit_cmd cmds[] = {
139 def_cmd(HEAD, 1, 0, 0), 139 def_cmd(HEAD, 1, 0, 0, 1),
140 def_cmd(atom, 1, 0, 0), 140 def_cmd(atom, 1, 0, 0, 0),
141 def_cmd(about, 0, 1, 0), 141 def_cmd(about, 0, 1, 0, 0),
142 def_cmd(blob, 1, 0, 0), 142 def_cmd(blob, 1, 0, 0, 0),
143 def_cmd(commit, 1, 1, 1), 143 def_cmd(commit, 1, 1, 1, 0),
144 def_cmd(diff, 1, 1, 1), 144 def_cmd(diff, 1, 1, 1, 0),
145 def_cmd(info, 1, 0, 0), 145 def_cmd(info, 1, 0, 0, 1),
146 def_cmd(log, 1, 1, 1), 146 def_cmd(log, 1, 1, 1, 0),
147 def_cmd(ls_cache, 0, 0, 0), 147 def_cmd(ls_cache, 0, 0, 0, 0),
148 def_cmd(objects, 1, 0, 0), 148 def_cmd(objects, 1, 0, 0, 1),
149 def_cmd(patch, 1, 0, 1), 149 def_cmd(patch, 1, 0, 1, 0),
150 def_cmd(plain, 1, 0, 0), 150 def_cmd(plain, 1, 0, 0, 0),
151 def_cmd(refs, 1, 1, 0), 151 def_cmd(refs, 1, 1, 0, 0),
152 def_cmd(repolist, 0, 0, 0), 152 def_cmd(repolist, 0, 0, 0, 0),
153 def_cmd(snapshot, 1, 0, 0), 153 def_cmd(snapshot, 1, 0, 0, 0),
154 def_cmd(stats, 1, 1, 1), 154 def_cmd(stats, 1, 1, 1, 0),
155 def_cmd(summary, 1, 1, 0), 155 def_cmd(summary, 1, 1, 0, 0),
156 def_cmd(tag, 1, 1, 0), 156 def_cmd(tag, 1, 1, 0, 0),
157 def_cmd(tree, 1, 1, 1), 157 def_cmd(tree, 1, 1, 1, 0),
158 }; 158 };
159 int i; 159 int i;
160 160
diff --git a/cmd.h b/cmd.h
index 8dc01bd..eb5bc87 100644
--- a/cmd.h
+++ b/cmd.h
@@ -8,7 +8,8 @@ struct cgit_cmd {
8 cgit_cmd_fn fn; 8 cgit_cmd_fn fn;
9 unsigned int want_repo:1, 9 unsigned int want_repo:1,
10 want_layout:1, 10 want_layout:1,
11 want_vpath:1; 11 want_vpath:1,
12 is_clone:1;
12