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.c30
-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, 342 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 5259f56..b7807ad 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."))
@@ -312,6 +329,7 @@ static void prepare_context(struct cgit_context *ctx)
312 ctx->cfg.logo = "/cgit.png"; 329 ctx->cfg.logo = "/cgit.png";
313 ctx->cfg.local_time = 0; 330 ctx->cfg.local_time = 0;
314 ctx->cfg.enable_gitweb_owner = 1; 331 ctx->cfg.enable_gitweb_owner = 1;
332 ctx->cfg.enable_http_clone = 1;
315 ctx->cfg.enable_tree_linenumbers = 1; 333 ctx->cfg.enable_tree_linenumbers = 1;
316 ctx->cfg.max_repo_count = 50; 334 ctx->cfg.max_repo_count = 50;
317 ctx->cfg.max_commit_count = 50; 335 ctx->cfg.max_commit_count = 50;
@@ -443,7 +461,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
443 tmp = xstrdup(ctx->qry.head); 461 tmp = xstrdup(ctx->qry.head);
444 ctx->qry.head = ctx->repo->defbranch; 462 ctx->qry.head = ctx->repo->defbranch;
445 ctx->page.status = 404; 463 ctx->page.status = 404;
446 ctx->page.statusmsg = "not found"; 464 ctx->page.statusmsg = "Not found";
447 cgit_print_http_headers(ctx); 465 cgit_print_http_headers(ctx);
448 cgit_print_docstart(ctx); 466 cgit_print_docstart(ctx);
449 cgit_print_pageheader(ctx); 467 cgit_print_pageheader(ctx);
@@ -451,6 +469,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
451 cgit_print_docend(); 469 cgit_print_docend();
452 return 1; 470 return 1;
453 } 471 }
472 cgit_prepare_repo_env(ctx->repo);
454 return 0; 473 return 0;
455} 474}
456 475
@@ -462,6 +481,8 @@ static void process_request(void *cbdata)
462 cmd = cgit_get_cmd(ctx); 481 cmd = cgit_get_cmd(ctx);
463 if (!cmd) { 482 if (!cmd) {
464 ctx->page.title = "cgit error"; 483 ctx->page.title = "cgit error";
484 ctx->page.status = 404;
485 ctx->page.statusmsg = "Not found";
465 cgit_print_http_headers(ctx); 486 cgit_print_http_headers(ctx);
466 cgit_print_docstart(ctx); 487 cgit_print_docstart(ctx);
467 cgit_print_pageheader(ctx); 488 cgit_print_pageheader(ctx);
@@ -470,6 +491,11 @@ static void process_request(void *cbdata)
470 return; 491 return;
471 } 492 }
472 493
494 if (!ctx->cfg.enable_http_clone && cmd->is_clone) {
495 html_status(404, "Not found", 0);
496 return;
497 }
498
473 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual" 499 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual"
474 * in-project path limit to be made available at ctx->qry.vpath. 500 * in-project path limit to be made available at ctx->qry.vpath.
475 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL). 501 * 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 b5f00fc..bad66f0 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;
@@ -161,6 +165,7 @@ struct cgit_config {
161 char *agefile; 165 char *agefile;
162 char *cache_root; 166 char *cache_root;
163 char *clone_prefix; 167 char *clone_prefix;
168 char *clone_url;
164 char *css; 169 char *css;
165 char *favicon; 170 char *favicon;
166 char *footer; 171