summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2007-05-15 00:13:11 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-15 07:09:42 (UTC)
commite903011c4457c24c0095f270ca5e78c40729434f (patch) (unidiff)
tree255f128dfaf81f2fd03bb2216039bbf8f38ef167
parentcfd2aa079770ddb4c93d5995b2cd7b5f25da3681 (diff)
downloadcgit-e903011c4457c24c0095f270ca5e78c40729434f.zip
cgit-e903011c4457c24c0095f270ca5e78c40729434f.tar.gz
cgit-e903011c4457c24c0095f270ca5e78c40729434f.tar.bz2
Use tables and css to create the diffstat graph, fix scaling
There was no need to use image-files for the graphs, so lets drop them. At the same time, fix scaling of the graphs so that the full width is used only if atleast 100 LOC are changed in one of the files. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Makefile1
-rw-r--r--add.pngbin168 -> 0 bytes
-rw-r--r--cgit.css21
-rw-r--r--del.pngbin168 -> 0 bytes
-rw-r--r--ui-commit.c20
5 files changed, 27 insertions, 15 deletions
diff --git a/Makefile b/Makefile
index 96d68cb..aa7146d 100644
--- a/Makefile
+++ b/Makefile
@@ -39,47 +39,46 @@ INITGIT = ./submodules.sh -i
39endif 39endif
40 40
41 41
42# 42#
43# basic build rules 43# basic build rules
44# 44#
45all: cgit 45all: cgit
46 46
47cgit: cgit.c cgit.h $(OBJECTS) 47cgit: cgit.c cgit.h $(OBJECTS)
48 $(CC) $(CFLAGS) cgit.c -o cgit $(OBJECTS) $(EXTLIBS) 48 $(CC) $(CFLAGS) cgit.c -o cgit $(OBJECTS) $(EXTLIBS)
49 49
50$(OBJECTS): cgit.h git/libgit.a 50$(OBJECTS): cgit.h git/libgit.a
51 51
52git/libgit.a: 52git/libgit.a:
53 $(INITGIT) 53 $(INITGIT)
54 $(MAKE) -C git 54 $(MAKE) -C git
55 55
56# 56#
57# phony targets 57# phony targets
58# 58#
59install: all clean-cache 59install: all clean-cache
60 mkdir -p $(prefix) 60 mkdir -p $(prefix)
61 install cgit $(prefix)/$(CGIT_SCRIPT_NAME) 61 install cgit $(prefix)/$(CGIT_SCRIPT_NAME)
62 install cgit.css $(prefix)/cgit.css 62 install cgit.css $(prefix)/cgit.css
63 install add.png del.png $(prefix)/
64 63
65clean-cgit: 64clean-cgit:
66 rm -f cgit *.o 65 rm -f cgit *.o
67 66
68distclean-cgit: clean-cgit 67distclean-cgit: clean-cgit
69 git clean -d -x 68 git clean -d -x
70 69
71clean-sub: 70clean-sub:
72 $(MAKE) -C git clean 71 $(MAKE) -C git clean
73 72
74distclean-sub: clean-sub 73distclean-sub: clean-sub
75 $(shell cd git && git clean -d -x) 74 $(shell cd git && git clean -d -x)
76 75
77clean-cache: 76clean-cache:
78 rm -rf $(CACHE_ROOT)/* 77 rm -rf $(CACHE_ROOT)/*
79 78
80clean: clean-cgit clean-sub 79clean: clean-cgit clean-sub
81 80
82distclean: distclean-cgit distclean-sub 81distclean: distclean-cgit distclean-sub
83 82
84.PHONY: all install clean clean-cgit clean-sub clean-cache \ 83.PHONY: all install clean clean-cgit clean-sub clean-cache \
85 distclean distclean-cgit distclean-sub 84 distclean distclean-cgit distclean-sub
diff --git a/add.png b/add.png
deleted file mode 100644
index c550388..0000000
--- a/add.png
+++ b/dev/null
Binary files differ
diff --git a/cgit.css b/cgit.css
index 53c93f2..87fd00a 100644
--- a/cgit.css
+++ b/cgit.css
@@ -263,51 +263,68 @@ table.diffstat td {
263} 263}
264 264
265table.diffstat td span.modechange { 265table.diffstat td span.modechange {
266 padding-left: 1em; 266 padding-left: 1em;
267 color: red; 267 color: red;
268} 268}
269 269
270table.diffstat td.add a { 270table.diffstat td.add a {
271 color: green; 271 color: green;
272} 272}
273 273
274table.diffstat td.del a { 274table.diffstat td.del a {
275 color: red; 275 color: red;
276} 276}
277 277
278table.diffstat td.upd a { 278table.diffstat td.upd a {
279 color: blue; 279 color: blue;
280} 280}
281 281
282table.diffstat td.graph { 282table.diffstat td.graph {
283 width: 75%; 283 width: 75%;
284 vertical-align: center; 284 vertical-align: center;
285} 285}
286 286
287table.diffstat td.graph img { 287table.diffstat td.graph table {
288 border: none; 288 border: none;
289 height: 8pt; 289}
290
291table.diffstat td.graph td {
292 padding: 0px;
293 border: 0px;
294 height: 7pt;
295}
296
297table.diffstat td.graph td.add {
298 background-color: #5c5;
299}
300
301table.diffstat td.graph td.rem {
302 background-color: #c55;
303}
304
305table.diffstat td.graph td.none {
306 background-color: none;
290} 307}
291 308
292div.diffstat-summary { 309div.diffstat-summary {
293 color: #888; 310 color: #888;
294 padding-top: 0.5em; 311 padding-top: 0.5em;
295} 312}
296 313
297table.diff td { 314table.diff td {
298 font-family: monospace; 315 font-family: monospace;
299 white-space: pre; 316 white-space: pre;
300} 317}
301 318
302table.diff td div.head { 319table.diff td div.head {
303 font-weight: bold; 320 font-weight: bold;
304 padding-top: 1em; 321 padding-top: 1em;
305} 322}
306 323
307table.diff td div.hunk { 324table.diff td div.hunk {
308 color: #009; 325 color: #009;
309} 326}
310 327
311table.diff td div.add { 328table.diff td div.add {
312 color: green; 329 color: green;
313} 330}
diff --git a/del.png b/del.png
deleted file mode 100644
index 5c73e82..0000000
--- a/del.png
+++ b/dev/null
Binary files differ
diff --git a/ui-commit.c b/ui-commit.c
index b6a106f..8011dfc 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -8,49 +8,48 @@
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11static int files, slots; 11static int files, slots;
12static int total_adds, total_rems, max_changes; 12static int total_adds, total_rems, max_changes;
13static int lines_added, lines_removed; 13static int lines_added, lines_removed;
14 14
15static struct fileinfo { 15static struct fileinfo {
16 char status; 16 char status;
17 unsigned char old_sha1[20]; 17 unsigned char old_sha1[20];
18 unsigned char new_sha1[20]; 18 unsigned char new_sha1[20];
19 unsigned short old_mode; 19 unsigned short old_mode;
20 unsigned short new_mode; 20 unsigned short new_mode;
21 char *old_path; 21 char *old_path;
22 char *new_path; 22 char *new_path;
23 unsigned int added; 23 unsigned int added;
24 unsigned int removed; 24 unsigned int removed;
25} *items; 25} *items;
26 26
27 27
28void print_fileinfo(struct fileinfo *info) 28void print_fileinfo(struct fileinfo *info)
29{ 29{
30 char *query, *query2; 30 char *query, *query2;
31 char *class; 31 char *class;
32 double width;
33 32
34 switch (info->status) { 33 switch (info->status) {
35 case DIFF_STATUS_ADDED: 34 case DIFF_STATUS_ADDED:
36 class = "add"; 35 class = "add";
37 break; 36 break;
38 case DIFF_STATUS_COPIED: 37 case DIFF_STATUS_COPIED:
39 class = "cpy"; 38 class = "cpy";
40 break; 39 break;
41 case DIFF_STATUS_DELETED: 40 case DIFF_STATUS_DELETED:
42 class = "del"; 41 class = "del";
43 break; 42 break;
44 case DIFF_STATUS_MODIFIED: 43 case DIFF_STATUS_MODIFIED:
45 class = "upd"; 44 class = "upd";
46 break; 45 break;
47 case DIFF_STATUS_RENAMED: 46 case DIFF_STATUS_RENAMED:
48 class = "mov"; 47 class = "mov";
49 break; 48 break;
50 case DIFF_STATUS_TYPE_CHANGED: 49 case DIFF_STATUS_TYPE_CHANGED:
51 class = "typ"; 50 class = "typ";
52 break; 51 break;
53 case DIFF_STATUS_UNKNOWN: 52 case DIFF_STATUS_UNKNOWN:
54 class = "unk"; 53 class = "unk";
55 break; 54 break;
56 case DIFF_STATUS_UNMERGED: 55 case DIFF_STATUS_UNMERGED:
@@ -75,60 +74,57 @@ void print_fileinfo(struct fileinfo *info)
75 html_filemode(info->old_mode); 74 html_filemode(info->old_mode);
76 html("]</span>"); 75 html("]</span>");
77 } 76 }
78 htmlf("</td><td class='%s'>", class); 77 htmlf("</td><td class='%s'>", class);
79 query = fmt("id=%s&id2=%s&path=%s", sha1_to_hex(info->old_sha1), 78 query = fmt("id=%s&id2=%s&path=%s", sha1_to_hex(info->old_sha1),
80 sha1_to_hex(info->new_sha1), info->new_path); 79 sha1_to_hex(info->new_sha1), info->new_path);
81 html_link_open(cgit_pageurl(cgit_query_repo, "diff", query), 80 html_link_open(cgit_pageurl(cgit_query_repo, "diff", query),
82 NULL, NULL); 81 NULL, NULL);
83 if (info->status == DIFF_STATUS_COPIED || 82 if (info->status == DIFF_STATUS_COPIED ||
84 info->status == DIFF_STATUS_RENAMED) { 83 info->status == DIFF_STATUS_RENAMED) {
85 html_txt(info->new_path); 84 html_txt(info->new_path);
86 htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ? 85 htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ?
87 "copied" : "renamed"); 86 "copied" : "renamed");
88 query2 = fmt("id=%s", sha1_to_hex(info->old_sha1)); 87 query2 = fmt("id=%s", sha1_to_hex(info->old_sha1));
89 html_link_open(cgit_pageurl(cgit_query_repo, "view", query2), 88 html_link_open(cgit_pageurl(cgit_query_repo, "view", query2),
90 NULL, NULL); 89 NULL, NULL);
91 html_txt(info->old_path); 90 html_txt(info->old_path);
92 html("</a>)"); 91 html("</a>)");
93 } else { 92 } else {
94 html_txt(info->new_path); 93 html_txt(info->new_path);
95 html("</a>"); 94 html("</a>");
96 } 95 }
97 html("</td><td class='right'>"); 96 html("</td><td class='right'>");
98 htmlf("%d", info->added + info->removed); 97 htmlf("%d", info->added + info->removed);
99
100 html("</td><td class='graph'>"); 98 html("</td><td class='graph'>");
101 width = (info->added + info->removed) * 100.0 / max_changes; 99 htmlf("<table width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));
102 if (width < 0.1) 100 htmlf("<td class='add' style='width: %.1f%%;'/>",
103 width = 0.1; 101 info->added * 100.0 / max_changes);
104 html_link_open(cgit_pageurl(cgit_query_repo, "diff", query), 102 htmlf("<td class='rem' style='width: %.1f%%;'/>",
105 NULL, NULL); 103 info->removed * 100.0 / max_changes);
106 htmlf("<img src='/cgit/add.png' style='width: %.1f%%;'/>", 104 htmlf("<td class='none' style='width: %.1f%%;'/>",
107 info->added * width / (info->added + info->removed)); 105 (max_changes - info->removed - info->added) * 100.0 / max_changes);
108 htmlf("<img src='/cgit/del.png' style='width: %.1f%%;'/>", 106 html("</tr></table></a></td></tr>\n");
109 info->removed * width / (info->added + info->removed));
110 html("</a></td></tr>\n");
111} 107}
112 108
113void cgit_count_diff_lines(char *line, int len) 109void cgit_count_diff_lines(char *line, int len)
114{ 110{
115 if (line && (len > 0)) { 111 if (line && (len > 0)) {
116 if (line[0] == '+') 112 if (line[0] == '+')
117 lines_added++; 113 lines_added++;
118 else if (line[0] == '-') 114 else if (line[0] == '-')
119 lines_removed++; 115 lines_removed++;
120 } 116 }
121} 117}
122 118
123void inspect_filepair(struct diff_filepair *pair) 119void inspect_filepair(struct diff_filepair *pair)
124{ 120{
125 files++; 121 files++;
126 lines_added = 0; 122 lines_added = 0;
127 lines_removed = 0; 123 lines_removed = 0;
128 cgit_diff_files(pair->one->sha1, pair->two->sha1, cgit_count_diff_lines); 124 cgit_diff_files(pair->one->sha1, pair->two->sha1, cgit_count_diff_lines);
129 if (files >= slots) { 125 if (files >= slots) {
130 if (slots == 0) 126 if (slots == 0)
131 slots = 4; 127 slots = 4;
132 else 128 else
133 slots = slots * 2; 129 slots = slots * 2;
134 items = xrealloc(items, slots * sizeof(struct fileinfo)); 130 items = xrealloc(items, slots * sizeof(struct fileinfo));