summaryrefslogtreecommitdiffabout
path: root/ui-log.c
Unidiff
Diffstat (limited to 'ui-log.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-log.c9
1 files changed, 0 insertions, 9 deletions
diff --git a/ui-log.c b/ui-log.c
index 8add66a..15ed6a3 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -50,178 +50,169 @@ void inspect_files(struct diff_filepair *pair)
50 if (ctx.repo->enable_log_linecount) 50 if (ctx.repo->enable_log_linecount)
51 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, 51 cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
52 &new_size, &binary, 0, ctx.qry.ignorews, 52 &new_size, &binary, 0, ctx.qry.ignorews,
53 count_lines); 53 count_lines);
54} 54}
55 55
56void show_commit_decorations(struct commit *commit) 56void show_commit_decorations(struct commit *commit)
57{ 57{
58 struct name_decoration *deco; 58 struct name_decoration *deco;
59 static char buf[1024]; 59 static char buf[1024];
60 60
61 buf[sizeof(buf) - 1] = 0; 61 buf[sizeof(buf) - 1] = 0;
62 deco = lookup_decoration(&name_decoration, &commit->object); 62 deco = lookup_decoration(&name_decoration, &commit->object);
63 while (deco) { 63 while (deco) {
64 if (!prefixcmp(deco->name, "refs/heads/")) { 64 if (!prefixcmp(deco->name, "refs/heads/")) {
65 strncpy(buf, deco->name + 11, sizeof(buf) - 1); 65 strncpy(buf, deco->name + 11, sizeof(buf) - 1);
66 cgit_log_link(buf, NULL, "branch-deco", buf, NULL, 66 cgit_log_link(buf, NULL, "branch-deco", buf, NULL,
67 ctx.qry.vpath, 0, NULL, NULL, 67 ctx.qry.vpath, 0, NULL, NULL,
68 ctx.qry.showmsg); 68 ctx.qry.showmsg);
69 } 69 }
70 else if (!prefixcmp(deco->name, "tag: refs/tags/")) { 70 else if (!prefixcmp(deco->name, "tag: refs/tags/")) {
71 strncpy(buf, deco->name + 15, sizeof(buf) - 1); 71 strncpy(buf, deco->name + 15, sizeof(buf) - 1);
72 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf); 72 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf);
73 } 73 }
74 else if (!prefixcmp(deco->name, "refs/tags/")) { 74 else if (!prefixcmp(deco->name, "refs/tags/")) {
75 strncpy(buf, deco->name + 10, sizeof(buf) - 1); 75 strncpy(buf, deco->name + 10, sizeof(buf) - 1);
76 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf); 76 cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf);
77 } 77 }
78 else if (!prefixcmp(deco->name, "refs/remotes/")) { 78 else if (!prefixcmp(deco->name, "refs/remotes/")) {
79 strncpy(buf, deco->name + 13, sizeof(buf) - 1); 79 strncpy(buf, deco->name + 13, sizeof(buf) - 1);
80 cgit_log_link(buf, NULL, "remote-deco", NULL, 80 cgit_log_link(buf, NULL, "remote-deco", NULL,
81 sha1_to_hex(commit->object.sha1), 81 sha1_to_hex(commit->object.sha1),
82 ctx.qry.vpath, 0, NULL, NULL, 82 ctx.qry.vpath, 0, NULL, NULL,
83 ctx.qry.showmsg); 83 ctx.qry.showmsg);
84 } 84 }
85 else { 85 else {
86 strncpy(buf, deco->name, sizeof(buf) - 1); 86 strncpy(buf, deco->name, sizeof(buf) - 1);
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;
99 int cols = revs->graph ? 3 : 2; 98 int cols = revs->graph ? 3 : 2;
100 struct strbuf graphbuf = STRBUF_INIT; 99 struct strbuf graphbuf = STRBUF_INIT;
101 struct strbuf msgbuf = STRBUF_INIT; 100 struct strbuf msgbuf = STRBUF_INIT;
102 101
103 if (ctx.repo->enable_log_filecount) { 102 if (ctx.repo->enable_log_filecount) {
104 cols++; 103 cols++;
105 if (ctx.repo->enable_log_linecount) 104 if (ctx.repo->enable_log_linecount)
106 cols++; 105 cols++;
107 } 106 }
108 107
109 if (revs->graph) { 108 if (revs->graph) {
110 /* Advance graph until current commit */ 109 /* Advance graph until current commit */
111 while (!graph_next_line(revs->graph, &graphbuf)) { 110 while (!graph_next_line(revs->graph, &graphbuf)) {
112 /* Print graph segment in otherwise empty table row */ 111 /* Print graph segment in otherwise empty table row */
113 html("<tr class='nohover'><td class='commitgraph'>"); 112 html("<tr class='nohover'><td class='commitgraph'>");
114 html(graphbuf.buf); 113 html(graphbuf.buf);
115 htmlf("</td><td colspan='%d' /></tr>\n", cols); 114 htmlf("</td><td colspan='%d' /></tr>\n", cols);
116 strbuf_setlen(&graphbuf, 0); 115 strbuf_setlen(&graphbuf, 0);
117 } 116 }
118 /* Current commit's graph segment is now ready in graphbuf */ 117 /* Current commit's graph segment is now ready in graphbuf */
119 } 118 }
120 119
121 info = cgit_parse_commit(commit); 120 info = cgit_parse_commit(commit);
122 htmlf("<tr%s>", ctx.qry.showmsg ? " class='logheader'" : ""); 121 htmlf("<tr%s>", ctx.qry.showmsg ? " class='logheader'" : "");
123 122
124 if (revs->graph) { 123 if (revs->graph) {
125 /* Print graph segment for current commit */ 124 /* Print graph segment for current commit */
126 html("<td class='commitgraph'>"); 125 html("<td class='commitgraph'>");
127 html(graphbuf.buf); 126 html(graphbuf.buf);
128 html("</td>"); 127 html("</td>");
129 strbuf_setlen(&graphbuf, 0); 128 strbuf_setlen(&graphbuf, 0);
130 } 129 }
131 else { 130 else {
132 html("<td>"); 131 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); 132 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
137 html_link_close();
138 html("</td>"); 133 html("</td>");
139 } 134 }
140 135
141 htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : ""); 136 htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : "");
142 if (ctx.qry.showmsg) { 137 if (ctx.qry.showmsg) {
143 /* line-wrap long commit subjects instead of truncating them */ 138 /* line-wrap long commit subjects instead of truncating them */
144 size_t subject_len = strlen(info->subject); 139 size_t subject_len = strlen(info->subject);
145 140
146 if (subject_len > ctx.cfg.max_msg_len && 141 if (subject_len > ctx.cfg.max_msg_len &&
147 ctx.cfg.max_msg_len >= 15) { 142 ctx.cfg.max_msg_len >= 15) {
148 /* symbol for signaling line-wrap (in PAGE_ENCODING) */ 143 /* symbol for signaling line-wrap (in PAGE_ENCODING) */
149 const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 }; 144 const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 };
150 int i = ctx.cfg.max_msg_len - strlen(wrap_symbol); 145 int i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
151 146
152 /* Rewind i to preceding space character */ 147 /* Rewind i to preceding space character */
153 while (i > 0 && !isspace(info->subject[i])) 148 while (i > 0 && !isspace(info->subject[i]))
154 --i; 149 --i;
155 if (!i) /* Oops, zero spaces. Reset i */ 150 if (!i) /* Oops, zero spaces. Reset i */
156 i = ctx.cfg.max_msg_len - strlen(wrap_symbol); 151 i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
157 152
158 /* add remainder starting at i to msgbuf */ 153 /* add remainder starting at i to msgbuf */
159 strbuf_add(&msgbuf, info->subject + i, subject_len - i); 154 strbuf_add(&msgbuf, info->subject + i, subject_len - i);
160 strbuf_trim(&msgbuf); 155 strbuf_trim(&msgbuf);
161 strbuf_add(&msgbuf, "\n\n", 2); 156 strbuf_add(&msgbuf, "\n\n", 2);
162 157
163 /* Place wrap_symbol at position i in info->subject */ 158 /* Place wrap_symbol at position i in info->subject */
164 strcpy(info->subject + i, wrap_symbol); 159 strcpy(info->subject + i, wrap_symbol);
165 } 160 }
166 } 161 }
167 cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, 162 cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
168 sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); 163 sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0);
169 show_commit_decorations(commit); 164 show_commit_decorations(commit);
170 html("</td><td>"); 165 html("</td><td>");
171 html_txt(info->author); 166 html_txt(info->author);
172 167
173 if (revs->graph) { 168 if (revs->graph) {
174 html("</td><td>"); 169 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); 170 cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE);
179 html_link_close();
180 } 171 }
181 172
182 if (ctx.repo->enable_log_filecount) { 173 if (ctx.repo->enable_log_filecount) {
183 files = 0; 174 files = 0;
184 add_lines = 0; 175 add_lines = 0;
185 rem_lines = 0; 176 rem_lines = 0;
186 cgit_diff_commit(commit, inspect_files, ctx.qry.vpath); 177 cgit_diff_commit(commit, inspect_files, ctx.qry.vpath);
187 html("</td><td>"); 178 html("</td><td>");
188 htmlf("%d", files); 179 htmlf("%d", files);
189 if (ctx.repo->enable_log_linecount) { 180 if (ctx.repo->enable_log_linecount) {
190 html("</td><td>"); 181 html("</td><td>");
191 htmlf("-%d/+%d", rem_lines, add_lines); 182 htmlf("-%d/+%d", rem_lines, add_lines);
192 } 183 }
193 } 184 }
194 html("</td></tr>\n"); 185 html("</td></tr>\n");
195 186
196 if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ 187 if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */
197 html("<tr class='nohover'>"); 188 html("<tr class='nohover'>");
198 189
199 if (ctx.qry.showmsg) { 190 if (ctx.qry.showmsg) {
200 /* Concatenate commit message + notes in msgbuf */ 191 /* Concatenate commit message + notes in msgbuf */
201 if (info->msg && *(info->msg)) { 192 if (info->msg && *(info->msg)) {
202 strbuf_addstr(&msgbuf, info->msg); 193 strbuf_addstr(&msgbuf, info->msg);
203 strbuf_addch(&msgbuf, '\n'); 194 strbuf_addch(&msgbuf, '\n');
204 } 195 }
205 format_note(NULL, commit->object.sha1, &msgbuf, 196 format_note(NULL, commit->object.sha1, &msgbuf,
206 PAGE_ENCODING, 197 PAGE_ENCODING,
207 NOTES_SHOW_HEADER | NOTES_INDENT); 198 NOTES_SHOW_HEADER | NOTES_INDENT);
208 strbuf_addch(&msgbuf, '\n'); 199 strbuf_addch(&msgbuf, '\n');
209 strbuf_ltrim(&msgbuf); 200 strbuf_ltrim(&msgbuf);
210 } 201 }
211 202
212 if (revs->graph) { 203 if (revs->graph) {
213 int lines = 0; 204 int lines = 0;
214 205
215 /* Calculate graph padding */ 206 /* Calculate graph padding */
216 if (ctx.qry.showmsg) { 207 if (ctx.qry.showmsg) {
217 /* Count #lines in commit message + notes */ 208 /* Count #lines in commit message + notes */
218 const char *p = msgbuf.buf; 209 const char *p = msgbuf.buf;
219 lines = 1; 210 lines = 1;
220 while ((p = strchr(p, '\n'))) { 211 while ((p = strchr(p, '\n'))) {
221 p++; 212 p++;
222 lines++; 213 lines++;
223 } 214 }
224 } 215 }
225 216
226 /* Print graph padding */ 217 /* Print graph padding */
227 html("<td class='commitgraph'>"); 218 html("<td class='commitgraph'>");