aboutsummaryrefslogtreecommitdiffstats
path: root/ui-log.c
diff options
context:
space:
mode:
authorGravatar John Keeping <john@keeping.me.uk>2013-04-06 18:28:57 (JST)
committerGravatar Jason A. Donenfeld <Jason@zx2c4.com>2013-04-08 23:12:52 (JST)
commitfb3655df3bf85bd405c5921bbd4b3a54c705c839 (patch)
tree419a962a0b82f5ba3023791549044ff462229250 /ui-log.c
parent42d5476f258e7909682f1b611da00d64507d45c6 (diff)
downloadcgit-fb3655df3bf85bd405c5921bbd4b3a54c705c839.zip
cgit-fb3655df3bf85bd405c5921bbd4b3a54c705c839.tar.gz
use struct strbuf instead of static buffers
Use "struct strbuf" from Git to remove the limit on file path length. Notes on scan-tree: This is slightly involved since I decided to pass the strbuf into add_repo() and modify if whenever a new file name is required, which should avoid any extra allocations within that function. The pattern there is to append the filename, use it and then reset the buffer to its original length (retaining a trailing '/'). Notes on ui-snapshot: Since write_archive modifies the argv array passed to it we copy the argv_array values into a new array of char* and then free the original argv_array structure and the new array without worrying about what the values now look like. Signed-off-by: John Keeping <john@keeping.me.uk>
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}