summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c6
-rw-r--r--cgit.h1
-rw-r--r--cmd.c42
-rw-r--r--cmd.h3
4 files changed, 30 insertions, 22 deletions
diff --git a/cgit.c b/cgit.c
index 9305d0a..2c3ad73 100644
--- a/cgit.c
+++ b/cgit.c
@@ -379,96 +379,102 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
379 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); 379 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc);
380 380
381 if (!ctx->qry.head) { 381 if (!ctx->qry.head) {
382 ctx->qry.nohead = 1; 382 ctx->qry.nohead = 1;
383 ctx->qry.head = find_default_branch(ctx->repo); 383 ctx->qry.head = find_default_branch(ctx->repo);
384 ctx->repo->defbranch = ctx->qry.head; 384 ctx->repo->defbranch = ctx->qry.head;
385 } 385 }
386 386
387 if (!ctx->qry.head) { 387 if (!ctx->qry.head) {
388 cgit_print_http_headers(ctx); 388 cgit_print_http_headers(ctx);
389 cgit_print_docstart(ctx); 389 cgit_print_docstart(ctx);
390 cgit_print_pageheader(ctx); 390 cgit_print_pageheader(ctx);
391 cgit_print_error("Repository seems to be empty"); 391 cgit_print_error("Repository seems to be empty");
392 cgit_print_docend(); 392 cgit_print_docend();
393 return 1; 393 return 1;
394 } 394 }
395 395
396 if (get_sha1(ctx->qry.head, sha1)) { 396 if (get_sha1(ctx->qry.head, sha1)) {
397 tmp = xstrdup(ctx->qry.head); 397 tmp = xstrdup(ctx->qry.head);
398 ctx->qry.head = ctx->repo->defbranch; 398 ctx->qry.head = ctx->repo->defbranch;
399 ctx->page.status = 404; 399 ctx->page.status = 404;
400 ctx->page.statusmsg = "not found"; 400 ctx->page.statusmsg = "not found";
401 cgit_print_http_headers(ctx); 401 cgit_print_http_headers(ctx);
402 cgit_print_docstart(ctx); 402 cgit_print_docstart(ctx);
403 cgit_print_pageheader(ctx); 403 cgit_print_pageheader(ctx);
404 cgit_print_error(fmt("Invalid branch: %s", tmp)); 404 cgit_print_error(fmt("Invalid branch: %s", tmp));
405 cgit_print_docend(); 405 cgit_print_docend();
406 return 1; 406 return 1;
407 } 407 }
408 return 0; 408 return 0;
409} 409}
410 410
411static void process_request(void *cbdata) 411static void process_request(void *cbdata)
412{ 412{
413 struct cgit_context *ctx = cbdata; 413 struct cgit_context *ctx = cbdata;
414 struct cgit_cmd *cmd; 414 struct cgit_cmd *cmd;
415 415
416 cmd = cgit_get_cmd(ctx); 416 cmd = cgit_get_cmd(ctx);
417 if (!cmd) { 417 if (!cmd) {
418 ctx->page.title = "cgit error"; 418 ctx->page.title = "cgit error";
419 cgit_print_http_headers(ctx); 419 cgit_print_http_headers(ctx);
420 cgit_print_docstart(ctx); 420 cgit_print_docstart(ctx);
421 cgit_print_pageheader(ctx); 421 cgit_print_pageheader(ctx);
422 cgit_print_error("Invalid request"); 422 cgit_print_error("Invalid request");
423 cgit_print_docend(); 423 cgit_print_docend();
424 return; 424 return;
425 } 425 }
426 426
427 /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual"
428 * in-project path limit to be made available at ctx->qry.vpath.
429 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL).
430 */
431 ctx->qry.vpath = cmd->want_vpath ? ctx->qry.path : NULL;
432
427 if (cmd->want_repo && !ctx->repo) { 433 if (cmd->want_repo && !ctx->repo) {
428 cgit_print_http_headers(ctx); 434 cgit_print_http_headers(ctx);
429 cgit_print_docstart(ctx); 435 cgit_print_docstart(ctx);
430 cgit_print_pageheader(ctx); 436 cgit_print_pageheader(ctx);
431 cgit_print_error(fmt("No repository selected")); 437 cgit_print_error(fmt("No repository selected"));
432 cgit_print_docend(); 438 cgit_print_docend();
433 return; 439 return;
434 } 440 }
435 441
436 if (ctx->repo && prepare_repo_cmd(ctx)) 442 if (ctx->repo && prepare_repo_cmd(ctx))
437 return; 443 return;
438 444
439 if (cmd->want_layout) { 445 if (cmd->want_layout) {
440 cgit_print_http_headers(ctx); 446 cgit_print_http_headers(ctx);
441 cgit_print_docstart(ctx); 447 cgit_print_docstart(ctx);
442 cgit_print_pageheader(ctx); 448 cgit_print_pageheader(ctx);
443 } 449 }
444 450
445 cmd->fn(ctx); 451 cmd->fn(ctx);
446 452
447 if (cmd->want_layout) 453 if (cmd->want_layout)
448 cgit_print_docend(); 454 cgit_print_docend();
449} 455}
450 456
451int cmp_repos(const void *a, const void *b) 457int cmp_repos(const void *a, const void *b)
452{ 458{
453 const struct cgit_repo *ra = a, *rb = b; 459 const struct cgit_repo *ra = a, *rb = b;
454 return strcmp(ra->url, rb->url); 460 return strcmp(ra->url, rb->url);
455} 461}
456 462
457char *build_snapshot_setting(int bitmap) 463char *build_snapshot_setting(int bitmap)
458{ 464{
459 const struct cgit_snapshot_format *f; 465 const struct cgit_snapshot_format *f;
460 char *result = xstrdup(""); 466 char *result = xstrdup("");
461 char *tmp; 467 char *tmp;
462 int len; 468 int len;
463 469
464 for (f = cgit_snapshot_formats; f->suffix; f++) { 470 for (f = cgit_snapshot_formats; f->suffix; f++) {
465 if (f->bit & bitmap) { 471 if (f->bit & bitmap) {
466 tmp = result; 472 tmp = result;
467 result = xstrdup(fmt("%s%s ", tmp, f->suffix)); 473 result = xstrdup(fmt("%s%s ", tmp, f->suffix));
468 free(tmp); 474 free(tmp);
469 } 475 }
470 } 476 }
471 len = strlen(result); 477 len = strlen(result);
472 if (len) 478 if (len)
473 result[len - 1] = '\0'; 479 result[len - 1] = '\0';
474 return result; 480 return result;
diff --git a/cgit.h b/cgit.h
index cd4af72..f990b15 100644
--- a/cgit.h
+++ b/cgit.h
@@ -100,96 +100,97 @@ struct commitinfo {
100 char *subject; 100 char *subject;
101 char *msg; 101 char *msg;
102 char *msg_encoding; 102 char *msg_encoding;
103}; 103};
104 104
105struct taginfo { 105struct taginfo {
106 char *tagger; 106 char *tagger;
107 char *tagger_email; 107 char *tagger_email;
108 unsigned long tagger_date; 108 unsigned long tagger_date;
109 char *msg; 109 char *msg;
110}; 110};
111 111
112struct refinfo { 112struct refinfo {
113 const char *refname; 113 const char *refname;
114 struct object *object; 114 struct object *object;
115 union { 115 union {
116 struct taginfo *tag; 116 struct taginfo *tag;
117 struct commitinfo *commit; 117 struct commitinfo *commit;
118 }; 118 };
119}; 119};
120 120
121struct reflist { 121struct reflist {
122 struct refinfo **refs; 122 struct refinfo **refs;
123 int alloc; 123 int alloc;
124 int count; 124 int count;
125}; 125};
126 126
127struct cgit_query { 127struct cgit_query {
128 int has_symref; 128 int has_symref;
129 int has_sha1; 129 int has_sha1;
130 char *raw; 130 char *raw;
131 char *repo; 131 char *repo;
132 char *page; 132 char *page;
133 char *search; 133 char *search;
134 char *grep; 134 char *grep;
135 char *head; 135 char *head;
136 char *sha1; 136 char *sha1;
137 char *sha2; 137 char *sha2;
138 char *path; 138 char *path;
139 char *name; 139 char *name;
140 char *mimetype; 140 char *mimetype;
141 char *url; 141 char *url;
142 char *period; 142 char *period;
143 int ofs; 143 int ofs;
144 int nohead; 144 int nohead;
145 char *sort; 145 char *sort;
146 int showmsg; 146 int showmsg;
147 int ssdiff; 147 int ssdiff;
148 char *vpath;
148}; 149};
149 150
150struct cgit_config { 151struct cgit_config {
151 char *agefile; 152 char *agefile;
152 char *cache_root; 153 char *cache_root;
153 char *clone_prefix; 154 char *clone_prefix;
154 char *css; 155 char *css;
155 char *favicon; 156 char *favicon;
156 char *footer; 157 char *footer;
157 char *head_include; 158 char *head_include;
158 char *header; 159 char *header;
159 char *index_header; 160 char *index_header;
160 char *index_info; 161 char *index_info;
161 char *logo; 162 char *logo;
162 char *logo_link; 163 char *logo_link;
163 char *module_link; 164 char *module_link;
164 char *robots; 165 char *robots;
165 char *root_title; 166 char *root_title;
166 char *root_desc; 167 char *root_desc;
167 char *root_readme; 168 char *root_readme;
168 char *script_name; 169 char *script_name;
169 char *section; 170 char *section;
170 char *virtual_root; 171 char *virtual_root;
171 int cache_size; 172 int cache_size;
172 int cache_dynamic_ttl; 173 int cache_dynamic_ttl;
173 int cache_max_create_time; 174 int cache_max_create_time;
174 int cache_repo_ttl; 175 int cache_repo_ttl;
175 int cache_root_ttl; 176 int cache_root_ttl;
176 int cache_scanrc_ttl; 177 int cache_scanrc_ttl;
177 int cache_static_ttl; 178 int cache_static_ttl;
178 int embedded; 179 int embedded;
179 int enable_filter_overrides; 180 int enable_filter_overrides;
180 int enable_index_links; 181 int enable_index_links;
181 int enable_log_filecount; 182 int enable_log_filecount;
182 int enable_log_linecount; 183 int enable_log_linecount;
183 int enable_remote_branches; 184 int enable_remote_branches;
184 int enable_tree_linenumbers; 185 int enable_tree_linenumbers;
185 int local_time; 186 int local_time;
186 int max_repo_count; 187 int max_repo_count;
187 int max_commit_count; 188 int max_commit_count;
188 int max_lock_attempts; 189 int max_lock_attempts;
189 int max_msg_len; 190 int max_msg_len;
190 int max_repodesc_len; 191 int max_repodesc_len;
191 int max_blob_size; 192 int max_blob_size;
192 int max_stats; 193 int max_stats;
193 int nocache; 194 int nocache;
194 int noplainemail; 195 int noplainemail;
195 int noheader; 196 int noheader;
diff --git a/cmd.c b/cmd.c
index 766f903..a9e426a 100644
--- a/cmd.c
+++ b/cmd.c
@@ -84,88 +84,88 @@ static void objects_fn(struct cgit_context *ctx)
84} 84}
85 85
86static void repolist_fn(struct cgit_context *ctx) 86static void repolist_fn(struct cgit_context *ctx)
87{ 87{
88 cgit_print_repolist(); 88 cgit_print_repolist();
89} 89}
90 90
91static void patch_fn(struct cgit_context *ctx) 91static void patch_fn(struct cgit_context *ctx)
92{ 92{
93 cgit_print_patch(ctx->qry.sha1); 93 cgit_print_patch(ctx->qry.sha1);
94} 94}
95 95
96static void plain_fn(struct cgit_context *ctx) 96static void plain_fn(struct cgit_context *ctx)
97{ 97{
98 cgit_print_plain(ctx); 98 cgit_print_plain(ctx);
99} 99}
100 100
101static void refs_fn(struct cgit_context *ctx) 101static void refs_fn(struct cgit_context *ctx)
102{ 102{
103 cgit_print_refs(); 103 cgit_print_refs();
104} 104}
105 105
106static void snapshot_fn(struct cgit_context *ctx) 106static void snapshot_fn(struct cgit_context *ctx)
107{ 107{
108 cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path, 108 cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path,
109 ctx->repo->snapshots, ctx->qry.nohead); 109 ctx->repo->snapshots, ctx->qry.nohead);
110} 110}
111 111
112static void stats_fn(struct cgit_context *ctx) 112static void stats_fn(struct cgit_context *ctx)
113{ 113{
114 cgit_show_stats(ctx); 114 cgit_show_stats(ctx);
115} 115}
116 116
117static void summary_fn(struct cgit_context *ctx) 117static void summary_fn(struct cgit_context *ctx)
118{ 118{
119 cgit_print_summary(); 119 cgit_print_summary();
120} 120}
121 121
122static void tag_fn(struct cgit_context *ctx) 122static void tag_fn(struct cgit_context *ctx)
123{ 123{
124 cgit_print_tag(ctx->qry.sha1); 124 cgit_print_tag(ctx->qry.sha1);
125} 125}
126 126
127static void tree_fn(struct cgit_context *ctx) 127static void tree_fn(struct cgit_context *ctx)
128{ 128{
129 cgit_print_tree(ctx->qry.sha1, ctx->qry.path); 129 cgit_print_tree(ctx->qry.sha1, ctx->qry.path);
130} 130}
131 131
132#define def_cmd(name, want_repo, want_layout) \ 132#define def_cmd(name, want_repo, want_layout, want_vpath) \
133 {#name, name##_fn, want_repo, want_layout} 133 {#name, name##_fn, want_repo, want_layout, want_vpath}
134 134
135struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) 135struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
136{ 136{
137 static struct cgit_cmd cmds[] = { 137 static struct cgit_cmd cmds[] = {
138 def_cmd(HEAD, 1, 0), 138 def_cmd(HEAD, 1, 0, 0),
139 def_cmd(atom, 1, 0), 139 def_cmd(atom, 1, 0, 0),
140 def_cmd(about, 0, 1), 140 def_cmd(about, 0, 1, 0),
141 def_cmd(blob, 1, 0), 141 def_cmd(blob, 1, 0, 0),
142 def_cmd(commit, 1, 1), 142 def_cmd(commit, 1, 1, 1),
143 def_cmd(diff, 1, 1), 143 def_cmd(diff, 1, 1, 1),
144 def_cmd(info, 1, 0), 144 def_cmd(info, 1, 0, 0),
145 def_cmd(log, 1, 1), 145 def_cmd(log, 1, 1, 1),
146 def_cmd(ls_cache, 0, 0), 146 def_cmd(ls_cache, 0, 0, 0),
147 def_cmd(objects, 1, 0), 147 def_cmd(objects, 1, 0, 0),
148 def_cmd(patch, 1, 0), 148 def_cmd(patch, 1, 0, 1),
149 def_cmd(plain, 1, 0), 149 def_cmd(plain, 1, 0, 0),
150 def_cmd(refs, 1, 1), 150 def_cmd(refs, 1, 1, 0),
151 def_cmd(repolist, 0, 0), 151 def_cmd(repolist, 0, 0, 0),
152 def_cmd(snapshot, 1, 0), 152 def_cmd(snapshot, 1, 0, 0),
153 def_cmd(stats, 1, 1), 153 def_cmd(stats, 1, 1, 1),
154 def_cmd(summary, 1, 1), 154 def_cmd(summary, 1, 1, 0),
155 def_cmd(tag, 1, 1), 155 def_cmd(tag, 1, 1, 0),
156 def_cmd(tree, 1, 1), 156 def_cmd(tree, 1, 1, 1),
157 }; 157 };
158 int i; 158 int i;
159 159
160 if (ctx->qry.page == NULL) { 160 if (ctx->qry.page == NULL) {
161 if (ctx->repo) 161 if (ctx->repo)
162 ctx->qry.page = "summary"; 162 ctx->qry.page = "summary";
163 else 163 else
164 ctx->qry.page = "repolist"; 164 ctx->qry.page = "repolist";
165 } 165 }
166 166
167 for(i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) 167 for(i = 0; i < sizeof(cmds)/sizeof(*cmds); i++)
168 if (!strcmp(ctx->qry.page, cmds[i].name)) 168 if (!strcmp(ctx->qry.page, cmds[i].name))
169 return &cmds[i]; 169 return &cmds[i];
170 return NULL; 170 return NULL;
171} 171}
diff --git a/cmd.h b/cmd.h
index ec9e691..8dc01bd 100644
--- a/cmd.h
+++ b/cmd.h
@@ -1,15 +1,16 @@
1#ifndef CMD_H 1#ifndef CMD_H
2#define CMD_H 2#define CMD_H
3 3
4typedef void (*cgit_cmd_fn)(struct cgit_context *ctx); 4typedef void (*cgit_cmd_fn)(struct cgit_context *ctx);
5 5
6struct cgit_cmd { 6struct cgit_cmd {
7 const char *name; 7 const char *name;
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}; 12};
12 13
13extern struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx); 14extern struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx);
14 15
15#endif /* CMD_H */ 16#endif /* CMD_H */