author | Lars Hjemli <hjemli@gmail.com> | 2007-05-13 15:15:06 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-05-13 15:15:06 (UTC) |
commit | c6cf3a424a0860d69b290254d9b19d35527b2d27 (patch) (unidiff) | |
tree | 2874f2c42e907cba1187ae32ee686daebc2de59e /cgit.c | |
parent | 80e577c3ef2a73becabff7e9c9c242f317a87de9 (diff) | |
download | cgit-c6cf3a424a0860d69b290254d9b19d35527b2d27.zip cgit-c6cf3a424a0860d69b290254d9b19d35527b2d27.tar.gz cgit-c6cf3a424a0860d69b290254d9b19d35527b2d27.tar.bz2 |
Add max-commit-count parameter to cgitrc
This enabled customizing number of commits shown per page in log view. It
also changes the default from 100 to 50, mainly due to the more cpu
intensive log pages (number of files/lines changed) but also since 100
log messages requires excessive scrolling.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -1,259 +1,259 @@ | |||
1 | /* cgit.c: cgi for the git scm | 1 | /* cgit.c: cgi for the git scm |
2 | * | 2 | * |
3 | * Copyright (C) 2006 Lars Hjemli | 3 | * Copyright (C) 2006 Lars Hjemli |
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 (chdir(cgit_repo->path)) { | 68 | if (chdir(cgit_repo->path)) { |
69 | title = fmt("%s - %s", cgit_root_title, "Bad request"); | 69 | title = fmt("%s - %s", cgit_root_title, "Bad request"); |
70 | cgit_print_docstart(title, item); | 70 | cgit_print_docstart(title, item); |
71 | cgit_print_pageheader(title, 0); | 71 | cgit_print_pageheader(title, 0); |
72 | cgit_print_error(fmt("Unable to scan repository: %s", | 72 | cgit_print_error(fmt("Unable to scan repository: %s", |
73 | strerror(errno))); | 73 | strerror(errno))); |
74 | cgit_print_docend(); | 74 | cgit_print_docend(); |
75 | return; | 75 | return; |
76 | } | 76 | } |
77 | 77 | ||
78 | title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); | 78 | title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); |
79 | show_search = 0; | 79 | show_search = 0; |
80 | setenv("GIT_DIR", cgit_repo->path, 1); | 80 | setenv("GIT_DIR", cgit_repo->path, 1); |
81 | 81 | ||
82 | if (cgit_query_page) { | 82 | if (cgit_query_page) { |
83 | if (cgit_repo->snapshots && !strcmp(cgit_query_page, "snapshot")) { | 83 | if (cgit_repo->snapshots && !strcmp(cgit_query_page, "snapshot")) { |
84 | cgit_print_snapshot(item, cgit_query_sha1, "zip", | 84 | cgit_print_snapshot(item, cgit_query_sha1, "zip", |
85 | cgit_repo->url, cgit_query_name); | 85 | cgit_repo->url, cgit_query_name); |
86 | return; | 86 | return; |
87 | } | 87 | } |
88 | if (!strcmp(cgit_query_page, "blob")) { | 88 | if (!strcmp(cgit_query_page, "blob")) { |
89 | cgit_print_blob(item, cgit_query_sha1, cgit_query_path); | 89 | cgit_print_blob(item, cgit_query_sha1, cgit_query_path); |
90 | return; | 90 | return; |
91 | } | 91 | } |
92 | } | 92 | } |
93 | 93 | ||
94 | if (cgit_query_page && !strcmp(cgit_query_page, "log")) | 94 | if (cgit_query_page && !strcmp(cgit_query_page, "log")) |
95 | show_search = 1; | 95 | show_search = 1; |
96 | 96 | ||
97 | cgit_print_docstart(title, item); | 97 | cgit_print_docstart(title, item); |
98 | 98 | ||
99 | 99 | ||
100 | if (!cgit_query_page) { | 100 | if (!cgit_query_page) { |
101 | cgit_print_pageheader("summary", show_search); | 101 | cgit_print_pageheader("summary", show_search); |
102 | cgit_print_summary(); | 102 | cgit_print_summary(); |
103 | cgit_print_docend(); | 103 | cgit_print_docend(); |
104 | return; | 104 | return; |
105 | } | 105 | } |
106 | 106 | ||
107 | cgit_print_pageheader(cgit_query_page, show_search); | 107 | cgit_print_pageheader(cgit_query_page, show_search); |
108 | 108 | ||
109 | if (!strcmp(cgit_query_page, "log")) { | 109 | if (!strcmp(cgit_query_page, "log")) { |
110 | cgit_print_log(cgit_query_head, cgit_query_ofs, 100, | 110 | cgit_print_log(cgit_query_head, cgit_query_ofs, |
111 | cgit_query_search); | 111 | cgit_max_commit_count, cgit_query_search); |
112 | } else if (!strcmp(cgit_query_page, "tree")) { | 112 | } else if (!strcmp(cgit_query_page, "tree")) { |
113 | cgit_print_tree(cgit_query_sha1, cgit_query_path); | 113 | cgit_print_tree(cgit_query_sha1, cgit_query_path); |
114 | } else if (!strcmp(cgit_query_page, "commit")) { | 114 | } else if (!strcmp(cgit_query_page, "commit")) { |
115 | cgit_print_commit(cgit_query_sha1); | 115 | cgit_print_commit(cgit_query_sha1); |
116 | } else if (!strcmp(cgit_query_page, "view")) { | 116 | } else if (!strcmp(cgit_query_page, "view")) { |
117 | cgit_print_view(cgit_query_sha1, cgit_query_path); | 117 | cgit_print_view(cgit_query_sha1, cgit_query_path); |
118 | } else if (!strcmp(cgit_query_page, "diff")) { | 118 | } else if (!strcmp(cgit_query_page, "diff")) { |
119 | cgit_print_diff(cgit_query_sha1, cgit_query_sha2); | 119 | cgit_print_diff(cgit_query_sha1, cgit_query_sha2); |
120 | } else { | 120 | } else { |
121 | cgit_print_error("Invalid request"); | 121 | cgit_print_error("Invalid request"); |
122 | } | 122 | } |
123 | cgit_print_docend(); | 123 | cgit_print_docend(); |
124 | } | 124 | } |
125 | 125 | ||
126 | static void cgit_fill_cache(struct cacheitem *item, int use_cache) | 126 | static void cgit_fill_cache(struct cacheitem *item, int use_cache) |
127 | { | 127 | { |
128 | static char buf[PATH_MAX]; | 128 | static char buf[PATH_MAX]; |
129 | int stdout2; | 129 | int stdout2; |
130 | 130 | ||
131 | getcwd(buf, sizeof(buf)); | 131 | getcwd(buf, sizeof(buf)); |
132 | item->st.st_mtime = time(NULL); | 132 | item->st.st_mtime = time(NULL); |
133 | 133 | ||
134 | if (use_cache) { | 134 | if (use_cache) { |
135 | stdout2 = chk_positive(dup(STDOUT_FILENO), | 135 | stdout2 = chk_positive(dup(STDOUT_FILENO), |
136 | "Preserving STDOUT"); | 136 | "Preserving STDOUT"); |
137 | chk_zero(close(STDOUT_FILENO), "Closing STDOUT"); | 137 | chk_zero(close(STDOUT_FILENO), "Closing STDOUT"); |
138 | chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)"); | 138 | chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)"); |
139 | } | 139 | } |
140 | 140 | ||
141 | if (cgit_query_repo) | 141 | if (cgit_query_repo) |
142 | cgit_print_repo_page(item); | 142 | cgit_print_repo_page(item); |
143 | else | 143 | else |
144 | cgit_print_repolist(item); | 144 | cgit_print_repolist(item); |
145 | 145 | ||
146 | if (use_cache) { | 146 | if (use_cache) { |
147 | chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT"); | 147 | chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT"); |
148 | chk_positive(dup2(stdout2, STDOUT_FILENO), | 148 | chk_positive(dup2(stdout2, STDOUT_FILENO), |
149 | "Restoring original STDOUT"); | 149 | "Restoring original STDOUT"); |
150 | chk_zero(close(stdout2), "Closing temporary STDOUT"); | 150 | chk_zero(close(stdout2), "Closing temporary STDOUT"); |
151 | } | 151 | } |
152 | 152 | ||
153 | chdir(buf); | 153 | chdir(buf); |
154 | } | 154 | } |
155 | 155 | ||
156 | static void cgit_check_cache(struct cacheitem *item) | 156 | static void cgit_check_cache(struct cacheitem *item) |
157 | { | 157 | { |
158 | int i = 0; | 158 | int i = 0; |
159 | 159 | ||
160 | top: | 160 | top: |
161 | if (++i > cgit_max_lock_attempts) { | 161 | if (++i > cgit_max_lock_attempts) { |
162 | die("cgit_refresh_cache: unable to lock %s: %s", | 162 | die("cgit_refresh_cache: unable to lock %s: %s", |
163 | item->name, strerror(errno)); | 163 | item->name, strerror(errno)); |
164 | } | 164 | } |
165 | if (!cache_exist(item)) { | 165 | if (!cache_exist(item)) { |
166 | if (!cache_lock(item)) { | 166 | if (!cache_lock(item)) { |
167 | sleep(1); | 167 | sleep(1); |
168 | goto top; | 168 | goto top; |
169 | } | 169 | } |
170 | if (!cache_exist(item)) { | 170 | if (!cache_exist(item)) { |
171 | cgit_fill_cache(item, 1); | 171 | cgit_fill_cache(item, 1); |
172 | cache_unlock(item); | 172 | cache_unlock(item); |
173 | } else { | 173 | } else { |
174 | cache_cancel_lock(item); | 174 | cache_cancel_lock(item); |
175 | } | 175 | } |
176 | } else if (cache_expired(item) && cache_lock(item)) { | 176 | } else if (cache_expired(item) && cache_lock(item)) { |
177 | if (cache_expired(item)) { | 177 | if (cache_expired(item)) { |
178 | cgit_fill_cache(item, 1); | 178 | cgit_fill_cache(item, 1); |
179 | cache_unlock(item); | 179 | cache_unlock(item); |
180 | } else { | 180 | } else { |
181 | cache_cancel_lock(item); | 181 | cache_cancel_lock(item); |
182 | } | 182 | } |
183 | } | 183 | } |
184 | } | 184 | } |
185 | 185 | ||
186 | static void cgit_print_cache(struct cacheitem *item) | 186 | static void cgit_print_cache(struct cacheitem *item) |
187 | { | 187 | { |
188 | static char buf[4096]; | 188 | static char buf[4096]; |
189 | ssize_t i; | 189 | ssize_t i; |
190 | 190 | ||
191 | int fd = open(item->name, O_RDONLY); | 191 | int fd = open(item->name, O_RDONLY); |
192 | if (fd<0) | 192 | if (fd<0) |
193 | die("Unable to open cached file %s", item->name); | 193 | die("Unable to open cached file %s", item->name); |
194 | 194 | ||
195 | while((i=read(fd, buf, sizeof(buf))) > 0) | 195 | while((i=read(fd, buf, sizeof(buf))) > 0) |
196 | write(STDOUT_FILENO, buf, i); | 196 | write(STDOUT_FILENO, buf, i); |
197 | 197 | ||
198 | close(fd); | 198 | close(fd); |
199 | } | 199 | } |
200 | 200 | ||
201 | static void cgit_parse_args(int argc, const char **argv) | 201 | static void cgit_parse_args(int argc, const char **argv) |
202 | { | 202 | { |
203 | int i; | 203 | int i; |
204 | 204 | ||
205 | for (i = 1; i < argc; i++) { | 205 | for (i = 1; i < argc; i++) { |
206 | if (!strncmp(argv[i], "--cache=", 8)) { | 206 | if (!strncmp(argv[i], "--cache=", 8)) { |
207 | cgit_cache_root = xstrdup(argv[i]+8); | 207 | cgit_cache_root = xstrdup(argv[i]+8); |
208 | } | 208 | } |
209 | if (!strcmp(argv[i], "--nocache")) { | 209 | if (!strcmp(argv[i], "--nocache")) { |
210 | cgit_nocache = 1; | 210 | cgit_nocache = 1; |
211 | } | 211 | } |
212 | if (!strncmp(argv[i], "--query=", 8)) { | 212 | if (!strncmp(argv[i], "--query=", 8)) { |
213 | cgit_querystring = xstrdup(argv[i]+8); | 213 | cgit_querystring = xstrdup(argv[i]+8); |
214 | } | 214 | } |
215 | if (!strncmp(argv[i], "--repo=", 7)) { | 215 | if (!strncmp(argv[i], "--repo=", 7)) { |
216 | cgit_query_repo = xstrdup(argv[i]+7); | 216 | cgit_query_repo = xstrdup(argv[i]+7); |
217 | } | 217 | } |
218 | if (!strncmp(argv[i], "--page=", 7)) { | 218 | if (!strncmp(argv[i], "--page=", 7)) { |
219 | cgit_query_page = xstrdup(argv[i]+7); | 219 | cgit_query_page = xstrdup(argv[i]+7); |
220 | } | 220 | } |
221 | if (!strncmp(argv[i], "--head=", 7)) { | 221 | if (!strncmp(argv[i], "--head=", 7)) { |
222 | cgit_query_head = xstrdup(argv[i]+7); | 222 | cgit_query_head = xstrdup(argv[i]+7); |
223 | cgit_query_has_symref = 1; | 223 | cgit_query_has_symref = 1; |
224 | } | 224 | } |
225 | if (!strncmp(argv[i], "--sha1=", 7)) { | 225 | if (!strncmp(argv[i], "--sha1=", 7)) { |
226 | cgit_query_sha1 = xstrdup(argv[i]+7); | 226 | cgit_query_sha1 = xstrdup(argv[i]+7); |
227 | cgit_query_has_sha1 = 1; | 227 | cgit_query_has_sha1 = 1; |
228 | } | 228 | } |
229 | if (!strncmp(argv[i], "--ofs=", 6)) { | 229 | if (!strncmp(argv[i], "--ofs=", 6)) { |
230 | cgit_query_ofs = atoi(argv[i]+6); | 230 | cgit_query_ofs = atoi(argv[i]+6); |
231 | } | 231 | } |
232 | } | 232 | } |
233 | } | 233 | } |
234 | 234 | ||
235 | int main(int argc, const char **argv) | 235 | int main(int argc, const char **argv) |
236 | { | 236 | { |
237 | struct cacheitem item; | 237 | struct cacheitem item; |
238 | 238 | ||
239 | htmlfd = STDOUT_FILENO; | 239 | htmlfd = STDOUT_FILENO; |
240 | item.st.st_mtime = time(NULL); | 240 | item.st.st_mtime = time(NULL); |
241 | cgit_repolist.length = 0; | 241 | cgit_repolist.length = 0; |
242 | cgit_repolist.count = 0; | 242 | cgit_repolist.count = 0; |
243 | cgit_repolist.repos = NULL; | 243 | cgit_repolist.repos = NULL; |
244 | 244 | ||
245 | cgit_read_config("/etc/cgitrc", cgit_global_config_cb); | 245 | cgit_read_config("/etc/cgitrc", cgit_global_config_cb); |
246 | if (getenv("QUERY_STRING")) | 246 | if (getenv("QUERY_STRING")) |
247 | cgit_querystring = xstrdup(getenv("QUERY_STRING")); | 247 | cgit_querystring = xstrdup(getenv("QUERY_STRING")); |
248 | cgit_parse_args(argc, argv); | 248 | cgit_parse_args(argc, argv); |
249 | cgit_parse_query(cgit_querystring, cgit_querystring_cb); | 249 | cgit_parse_query(cgit_querystring, cgit_querystring_cb); |
250 | if (!cgit_prepare_cache(&item)) | 250 | if (!cgit_prepare_cache(&item)) |
251 | return 0; | 251 | return 0; |
252 | if (cgit_nocache) { | 252 | if (cgit_nocache) { |
253 | cgit_fill_cache(&item, 0); | 253 | cgit_fill_cache(&item, 0); |
254 | } else { | 254 | } else { |
255 | cgit_check_cache(&item); | 255 | cgit_check_cache(&item); |
256 | cgit_print_cache(&item); | 256 | cgit_print_cache(&item); |
257 | } | 257 | } |
258 | return 0; | 258 | return 0; |
259 | } | 259 | } |