aboutsummaryrefslogtreecommitdiffstats
path: root/ui-log.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui-log.c')
-rw-r--r--ui-log.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/ui-log.c b/ui-log.c
index 8592843..93af0ce 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -243,15 +243,19 @@ static void print_commit(struct commit *commit, struct rev_info *revs)
243 cgit_free_commitinfo(info); 243 cgit_free_commitinfo(info);
244} 244}
245 245
246static const char *disambiguate_ref(const char *ref) 246static const char *disambiguate_ref(const char *ref, int *must_free_result)
247{ 247{
248 unsigned char sha1[20]; 248 unsigned char sha1[20];
249 const char *longref; 249 struct strbuf longref = STRBUF_INIT;
250 250
251 longref = fmt("refs/heads/%s", ref); 251 strbuf_addf(&longref, "refs/heads/%s", ref);
252 if (get_sha1(longref, sha1) == 0) 252 if (get_sha1(longref.buf, sha1) == 0) {
253 return longref; 253 *must_free_result = 1;
254 return strbuf_detach(&longref, NULL);
255 }
254 256
257 *must_free_result = 0;
258 strbuf_release(&longref);
255 return ref; 259 return ref;
256} 260}
257 261
@@ -284,24 +288,26 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
284 struct commit *commit; 288 struct commit *commit;
285 struct vector vec = VECTOR_INIT(char *); 289 struct vector vec = VECTOR_INIT(char *);
286 int i, columns = commit_graph ? 4 : 3; 290 int i, columns = commit_graph ? 4 : 3;
287 char *arg; 291 int must_free_tip = 0;
292 struct strbuf argbuf = STRBUF_INIT;
288 293
289 /* First argv is NULL */ 294 /* First argv is NULL */
290 vector_push(&vec, NULL, 0); 295 vector_push(&vec, NULL, 0);
291 296
292 if (!tip) 297 if (!tip)
293 tip = ctx.qry.head; 298 tip = ctx.qry.head;
294 tip = disambiguate_ref(tip); 299 tip = disambiguate_ref(tip, &must_free_tip);
295 vector_push(&vec, &tip, 0); 300 vector_push(&vec, &tip, 0);
296 301
297 if (grep && pattern && *pattern) { 302 if (grep && pattern && *pattern) {
298 pattern = xstrdup(pattern); 303 pattern = xstrdup(pattern);
299 if (!strcmp(grep, "grep") || !strcmp(grep, "author") || 304 if (!strcmp(grep, "grep") || !strcmp(grep, "author") ||
300 !strcmp(grep, "committer")) { 305 !strcmp(grep, "committer")) {
301 arg = fmt("--%s=%s", grep, pattern); 306 strbuf_addf(&argbuf, "--%s=%s", grep, pattern);
302 vector_push(&vec, &arg, 0); 307 vector_push(&vec, &argbuf.buf, 0);
303 } 308 }
304 if (!strcmp(grep, "range")) { 309 if (!strcmp(grep, "range")) {
310 char *arg;
305 /* Split the pattern at whitespace and add each token 311 /* Split the pattern at whitespace and add each token
306 * as a revision expression. Do not accept other 312 * as a revision expression. Do not accept other
307 * rev-list options. Also, replace the previously 313 * rev-list options. Also, replace the previously
@@ -336,8 +342,8 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
336 } 342 }
337 343
338 if (path) { 344 if (path) {
339 arg = "--"; 345 static const char *double_dash_arg = "--";
340 vector_push(&vec, &arg, 0); 346 vector_push(&vec, &double_dash_arg, 0);
341 vector_push(&vec, &path, 0); 347 vector_push(&vec, &path, 0);
342 } 348 }
343 349
@@ -430,4 +436,9 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
430 ctx.qry.vpath, 0, NULL, NULL, ctx.qry.showmsg); 436 ctx.qry.vpath, 0, NULL, NULL, ctx.qry.showmsg);
431 html("</td></tr>\n"); 437 html("</td></tr>\n");
432 } 438 }
439
440 /* If we allocated tip then it is safe to cast away const. */
441 if (must_free_tip)
442 free((char*) tip);
443 strbuf_release(&argbuf);
433} 444}