summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.css24
-rw-r--r--ui-log.c19
2 files changed, 43 insertions, 0 deletions
diff --git a/cgit.css b/cgit.css
index 7600e84..1ebef55 100644
--- a/cgit.css
+++ b/cgit.css
@@ -97,128 +97,152 @@ table.tabs td.form form {
97 white-space: nowrap; 97 white-space: nowrap;
98} 98}
99 99
100table.tabs td.form input, 100table.tabs td.form input,
101table.tabs td.form select { 101table.tabs td.form select {
102 font-size: 90%; 102 font-size: 90%;
103} 103}
104 104
105div.path { 105div.path {
106 margin: 0px; 106 margin: 0px;
107 padding: 5px 2em 2px 2em; 107 padding: 5px 2em 2px 2em;
108 color: #000; 108 color: #000;
109 background-color: #eee; 109 background-color: #eee;
110} 110}
111 111
112div.content { 112div.content {
113 margin: 0px; 113 margin: 0px;
114 padding: 2em; 114 padding: 2em;
115 border-bottom: solid 3px #ccc; 115 border-bottom: solid 3px #ccc;
116} 116}
117 117
118 118
119table.list { 119table.list {
120 width: 100%; 120 width: 100%;
121 border: none; 121 border: none;
122 border-collapse: collapse; 122 border-collapse: collapse;
123} 123}
124 124
125table.list tr { 125table.list tr {
126 background: white; 126 background: white;
127} 127}
128 128
129table.list tr.logheader { 129table.list tr.logheader {
130 background: #eee; 130 background: #eee;
131} 131}
132 132
133table.list tr:hover { 133table.list tr:hover {
134 background: #eee; 134 background: #eee;
135} 135}
136 136
137table.list tr.nohover:hover { 137table.list tr.nohover:hover {
138 background: white; 138 background: white;
139} 139}
140 140
141table.list th { 141table.list th {
142 font-weight: bold; 142 font-weight: bold;
143 /* color: #888; 143 /* color: #888;
144 border-top: dashed 1px #888; 144 border-top: dashed 1px #888;
145 border-bottom: dashed 1px #888; 145 border-bottom: dashed 1px #888;
146 */ 146 */
147 padding: 0.1em 0.5em 0.05em 0.5em; 147 padding: 0.1em 0.5em 0.05em 0.5em;
148 vertical-align: baseline; 148 vertical-align: baseline;
149} 149}
150 150
151table.list td { 151table.list td {
152 border: none; 152 border: none;
153 padding: 0.1em 0.5em 0.1em 0.5em; 153 padding: 0.1em 0.5em 0.1em 0.5em;
154} 154}
155 155
156table.list td.commitgraph { 156table.list td.commitgraph {
157 font-family: monospace; 157 font-family: monospace;
158 white-space: pre; 158 white-space: pre;
159} 159}
160 160
161table.list td.commitgraph .column1 {
162 color: #a00;
163}
164
165table.list td.commitgraph .column2 {
166 color: #0a0;
167}
168
169table.list td.commitgraph .column3 {
170 color: #aa0;
171}
172
173table.list td.commitgraph .column4 {
174 color: #00a;
175}
176
177table.list td.commitgraph .column5 {
178 color: #a0a;
179}
180
181table.list td.commitgraph .column6 {
182 color: #0aa;
183}
184
161table.list td.logsubject { 185table.list td.logsubject {
162 font-family: monospace; 186 font-family: monospace;
163 font-weight: bold; 187 font-weight: bold;
164} 188}
165 189
166table.list td.logmsg { 190table.list td.logmsg {
167 font-family: monospace; 191 font-family: monospace;
168 white-space: pre; 192 white-space: pre;
169 padding: 0 0.5em; 193 padding: 0 0.5em;
170} 194}
171 195
172table.list td a { 196table.list td a {
173 color: black; 197 color: black;
174} 198}
175 199
176table.list td a.ls-dir { 200table.list td a.ls-dir {
177 font-weight: bold; 201 font-weight: bold;
178 color: #00f; 202 color: #00f;
179} 203}
180 204
181table.list td a:hover { 205table.list td a:hover {
182 color: #00f; 206 color: #00f;
183} 207}
184 208
185img { 209img {
186 border: none; 210 border: none;
187} 211}
188 212
189input#switch-btn { 213input#switch-btn {
190 margin: 2px 0px 0px 0px; 214 margin: 2px 0px 0px 0px;
191} 215}
192 216
193td#sidebar input.txt { 217td#sidebar input.txt {
194 width: 100%; 218 width: 100%;
195 margin: 2px 0px 0px 0px; 219 margin: 2px 0px 0px 0px;
196} 220}
197 221
198table#grid { 222table#grid {
199 margin: 0px; 223 margin: 0px;
200} 224}
201 225
202td#content { 226td#content {
203 vertical-align: top; 227 vertical-align: top;
204 padding: 1em 2em 1em 1em; 228 padding: 1em 2em 1em 1em;
205 border: none; 229 border: none;
206} 230}
207 231
208div#summary { 232div#summary {
209 vertical-align: top; 233 vertical-align: top;
210 margin-bottom: 1em; 234 margin-bottom: 1em;
211} 235}
212 236
213table#downloads { 237table#downloads {
214 float: right; 238 float: right;
215 border-collapse: collapse; 239 border-collapse: collapse;
216 border: solid 1px #777; 240 border: solid 1px #777;
217 margin-left: 0.5em; 241 margin-left: 0.5em;
218 margin-bottom: 0.5em; 242 margin-bottom: 0.5em;
219} 243}
220 244
221table#downloads th { 245table#downloads th {
222 background-color: #ccc; 246 background-color: #ccc;
223} 247}
224 248
diff --git a/ui-log.c b/ui-log.c
index 0d86fd5..5cf66cb 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -1,79 +1,94 @@
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/")) {
64 strncpy(buf, deco->name + 13, sizeof(buf) - 1); 79 strncpy(buf, deco->name + 13, sizeof(buf) - 1);
65 cgit_log_link(buf, NULL, "remote-deco", NULL, 80 cgit_log_link(buf, NULL, "remote-deco", NULL,
66 sha1_to_hex(commit->object.sha1), 81 sha1_to_hex(commit->object.sha1),
67 ctx.qry.vpath, 0, NULL, NULL, 82 ctx.qry.vpath, 0, NULL, NULL,
68 ctx.qry.showmsg); 83 ctx.qry.showmsg);
69 } 84 }
70 else { 85 else {
71 strncpy(buf, deco->name, sizeof(buf) - 1); 86 strncpy(buf, deco->name, sizeof(buf) - 1);
72 cgit_commit_link(buf, NULL, "deco", ctx.qry.head, 87 cgit_commit_link(buf, NULL, "deco", ctx.qry.head,
73 sha1_to_hex(commit->object.sha1), 88 sha1_to_hex(commit->object.sha1),
74 ctx.qry.vpath, 0); 89 ctx.qry.vpath, 0);
75 } 90 }
76 deco = deco->next; 91 deco = deco->next;
77 } 92 }
78} 93}
79 94
@@ -212,129 +227,133 @@ static char *next_token(char **src)
212{ 227{
213 char *result; 228 char *result;
214 229
215 if (!src || !*src) 230 if (!src || !*src)
216 return NULL; 231 return NULL;
217 while (isspace(**src)) 232 while (isspace(**src))
218 (*src)++; 233 (*src)++;
219 if (!**src) 234 if (!**src)
220 return NULL; 235 return NULL;
221 result = *src; 236 result = *src;
222 while (**src) { 237 while (**src) {
223 if (isspace(**src)) { 238 if (isspace(**src)) {
224 **src = '\0'; 239 **src = '\0';
225 (*src)++; 240 (*src)++;
226 break; 241 break;
227 } 242 }
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 }
325 html("</tr>\n"); 344 html("</tr>\n");
326 345
327 if (ofs<0) 346 if (ofs<0)
328 ofs = 0; 347 ofs = 0;
329 348
330 for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) { 349 for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) {
331 free(commit->buffer); 350 free(commit->buffer);
332 commit->buffer = NULL; 351 commit->buffer = NULL;
333 free_commit_list(commit->parents); 352 free_commit_list(commit->parents);
334 commit->parents = NULL; 353 commit->parents = NULL;
335 } 354 }
336 355
337 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) { 356 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
338 print_commit(commit, &rev); 357 print_commit(commit, &rev);
339 free(commit->buffer); 358 free(commit->buffer);
340 commit->buffer = NULL; 359 commit->buffer = NULL;