summaryrefslogtreecommitdiffabout
path: root/shared.c
Unidiff
Diffstat (limited to 'shared.c') (more/less context) (ignore whitespace changes)
-rw-r--r--shared.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/shared.c b/shared.c
index ab00bc9..45db735 100644
--- a/shared.c
+++ b/shared.c
@@ -183,125 +183,147 @@ void cgit_global_config_cb(const char *name, const char *value)
183 cgit_repo->path = xstrdup(value); 183 cgit_repo->path = xstrdup(value);
184 else if (cgit_repo && !strcmp(name, "repo.desc")) 184 else if (cgit_repo && !strcmp(name, "repo.desc"))
185 cgit_repo->desc = xstrdup(value); 185 cgit_repo->desc = xstrdup(value);
186 else if (cgit_repo && !strcmp(name, "repo.owner")) 186 else if (cgit_repo && !strcmp(name, "repo.owner"))
187 cgit_repo->owner = xstrdup(value); 187 cgit_repo->owner = xstrdup(value);
188 else if (cgit_repo && !strcmp(name, "repo.defbranch")) 188 else if (cgit_repo && !strcmp(name, "repo.defbranch"))
189 cgit_repo->defbranch = xstrdup(value); 189 cgit_repo->defbranch = xstrdup(value);
190 else if (cgit_repo && !strcmp(name, "repo.snapshots")) 190 else if (cgit_repo && !strcmp(name, "repo.snapshots"))
191 cgit_repo->snapshots = cgit_snapshots * atoi(value); 191 cgit_repo->snapshots = cgit_snapshots * atoi(value);
192 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount")) 192 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
193 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value); 193 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
194 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount")) 194 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
195 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value); 195 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value);
196 else if (cgit_repo && !strcmp(name, "repo.module-link")) 196 else if (cgit_repo && !strcmp(name, "repo.module-link"))
197 cgit_repo->module_link= xstrdup(value); 197 cgit_repo->module_link= xstrdup(value);
198 else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) { 198 else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) {
199 if (*value == '/') 199 if (*value == '/')
200 cgit_repo->readme = xstrdup(value); 200 cgit_repo->readme = xstrdup(value);
201 else 201 else
202 cgit_repo->readme = xstrdup(fmt("%s/%s", cgit_repo->path, value)); 202 cgit_repo->readme = xstrdup(fmt("%s/%s", cgit_repo->path, value));
203 } else if (!strcmp(name, "include")) 203 } else if (!strcmp(name, "include"))
204 cgit_read_config(value, cgit_global_config_cb); 204 cgit_read_config(value, cgit_global_config_cb);
205} 205}
206 206
207void cgit_querystring_cb(const char *name, const char *value) 207void cgit_querystring_cb(const char *name, const char *value)
208{ 208{
209 if (!strcmp(name,"r")) { 209 if (!strcmp(name,"r")) {
210 cgit_query_repo = xstrdup(value); 210 cgit_query_repo = xstrdup(value);
211 cgit_repo = cgit_get_repoinfo(value); 211 cgit_repo = cgit_get_repoinfo(value);
212 } else if (!strcmp(name, "p")) { 212 } else if (!strcmp(name, "p")) {
213 cgit_query_page = xstrdup(value); 213 cgit_query_page = xstrdup(value);
214 cgit_cmd = cgit_get_cmd_index(value); 214 cgit_cmd = cgit_get_cmd_index(value);
215 } else if (!strcmp(name, "url")) { 215 } else if (!strcmp(name, "url")) {
216 cgit_parse_url(value); 216 cgit_parse_url(value);
217 } else if (!strcmp(name, "q")) { 217 } else if (!strcmp(name, "q")) {
218 cgit_query_search = xstrdup(value); 218 cgit_query_search = xstrdup(value);
219 } else if (!strcmp(name, "h")) { 219 } else if (!strcmp(name, "h")) {
220 cgit_query_head = xstrdup(value); 220 cgit_query_head = xstrdup(value);
221 cgit_query_has_symref = 1; 221 cgit_query_has_symref = 1;
222 } else if (!strcmp(name, "id")) { 222 } else if (!strcmp(name, "id")) {
223 cgit_query_sha1 = xstrdup(value); 223 cgit_query_sha1 = xstrdup(value);
224 cgit_query_has_sha1 = 1; 224 cgit_query_has_sha1 = 1;
225 } else if (!strcmp(name, "id2")) { 225 } else if (!strcmp(name, "id2")) {
226 cgit_query_sha2 = xstrdup(value); 226 cgit_query_sha2 = xstrdup(value);
227 cgit_query_has_sha1 = 1; 227 cgit_query_has_sha1 = 1;
228 } else if (!strcmp(name, "ofs")) { 228 } else if (!strcmp(name, "ofs")) {
229 cgit_query_ofs = atoi(value); 229 cgit_query_ofs = atoi(value);
230 } else if (!strcmp(name, "path")) { 230 } else if (!strcmp(name, "path")) {
231 cgit_query_path = xstrdup(value); 231 cgit_query_path = trim_end(value, '/');
232 } else if (!strcmp(name, "name")) { 232 } else if (!strcmp(name, "name")) {
233 cgit_query_name = xstrdup(value); 233 cgit_query_name = xstrdup(value);
234 } 234 }
235} 235}
236 236
237void *cgit_free_commitinfo(struct commitinfo *info) 237void *cgit_free_commitinfo(struct commitinfo *info)
238{ 238{
239 free(info->author); 239 free(info->author);
240 free(info->author_email); 240 free(info->author_email);
241 free(info->committer); 241 free(info->committer);
242 free(info->committer_email); 242 free(info->committer_email);
243 free(info->subject); 243 free(info->subject);
244 free(info); 244 free(info);
245 return NULL; 245 return NULL;
246} 246}
247 247
248int hextoint(char c) 248int hextoint(char c)
249{ 249{
250 if (c >= 'a' && c <= 'f') 250 if (c >= 'a' && c <= 'f')
251 return 10 + c - 'a'; 251 return 10 + c - 'a';
252 else if (c >= 'A' && c <= 'F') 252 else if (c >= 'A' && c <= 'F')
253 return 10 + c - 'A'; 253 return 10 + c - 'A';
254 else if (c >= '0' && c <= '9') 254 else if (c >= '0' && c <= '9')
255 return c - '0'; 255 return c - '0';
256 else 256 else
257 return -1; 257 return -1;
258} 258}
259 259
260char *trim_end(const char *str, char c)
261{
262 int len;
263 char *s, *t;
264
265 if (str == NULL)
266 return NULL;
267 t = (char *)str;
268 len = strlen(t);
269 while(len > 0 && t[len - 1] == c)
270 len--;
271
272 if (len == 0)
273 return NULL;
274
275 c = t[len];
276 t[len] = '\0';
277 s = xstrdup(t);
278 t[len] = c;
279 return s;
280}
281
260void cgit_diff_tree_cb(struct diff_queue_struct *q, 282void cgit_diff_tree_cb(struct diff_queue_struct *q,
261 struct diff_options *options, void *data) 283 struct diff_options *options, void *data)
262{ 284{
263 int i; 285 int i;
264 286
265 for (i = 0; i < q->nr; i++) { 287 for (i = 0; i < q->nr; i++) {
266 if (q->queue[i]->status == 'U') 288 if (q->queue[i]->status == 'U')
267 continue; 289 continue;
268 ((filepair_fn)data)(q->queue[i]); 290 ((filepair_fn)data)(q->queue[i]);
269 } 291 }
270} 292}
271 293
272static int load_mmfile(mmfile_t *file, const unsigned char *sha1) 294static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
273{ 295{
274 enum object_type type; 296 enum object_type type;
275 297
276 if (is_null_sha1(sha1)) { 298 if (is_null_sha1(sha1)) {
277 file->ptr = (char *)""; 299 file->ptr = (char *)"";
278 file->size = 0; 300 file->size = 0;
279 } else { 301 } else {
280 file->ptr = read_sha1_file(sha1, &type, &file->size); 302 file->ptr = read_sha1_file(sha1, &type, &file->size);
281 } 303 }
282 return 1; 304 return 1;
283} 305}
284 306
285/* 307/*
286 * Receive diff-buffers from xdiff and concatenate them as 308 * Receive diff-buffers from xdiff and concatenate them as
287 * needed across multiple callbacks. 309 * needed across multiple callbacks.
288 * 310 *
289 * This is basically a copy of xdiff-interface.c/xdiff_outf(), 311 * This is basically a copy of xdiff-interface.c/xdiff_outf(),
290 * ripped from git and modified to use globals instead of 312 * ripped from git and modified to use globals instead of
291 * a special callback-struct. 313 * a special callback-struct.
292 */ 314 */
293char *diffbuf = NULL; 315char *diffbuf = NULL;
294int buflen = 0; 316int buflen = 0;
295 317
296int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) 318int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf)
297{ 319{
298 int i; 320 int i;
299 321
300 for (i = 0; i < nbuf; i++) { 322 for (i = 0; i < nbuf; i++) {
301 if (mb[i].ptr[mb[i].size-1] != '\n') { 323 if (mb[i].ptr[mb[i].size-1] != '\n') {
302 /* Incomplete line */ 324 /* Incomplete line */
303 diffbuf = xrealloc(diffbuf, buflen + mb[i].size); 325 diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
304 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); 326 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
305 buflen += mb[i].size; 327 buflen += mb[i].size;
306 continue; 328 continue;
307 } 329 }