author | Lars Hjemli <hjemli@gmail.com> | 2007-05-15 22:14:51 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-05-15 22:16:00 (UTC) |
commit | b28b105ec172b258ae5d629381a5890697c2f938 (patch) (unidiff) | |
tree | 0673dc5ed94c8ce99c714d1204b6582f9ba96fc5 /cgit.c | |
parent | 47a81c77fdd017227632c4df9a0b7b135b8a738d (diff) | |
download | cgit-b28b105ec172b258ae5d629381a5890697c2f938.zip cgit-b28b105ec172b258ae5d629381a5890697c2f938.tar.gz cgit-b28b105ec172b258ae5d629381a5890697c2f938.tar.bz2 |
Enable default value for head parameter
Pages which expect head to be specified in the querystring can now be
given a default value, configurable per repository (via repo.defbranch,
which defaults to "master").
Currently, only the log page actually works without parameters, but the
defbranch is bound to be exploited.
This also removes some dead code from shared.c
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.c | 3 |
1 files changed, 3 insertions, 0 deletions
@@ -4,128 +4,131 @@ | |||
4 | * | 4 | * |
5 | * Licensed under GNU General Public License v2 | 5 | * Licensed under GNU General Public License v2 |
6 | * (see COPYING for full license text) | 6 | * (see COPYING for full license text) |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include "cgit.h" | 9 | #include "cgit.h" |
10 | 10 | ||
11 | const char cgit_version[] = CGIT_VERSION; | 11 | const char cgit_version[] = CGIT_VERSION; |
12 | 12 | ||
13 | 13 | ||
14 | static struct repoinfo *cgit_get_repoinfo(char *url) | 14 | static struct repoinfo *cgit_get_repoinfo(char *url) |
15 | { | 15 | { |
16 | int i; | 16 | int i; |
17 | struct repoinfo *repo; | 17 | struct repoinfo *repo; |
18 | 18 | ||
19 | for (i=0; i<cgit_repolist.count; i++) { | 19 | for (i=0; i<cgit_repolist.count; i++) { |
20 | repo = &cgit_repolist.repos[i]; | 20 | repo = &cgit_repolist.repos[i]; |
21 | if (!strcmp(repo->url, url)) | 21 | if (!strcmp(repo->url, url)) |
22 | return repo; | 22 | return repo; |
23 | } | 23 | } |
24 | return NULL; | 24 | return NULL; |
25 | } | 25 | } |
26 | 26 | ||
27 | 27 | ||
28 | static int cgit_prepare_cache(struct cacheitem *item) | 28 | static int cgit_prepare_cache(struct cacheitem *item) |
29 | { | 29 | { |
30 | if (!cgit_query_repo) { | 30 | if (!cgit_query_repo) { |
31 | item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); | 31 | item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); |
32 | item->ttl = cgit_cache_root_ttl; | 32 | item->ttl = cgit_cache_root_ttl; |
33 | return 1; | 33 | return 1; |
34 | } | 34 | } |
35 | cgit_repo = cgit_get_repoinfo(cgit_query_repo); | 35 | cgit_repo = cgit_get_repoinfo(cgit_query_repo); |
36 | if (!cgit_repo) { | 36 | if (!cgit_repo) { |
37 | char *title = fmt("%s - %s", cgit_root_title, "Bad request"); | 37 | char *title = fmt("%s - %s", cgit_root_title, "Bad request"); |
38 | cgit_print_docstart(title, item); | 38 | cgit_print_docstart(title, item); |
39 | cgit_print_pageheader(title, 0); | 39 | cgit_print_pageheader(title, 0); |
40 | cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo)); | 40 | cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo)); |
41 | cgit_print_docend(); | 41 | cgit_print_docend(); |
42 | return 0; | 42 | return 0; |
43 | } | 43 | } |
44 | 44 | ||
45 | if (!cgit_query_page) { | 45 | if (!cgit_query_page) { |
46 | item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root, | 46 | item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root, |
47 | cgit_repo->url)); | 47 | cgit_repo->url)); |
48 | item->ttl = cgit_cache_repo_ttl; | 48 | item->ttl = cgit_cache_repo_ttl; |
49 | } else { | 49 | } else { |
50 | item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, | 50 | item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, |
51 | cgit_repo->url, cgit_query_page, | 51 | cgit_repo->url, cgit_query_page, |
52 | cache_safe_filename(cgit_querystring))); | 52 | cache_safe_filename(cgit_querystring))); |
53 | if (cgit_query_has_symref) | 53 | if (cgit_query_has_symref) |
54 | item->ttl = cgit_cache_dynamic_ttl; | 54 | item->ttl = cgit_cache_dynamic_ttl; |
55 | else if (cgit_query_has_sha1) | 55 | else if (cgit_query_has_sha1) |
56 | item->ttl = cgit_cache_static_ttl; | 56 | item->ttl = cgit_cache_static_ttl; |
57 | else | 57 | else |
58 | item->ttl = cgit_cache_repo_ttl; | 58 | item->ttl = cgit_cache_repo_ttl; |
59 | } | 59 | } |
60 | return 1; | 60 | return 1; |
61 | } | 61 | } |
62 | 62 | ||
63 | static void cgit_print_repo_page(struct cacheitem *item) | 63 | static void cgit_print_repo_page(struct cacheitem *item) |
64 | { | 64 | { |
65 | char *title; | 65 | char *title; |
66 | int show_search; | 66 | int show_search; |
67 | 67 | ||
68 | if (!cgit_query_head) | ||
69 | cgit_query_head = cgit_repo->defbranch; | ||
70 | |||
68 | if (chdir(cgit_repo->path)) { | 71 | if (chdir(cgit_repo->path)) { |
69 | title = fmt("%s - %s", cgit_root_title, "Bad request"); | 72 | title = fmt("%s - %s", cgit_root_title, "Bad request"); |
70 | cgit_print_docstart(title, item); | 73 | cgit_print_docstart(title, item); |
71 | cgit_print_pageheader(title, 0); | 74 | cgit_print_pageheader(title, 0); |
72 | cgit_print_error(fmt("Unable to scan repository: %s", | 75 | cgit_print_error(fmt("Unable to scan repository: %s", |
73 | strerror(errno))); | 76 | strerror(errno))); |
74 | cgit_print_docend(); | 77 | cgit_print_docend(); |
75 | return; | 78 | return; |
76 | } | 79 | } |
77 | 80 | ||
78 | title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); | 81 | title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); |
79 | show_search = 0; | 82 | show_search = 0; |
80 | setenv("GIT_DIR", cgit_repo->path, 1); | 83 | setenv("GIT_DIR", cgit_repo->path, 1); |
81 | 84 | ||
82 | if (cgit_query_page) { | 85 | if (cgit_query_page) { |
83 | if (cgit_repo->snapshots && !strcmp(cgit_query_page, "snapshot")) { | 86 | if (cgit_repo->snapshots && !strcmp(cgit_query_page, "snapshot")) { |
84 | cgit_print_snapshot(item, cgit_query_sha1, "zip", | 87 | cgit_print_snapshot(item, cgit_query_sha1, "zip", |
85 | cgit_repo->url, cgit_query_name); | 88 | cgit_repo->url, cgit_query_name); |
86 | return; | 89 | return; |
87 | } | 90 | } |
88 | if (!strcmp(cgit_query_page, "blob")) { | 91 | if (!strcmp(cgit_query_page, "blob")) { |
89 | cgit_print_blob(item, cgit_query_sha1, cgit_query_path); | 92 | cgit_print_blob(item, cgit_query_sha1, cgit_query_path); |
90 | return; | 93 | return; |
91 | } | 94 | } |
92 | } | 95 | } |
93 | 96 | ||
94 | if (cgit_query_page && !strcmp(cgit_query_page, "log")) | 97 | if (cgit_query_page && !strcmp(cgit_query_page, "log")) |
95 | show_search = 1; | 98 | show_search = 1; |
96 | 99 | ||
97 | cgit_print_docstart(title, item); | 100 | cgit_print_docstart(title, item); |
98 | 101 | ||
99 | 102 | ||
100 | if (!cgit_query_page) { | 103 | if (!cgit_query_page) { |
101 | cgit_print_pageheader("summary", show_search); | 104 | cgit_print_pageheader("summary", show_search); |
102 | cgit_print_summary(); | 105 | cgit_print_summary(); |
103 | cgit_print_docend(); | 106 | cgit_print_docend(); |
104 | return; | 107 | return; |
105 | } | 108 | } |
106 | 109 | ||
107 | cgit_print_pageheader(cgit_query_page, show_search); | 110 | cgit_print_pageheader(cgit_query_page, show_search); |
108 | 111 | ||
109 | if (!strcmp(cgit_query_page, "log")) { | 112 | if (!strcmp(cgit_query_page, "log")) { |
110 | cgit_print_log(cgit_query_head, cgit_query_ofs, | 113 | cgit_print_log(cgit_query_head, cgit_query_ofs, |
111 | cgit_max_commit_count, cgit_query_search, | 114 | cgit_max_commit_count, cgit_query_search, |
112 | cgit_query_path); | 115 | cgit_query_path); |
113 | } else if (!strcmp(cgit_query_page, "tree")) { | 116 | } else if (!strcmp(cgit_query_page, "tree")) { |
114 | cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path); | 117 | cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path); |
115 | } else if (!strcmp(cgit_query_page, "commit")) { | 118 | } else if (!strcmp(cgit_query_page, "commit")) { |
116 | cgit_print_commit(cgit_query_sha1); | 119 | cgit_print_commit(cgit_query_sha1); |
117 | } else if (!strcmp(cgit_query_page, "view")) { | 120 | } else if (!strcmp(cgit_query_page, "view")) { |
118 | cgit_print_view(cgit_query_sha1, cgit_query_path); | 121 | cgit_print_view(cgit_query_sha1, cgit_query_path); |
119 | } else if (!strcmp(cgit_query_page, "diff")) { | 122 | } else if (!strcmp(cgit_query_page, "diff")) { |
120 | cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path); | 123 | cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path); |
121 | } else { | 124 | } else { |
122 | cgit_print_error("Invalid request"); | 125 | cgit_print_error("Invalid request"); |
123 | } | 126 | } |
124 | cgit_print_docend(); | 127 | cgit_print_docend(); |
125 | } | 128 | } |
126 | 129 | ||
127 | static void cgit_fill_cache(struct cacheitem *item, int use_cache) | 130 | static void cgit_fill_cache(struct cacheitem *item, int use_cache) |
128 | { | 131 | { |
129 | static char buf[PATH_MAX]; | 132 | static char buf[PATH_MAX]; |
130 | int stdout2; | 133 | int stdout2; |
131 | 134 | ||