summaryrefslogtreecommitdiffabout
authorJohan Herland <johan@herland.net>2010-11-15 17:39:53 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-11-16 07:18:37 (UTC)
commitc2bfd40f8aaaa69a66c6eb729c202e42a43ec166 (patch) (unidiff)
tree7ab4e467a6e39124f7336b5599dfc58c8fbb4b18
parentad230267f8ecae6cb4f0da17d7a5f75ba38203e2 (diff)
downloadcgit-c2bfd40f8aaaa69a66c6eb729c202e42a43ec166.zip
cgit-c2bfd40f8aaaa69a66c6eb729c202e42a43ec166.tar.gz
cgit-c2bfd40f8aaaa69a66c6eb729c202e42a43ec166.tar.bz2
ui-log: Move 'Age' column when commit graph is present
When the commit graph is present, we prefer to draw it along the left edge, and moving the 'Age' column to the right of the 'Author' column, like in gitk. Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-log.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/ui-log.c b/ui-log.c
index 05b5c29..8add66a 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -87,63 +87,65 @@ void show_commit_decorations(struct commit *commit)
87 cgit_commit_link(buf, NULL, "deco", ctx.qry.head, 87 cgit_commit_link(buf, NULL, "deco", ctx.qry.head,
88 sha1_to_hex(commit->object.sha1), 88 sha1_to_hex(commit->object.sha1),
89 ctx.qry.vpath, 0); 89 ctx.qry.vpath, 0);
90 } 90 }
91 deco = deco->next; 91 deco = deco->next;
92 } 92 }
93} 93}
94 94
95void print_commit(struct commit *commit, struct rev_info *revs) 95void print_commit(struct commit *commit, struct rev_info *revs)
96{ 96{
97 struct commitinfo *info; 97 struct commitinfo *info;
98 char *tmp; 98 char *tmp;
99 int cols = 2; 99 int cols = revs->graph ? 3 : 2;
100 struct strbuf graphbuf = STRBUF_INIT; 100 struct strbuf graphbuf = STRBUF_INIT;
101 struct strbuf msgbuf = STRBUF_INIT; 101 struct strbuf msgbuf = STRBUF_INIT;
102 102
103 if (ctx.repo->enable_log_filecount) { 103 if (ctx.repo->enable_log_filecount) {
104 cols++; 104 cols++;
105 if (ctx.repo->enable_log_linecount) 105 if (ctx.repo->enable_log_linecount)
106 cols++; 106 cols++;
107 } 107 }
108 108
109 if (revs->graph) { 109 if (revs->graph) {
110 /* Advance graph until current commit */ 110 /* Advance graph until current commit */
111 while (!graph_next_line(revs->graph, &graphbuf)) { 111 while (!graph_next_line(revs->graph, &graphbuf)) {
112 /* Print graph segment in otherwise empty table row */ 112 /* Print graph segment in otherwise empty table row */
113 html("<tr class='nohover'><td/><td class='commitgraph'>"); 113 html("<tr class='nohover'><td class='commitgraph'>");
114 html(graphbuf.buf); 114 html(graphbuf.buf);
115 htmlf("</td><td colspan='%d' /></tr>\n", cols); 115 htmlf("</td><td colspan='%d' /></tr>\n", cols);
116 strbuf_setlen(&graphbuf, 0); 116 strbuf_setlen(&graphbuf, 0);
117 } 117 }
118 /* Current commit's graph segment is now ready in graphbuf */ 118 /* Current commit's graph segment is now ready in graphbuf */
119 } 119 }
120 120
121 info = cgit_parse_commit(commit); 121 info = cgit_parse_commit(commit);
122 htmlf("<tr%s><td>", 122 htmlf("<tr%s>", ctx.qry.showmsg ? " class='logheader'" : "");
123 ctx.qry.showmsg ? " class='logheader'" : "");
124 tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1));
125 tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp);
126 html_link_open(tmp, NULL, NULL);
127 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
128 html_link_close();
129 html("</td>");
130 123
131 if (revs->graph) { 124 if (revs->graph) {
132 /* Print graph segment for current commit */ 125 /* Print graph segment for current commit */
133 html("<td class='commitgraph'>"); 126 html("<td class='commitgraph'>");
134 html(graphbuf.buf); 127 html(graphbuf.buf);
135 html("</td>"); 128 html("</td>");
136 strbuf_setlen(&graphbuf, 0); 129 strbuf_setlen(&graphbuf, 0);
137 } 130 }
131 else {
132 html("<td>");
133 tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1));
134 tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp);
135 html_link_open(tmp, NULL, NULL);
136 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
137 html_link_close();
138 html("</td>");
139 }
138 140
139 htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : ""); 141 htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : "");
140 if (ctx.qry.showmsg) { 142 if (ctx.qry.showmsg) {
141 /* line-wrap long commit subjects instead of truncating them */ 143 /* line-wrap long commit subjects instead of truncating them */
142 size_t subject_len = strlen(info->subject); 144 size_t subject_len = strlen(info->subject);
143 145
144 if (subject_len > ctx.cfg.max_msg_len && 146 if (subject_len > ctx.cfg.max_msg_len &&
145 ctx.cfg.max_msg_len >= 15) { 147 ctx.cfg.max_msg_len >= 15) {
146 /* symbol for signaling line-wrap (in PAGE_ENCODING) */ 148 /* symbol for signaling line-wrap (in PAGE_ENCODING) */
147 const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 }; 149 const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 };
148 int i = ctx.cfg.max_msg_len - strlen(wrap_symbol); 150 int i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
149 151
@@ -158,40 +160,50 @@ void print_commit(struct commit *commit, struct rev_info *revs)
158 strbuf_trim(&msgbuf); 160 strbuf_trim(&msgbuf);
159 strbuf_add(&msgbuf, "\n\n", 2); 161 strbuf_add(&msgbuf, "\n\n", 2);
160 162
161 /* Place wrap_symbol at position i in info->subject */ 163 /* Place wrap_symbol at position i in info->subject */
162 strcpy(info->subject + i, wrap_symbol); 164 strcpy(info->subject + i, wrap_symbol);
163 } 165 }
164 } 166 }
165 cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, 167 cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
166 sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); 168 sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0);
167 show_commit_decorations(commit); 169 show_commit_decorations(commit);
168 html("</td><td>"); 170 html("</td><td>");
169 html_txt(info->author); 171 html_txt(info->author);
172
173 if (revs->graph) {
174 html("</td><td>");
175 tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1));
176 tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp);
177 html_link_open(tmp, NULL, NULL);
178 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
179 html_link_close();
180 }
181
170 if (ctx.repo->enable_log_filecount) { 182 if (ctx.repo->enable_log_filecount) {
171 files = 0; 183 files = 0;
172 add_lines = 0; 184 add_lines = 0;
173 rem_lines = 0; 185 rem_lines = 0;
174 cgit_diff_commit(commit, inspect_files, ctx.qry.vpath); 186 cgit_diff_commit(commit, inspect_files, ctx.qry.vpath);
175 html("</td><td>"); 187 html("</td><td>");
176 htmlf("%d", files); 188 htmlf("%d", files);
177 if (ctx.repo->enable_log_linecount) { 189 if (ctx.repo->enable_log_linecount) {
178 html("</td><td>"); 190 html("</td><td>");
179 htmlf("-%d/+%d", rem_lines, add_lines); 191 htmlf("-%d/+%d", rem_lines, add_lines);
180 } 192 }
181 } 193 }
182 html("</td></tr>\n"); 194 html("</td></tr>\n");
183 195
184 if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ 196 if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */
185 html("<tr class='nohover'><td/>"); /* Empty 'Age' column */ 197 html("<tr class='nohover'>");
186 198
187 if (ctx.qry.showmsg) { 199 if (ctx.qry.showmsg) {
188 /* Concatenate commit message + notes in msgbuf */ 200 /* Concatenate commit message + notes in msgbuf */
189 if (info->msg && *(info->msg)) { 201 if (info->msg && *(info->msg)) {
190 strbuf_addstr(&msgbuf, info->msg); 202 strbuf_addstr(&msgbuf, info->msg);
191 strbuf_addch(&msgbuf, '\n'); 203 strbuf_addch(&msgbuf, '\n');
192 } 204 }
193 format_note(NULL, commit->object.sha1, &msgbuf, 205 format_note(NULL, commit->object.sha1, &msgbuf,
194 PAGE_ENCODING, 206 PAGE_ENCODING,
195 NOTES_SHOW_HEADER | NOTES_INDENT); 207 NOTES_SHOW_HEADER | NOTES_INDENT);
196 strbuf_addch(&msgbuf, '\n'); 208 strbuf_addch(&msgbuf, '\n');
197 strbuf_ltrim(&msgbuf); 209 strbuf_ltrim(&msgbuf);
@@ -214,24 +226,26 @@ void print_commit(struct commit *commit, struct rev_info *revs)
214 /* Print graph padding */ 226 /* Print graph padding */
215 html("<td class='commitgraph'>"); 227 html("<td class='commitgraph'>");
216 while (lines > 0 || !graph_is_commit_finished(revs->graph)) { 228 while (lines > 0 || !graph_is_commit_finished(revs->graph)) {
217 if (graphbuf.len) 229 if (graphbuf.len)
218 html("\n"); 230 html("\n");
219 strbuf_setlen(&graphbuf, 0); 231 strbuf_setlen(&graphbuf, 0);
220 graph_next_line(revs->graph, &graphbuf); 232 graph_next_line(revs->graph, &graphbuf);
221 html(graphbuf.buf); 233 html(graphbuf.buf);
222 lines--; 234 lines--;
223 } 235 }
224 html("</td>\n"); 236 html("</td>\n");
225 } 237 }
238 else
239 html("<td/>"); /* Empty 'Age' column */
226 240
227 /* Print msgbuf into remainder of table row */ 241 /* Print msgbuf into remainder of table row */
228 htmlf("<td colspan='%d'%s>\n", cols, 242 htmlf("<td colspan='%d'%s>\n", cols,
229 ctx.qry.showmsg ? " class='logmsg'" : ""); 243 ctx.qry.showmsg ? " class='logmsg'" : "");
230 html_txt(msgbuf.buf); 244 html_txt(msgbuf.buf);
231 html("</td></tr>\n"); 245 html("</td></tr>\n");
232 } 246 }
233 247
234 strbuf_release(&msgbuf); 248 strbuf_release(&msgbuf);
235 strbuf_release(&graphbuf); 249 strbuf_release(&graphbuf);
236 cgit_free_commitinfo(info); 250 cgit_free_commitinfo(info);
237} 251}
@@ -336,37 +350,41 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
336 rev.verbose_header = 1; 350 rev.verbose_header = 1;
337 rev.show_root_diff = 0; 351 rev.show_root_diff = 0;
338 setup_revisions(vec.count, vec.data, &rev, NULL); 352 setup_revisions(vec.count, vec.data, &rev, NULL);
339 load_ref_decorations(DECORATE_FULL_REFS); 353 load_ref_decorations(DECORATE_FULL_REFS);
340 rev.show_decorations = 1; 354 rev.show_decorations = 1;
341 rev.grep_filter.regflags |= REG_ICASE; 355 rev.grep_filter.regflags |= REG_ICASE;
342 compile_grep_patterns(&rev.grep_filter); 356 compile_grep_patterns(&rev.grep_filter);
343 prepare_revision_walk(&rev); 357 prepare_revision_walk(&rev);
344 358
345 if (pager) 359 if (pager)
346 html("<table class='list nowrap'>"); 360 html("<table class='list nowrap'>");
347 361
348 html("<tr class='nohover'><th class='left'>Age</th>"); 362 html("<tr class='nohover'>");
349 if (commit_graph) 363 if (commit_graph)
350 html("<th></th>"); 364 html("<th></th>");
365 else
366 html("<th class='left'>Age</th>");
351 html("<th class='left'>Commit message"); 367 html("<th class='left'>Commit message");
352 if (pager) { 368 if (pager) {
353 html(" ("); 369 html(" (");
354 cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL, 370 cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL,
355 NULL, ctx.qry.head, ctx.qry.sha1, 371 NULL, ctx.qry.head, ctx.qry.sha1,
356 ctx.qry.vpath, ctx.qry.ofs, ctx.qry.grep, 372 ctx.qry.vpath, ctx.qry.ofs, ctx.qry.grep,
357 ctx.qry.search, ctx.qry.showmsg ? 0 : 1); 373 ctx.qry.search, ctx.qry.showmsg ? 0 : 1);
358 html(")"); 374 html(")");
359 } 375 }
360 html("</th><th class='left'>Author</th>"); 376 html("</th><th class='left'>Author</th>");
377 if (commit_graph)
378 html("<th class='left'>Age</th>");
361 if (ctx.repo->enable_log_filecount) { 379 if (ctx.repo->enable_log_filecount) {
362 html("<th class='left'>Files</th>"); 380 html("<th class='left'>Files</th>");
363 columns++; 381 columns++;
364 if (ctx.repo->enable_log_linecount) { 382 if (ctx.repo->enable_log_linecount) {
365 html("<th class='left'>Lines</th>"); 383 html("<th class='left'>Lines</th>");
366 columns++; 384 columns++;
367 } 385 }
368 } 386 }
369 html("</tr>\n"); 387 html("</tr>\n");
370 388
371 if (ofs<0) 389 if (ofs<0)
372 ofs = 0; 390 ofs = 0;