summaryrefslogtreecommitdiffabout
path: root/ui-log.c
authorJohan Herland <johan@herland.net>2010-11-15 17:39:51 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-11-16 07:18:37 (UTC)
commit268b34af23cdcac87aed3300bfe6154cbc65753e (patch) (unidiff)
treefccbebc21c004f5967947275ba5086589086ec36 /ui-log.c
parent9a8d39c668b98464bac97d4e5442966de63f97b2 (diff)
downloadcgit-268b34af23cdcac87aed3300bfe6154cbc65753e.zip
cgit-268b34af23cdcac87aed3300bfe6154cbc65753e.tar.gz
cgit-268b34af23cdcac87aed3300bfe6154cbc65753e.tar.bz2
ui-log: Colorize commit graph
Use the existing coloring logic in Git's graph code to color the lines between commits in the commit graph. Whereas Git normally uses ANSI color escapes to produce colors, we here use graph_set_column_colors() to replace those with HTML color escapes, that embed the graph lines in <span> tags that apply the desired color using CSS. Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
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,47 +1,62 @@
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);
@@ -244,65 +259,69 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
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) {