summaryrefslogtreecommitdiffabout
path: root/ui-log.c
Unidiff
Diffstat (limited to 'ui-log.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-log.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/ui-log.c b/ui-log.c
index 0d86fd5..5cf66cb 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -1,63 +1,78 @@
1/* ui-log.c: functions for log output 1/* ui-log.c: functions for log output
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#include "html.h" 10#include "html.h"
11#include "ui-shared.h" 11#include "ui-shared.h"
12#include "vector.h" 12#include "vector.h"
13 13
14int files, add_lines, rem_lines; 14int files, add_lines, rem_lines;
15 15
16/*
17 * The list of available column colors in the commit graph.
18 */
19static const char *column_colors_html[] = {
20 "<span class='column1'>",
21 "<span class='column2'>",
22 "<span class='column3'>",
23 "<span class='column4'>",
24 "<span class='column5'>",
25 "<span class='column6'>",
26 "</span>",
27};
28
29#define COLUMN_COLORS_HTML_MAX (ARRAY_SIZE(column_colors_html) - 1)
30
16void count_lines(char *line, int size) 31void count_lines(char *line, int size)
17{ 32{
18 if (size <= 0) 33 if (size <= 0)
19 return; 34 return;
20 35
21 if (line[0] == '+') 36 if (line[0] == '+')
22 add_lines++; 37 add_lines++;
23 38
24 else if (line[0] == '-') 39 else if (line[0] == '-')
25 rem_lines++; 40 rem_lines++;
26} 41}
27 42
28void inspect_files(struct diff_filepair *pair) 43void inspect_files(struct diff_filepair *pair)
29{ 44{
30 unsigned long old_size = 0; 45 unsigned long old_size = 0;
31 unsigned long new_size = 0; 46 unsigned long new_size = 0;
32 int binary = 0; 47 int binary = 0;
33 48
34 files++; 49 files++;
35 if (ctx.repo->enable_log_linecount) 50 if (ctx.repo->enable_log_linecount)
36 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, 51 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
37 &new_size, &binary, 0, ctx.qry.ignorews, 52 &new_size, &binary, 0, ctx.qry.ignorews,
38 count_lines); 53 count_lines);
39} 54}
40 55
41void show_commit_decorations(struct commit *commit) 56void show_commit_decorations(struct commit *commit)
42{ 57{
43 struct name_decoration *deco; 58 struct name_decoration *deco;
44 static char buf[1024]; 59 static char buf[1024];
45 60
46 buf[sizeof(buf) - 1] = 0; 61 buf[sizeof(buf) - 1] = 0;
47 deco = lookup_decoration(&name_decoration, &commit->object); 62 deco = lookup_decoration(&name_decoration, &commit->object);
48 while (deco) { 63 while (deco) {
49 if (!prefixcmp(deco->name, "refs/heads/")) { 64 if (!prefixcmp(deco->name, "refs/heads/")) {
50 strncpy(buf, deco->name + 11, sizeof(buf) - 1); 65 strncpy(buf, deco->name + 11, sizeof(buf) - 1);
51 cgit_log_link(buf, NULL, "branch-deco", buf, NULL, 66 cgit_log_link(buf, NULL, "branch-deco", buf, NULL,
52 ctx.qry.vpath, 0, NULL, NULL, 67 ctx.qry.vpath, 0, NULL, NULL,
53 ctx.qry.showmsg); 68 ctx.qry.showmsg);
54 } 69 }
55 else if (!prefixcmp(deco->name, "tag: refs/tags/")) { 70 else if (!prefixcmp(deco->name, "tag: refs/tags/")) {
56 strncpy(buf, deco->name + 15, sizeof(buf) - 1); 71 strncpy(buf, deco->name + 15, sizeof(buf) - 1);
57 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf); 72 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf);
58 } 73 }
59 else if (!prefixcmp(deco->name, "refs/tags/")) { 74 else if (!prefixcmp(deco->name, "refs/tags/")) {
60 strncpy(buf, deco->name + 10, sizeof(buf) - 1); 75 strncpy(buf, deco->name + 10, sizeof(buf) - 1);
61 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf); 76 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf);
62 } 77 }
63 else if (!prefixcmp(deco->name, "refs/remotes/")) { 78 else if (!prefixcmp(deco->name, "refs/remotes/")) {
@@ -228,97 +243,101 @@ static char *next_token(char **src)
228 (*src)++; 243 (*src)++;
229 } 244 }
230 return result; 245 return result;
231} 246}
232 247
233void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, 248void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern,
234 char *path, int pager) 249 char *path, int pager)
235{ 250{
236 struct rev_info rev; 251 struct rev_info rev;
237 struct commit *commit; 252 struct commit *commit;
238 struct vector vec = VECTOR_INIT(char *); 253 struct vector vec = VECTOR_INIT(char *);
239 int i, columns = 3; 254 int i, columns = 3;
240 char *arg; 255 char *arg;
241 256
242 /* First argv is NULL */ 257 /* First argv is NULL */
243 vector_push(&vec, NULL, 0); 258 vector_push(&vec, NULL, 0);
244 259
245 if (!tip) 260 if (!tip)
246 tip = ctx.qry.head; 261 tip = ctx.qry.head;
247 tip = disambiguate_ref(tip); 262 tip = disambiguate_ref(tip);
248 vector_push(&vec, &tip, 0); 263 vector_push(&vec, &tip, 0);
249 264
250 if (grep && pattern && *pattern) { 265 if (grep && pattern && *pattern) {
251 pattern = xstrdup(pattern); 266 pattern = xstrdup(pattern);
252 if (!strcmp(grep, "grep") || !strcmp(grep, "author") || 267 if (!strcmp(grep, "grep") || !strcmp(grep, "author") ||
253 !strcmp(grep, "committer")) { 268 !strcmp(grep, "committer")) {
254 arg = fmt("--%s=%s", grep, pattern); 269 arg = fmt("--%s=%s", grep, pattern);
255 vector_push(&vec, &arg, 0); 270 vector_push(&vec, &arg, 0);
256 } 271 }
257 if (!strcmp(grep, "range")) { 272 if (!strcmp(grep, "range")) {
258 /* Split the pattern at whitespace and add each token 273 /* Split the pattern at whitespace and add each token
259 * as a revision expression. Do not accept other 274 * as a revision expression. Do not accept other
260 * rev-list options. Also, replace the previously 275 * rev-list options. Also, replace the previously
261 * pushed tip (it's no longer relevant). 276 * pushed tip (it's no longer relevant).
262 */ 277 */
263 vec.count--; 278 vec.count--;
264 while ((arg = next_token(&pattern))) { 279 while ((arg = next_token(&pattern))) {
265 if (*arg == '-') { 280 if (*arg == '-') {
266 fprintf(stderr, "Bad range expr: %s\n", 281 fprintf(stderr, "Bad range expr: %s\n",
267 arg); 282 arg);
268 break; 283 break;
269 } 284 }
270 vector_push(&vec, &arg, 0); 285 vector_push(&vec, &arg, 0);
271 } 286 }
272 } 287 }
273 } 288 }
274 if (ctx.repo->enable_commit_graph) { 289 if (ctx.repo->enable_commit_graph) {
275 static const char *graph_arg = "--graph"; 290 static const char *graph_arg = "--graph";
291 static const char *color_arg = "--color";
276 vector_push(&vec, &graph_arg, 0); 292 vector_push(&vec, &graph_arg, 0);
293 vector_push(&vec, &color_arg, 0);
294 graph_set_column_colors(column_colors_html,
295 COLUMN_COLORS_HTML_MAX);
277 } 296 }
278 297
279 if (path) { 298 if (path) {
280 arg = "--"; 299 arg = "--";
281 vector_push(&vec, &arg, 0); 300 vector_push(&vec, &arg, 0);
282 vector_push(&vec, &path, 0); 301 vector_push(&vec, &path, 0);
283 } 302 }
284 303
285 /* Make sure the vector is NULL-terminated */ 304 /* Make sure the vector is NULL-terminated */
286 vector_push(&vec, NULL, 0); 305 vector_push(&vec, NULL, 0);
287 vec.count--; 306 vec.count--;
288 307
289 init_revisions(&rev, NULL); 308 init_revisions(&rev, NULL);
290 rev.abbrev = DEFAULT_ABBREV; 309 rev.abbrev = DEFAULT_ABBREV;
291 rev.commit_format = CMIT_FMT_DEFAULT; 310 rev.commit_format = CMIT_FMT_DEFAULT;
292 rev.verbose_header = 1; 311 rev.verbose_header = 1;
293 rev.show_root_diff = 0; 312 rev.show_root_diff = 0;
294 setup_revisions(vec.count, vec.data, &rev, NULL); 313 setup_revisions(vec.count, vec.data, &rev, NULL);
295 load_ref_decorations(DECORATE_FULL_REFS); 314 load_ref_decorations(DECORATE_FULL_REFS);
296 rev.show_decorations = 1; 315 rev.show_decorations = 1;
297 rev.grep_filter.regflags |= REG_ICASE; 316 rev.grep_filter.regflags |= REG_ICASE;
298 compile_grep_patterns(&rev.grep_filter); 317 compile_grep_patterns(&rev.grep_filter);
299 prepare_revision_walk(&rev); 318 prepare_revision_walk(&rev);
300 319
301 if (pager) 320 if (pager)
302 html("<table class='list nowrap'>"); 321 html("<table class='list nowrap'>");
303 322
304 html("<tr class='nohover'><th class='left'>Age</th>"); 323 html("<tr class='nohover'><th class='left'>Age</th>");
305 if (ctx.repo->enable_commit_graph) 324 if (ctx.repo->enable_commit_graph)
306 html("<th></th>"); 325 html("<th></th>");
307 html("<th class='left'>Commit message"); 326 html("<th class='left'>Commit message");
308 if (pager) { 327 if (pager) {
309 html(" ("); 328 html(" (");
310 cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL, 329 cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL,
311 NULL, ctx.qry.head, ctx.qry.sha1, 330 NULL, ctx.qry.head, ctx.qry.sha1,
312 ctx.qry.vpath, ctx.qry.ofs, ctx.qry.grep, 331 ctx.qry.vpath, ctx.qry.ofs, ctx.qry.grep,
313 ctx.qry.search, ctx.qry.showmsg ? 0 : 1); 332 ctx.qry.search, ctx.qry.showmsg ? 0 : 1);
314 html(")"); 333 html(")");
315 } 334 }
316 html("</th><th class='left'>Author</th>"); 335 html("</th><th class='left'>Author</th>");
317 if (ctx.repo->enable_log_filecount) { 336 if (ctx.repo->enable_log_filecount) {
318 html("<th class='left'>Files</th>"); 337 html("<th class='left'>Files</th>");
319 columns++; 338 columns++;
320 if (ctx.repo->enable_log_linecount) { 339 if (ctx.repo->enable_log_linecount) {
321 html("<th class='left'>Lines</th>"); 340 html("<th class='left'>Lines</th>");
322 columns++; 341 columns++;
323 } 342 }
324 } 343 }