History

Merge branch 'lh/binary'

Lars Hjemli committed 17 years ago

Commit 5e447b12 parents 0b3c746 481ce5e7 files · +119 −30Browse files

Unified · Split

7 files
  1. cgit.css +19 −0
  2. cgit.h +3 −1
  3. shared.c +11 −2
  4. ui-diff.c +24 −2
  5. ui-log.c +6 −1
  6. ui-patch.c +8 −1
  7. ui-tree.c +48 −23
cgit.css+19−0
@@ -263,6 +263,25 @@ table.blob a.no a:hover { · 262 unmodified lines
263263 color: black;
264264 }
265265
266+table.bin-blob {
267+ margin-top: 0.5em;
268+ border: solid 1px black;
269+}
270+
271+table.bin-blob th {
272+ font-family: monospace;
273+ white-space: pre;
274+ border: solid 1px #777;
275+ padding: 0.5em 1em;
276+}
277+
278+table.bin-blob td {
279+ font-family: monospace;
280+ white-space: pre;
281+ border-left: solid 1px #777;
282+ padding: 0em 1em;
283+}
284+
266285 table.nowrap td {
267286 white-space: nowrap;
268287 }
cgit.h+3−1
@@ -15,6 +15,7 @@ · 14 unmodified lines
1515 #include <revision.h>
1616 #include <log-tree.h>
1717 #include <archive.h>
18+#include <xdiff-interface.h>
1819 #include <xdiff/xdiff.h>
1920 #include <utf8.h>
2021
@@ -222,7 +223,8 @@ extern void *cgit_free_commitinfo(struct commitinfo *info); · 201 unmodified lines
222223
223224 extern int cgit_diff_files(const unsigned char *old_sha1,
224225 const unsigned char *new_sha1,
225− linediff_fn fn);
226+ unsigned long *old_size, unsigned long *new_size,
227+ int *binary, linediff_fn fn);
226228
227229 extern void cgit_diff_tree(const unsigned char *old_sha1,
228230 const unsigned char *new_sha1,
shared.c+11−2
@@ -257,8 +257,8 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) · 256 unmodified lines
257257 }
258258
259259 int cgit_diff_files(const unsigned char *old_sha1,
260− const unsigned char *new_sha1,
261− linediff_fn fn)
260+ const unsigned char *new_sha1, unsigned long *old_size,
261+ unsigned long *new_size, int *binary, linediff_fn fn)
262262 {
263263 mmfile_t file1, file2;
264264 xpparam_t diff_params;
@@ -268,6 +268,15 @@ int cgit_diff_files(const unsigned char *old_sha1, · 3 unmodified lines
268268 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1))
269269 return 1;
270270
271+ *old_size = file1.size;
272+ *new_size = file2.size;
273+
274+ if ((file1.ptr && buffer_is_binary(file1.ptr, file1.size)) ||
275+ (file2.ptr && buffer_is_binary(file2.ptr, file2.size))) {
276+ *binary = 1;
277+ return 0;
278+ }
279+
271280 memset(&diff_params, 0, sizeof(diff_params));
272281 memset(&emit_params, 0, sizeof(emit_params));
273282 memset(&emit_cb, 0, sizeof(emit_cb));
ui-diff.c+24−2
@@ -27,6 +27,9 @@ static struct fileinfo { · 26 unmodified lines
2727 char *new_path;
2828 unsigned int added;
2929 unsigned int removed;
30+ unsigned long old_size;
31+ unsigned long new_size;
32+ int binary:1;
3033 } *items;
3134
3235
@@ -86,6 +89,11 @@ static void print_fileinfo(struct fileinfo *info) · 53 unmodified lines
8689 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
8790 info->old_path);
8891 html("</td><td class='right'>");
92+ if (info->binary) {
93+ htmlf("bin</td><td class='graph'>%d -> %d bytes",
94+ info->old_size, info->new_size);
95+ return;
96+ }
8997 htmlf("%d", info->added + info->removed);
9098 html("</td><td class='graph'>");
9199 htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));
@@ -110,10 +118,14 @@ static void count_diff_lines(char *line, int len) · 18 unmodified lines
110118
111119 static void inspect_filepair(struct diff_filepair *pair)
112120 {
121+ int binary = 0;
122+ unsigned long old_size = 0;
123+ unsigned long new_size = 0;
113124 files++;
114125 lines_added = 0;
115126 lines_removed = 0;
116− cgit_diff_files(pair->one->sha1, pair->two->sha1, count_diff_lines);
127+ cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, &new_size,
128+ &binary, count_diff_lines);
117129 if (files >= slots) {
118130 if (slots == 0)
119131 slots = 4;
@@ -130,6 +142,9 @@ static void inspect_filepair(struct diff_filepair *pair) · 10 unmodified lines
130142 items[files-1].new_path = xstrdup(pair->two->path);
131143 items[files-1].added = lines_added;
132144 items[files-1].removed = lines_removed;
145+ items[files-1].old_size = old_size;
146+ items[files-1].new_size = new_size;
147+ items[files-1].binary = binary;
133148 if (lines_added + lines_removed > max_changes)
134149 max_changes = lines_added + lines_removed;
135150 total_adds += lines_added;
@@ -233,6 +248,10 @@ static void header(unsigned char *sha1, char *path1, int mode1, · 97 unmodified lines
233248
234249 static void filepair_cb(struct diff_filepair *pair)
235250 {
251+ unsigned long old_size = 0;
252+ unsigned long new_size = 0;
253+ int binary = 0;
254+
236255 header(pair->one->sha1, pair->one->path, pair->one->mode,
237256 pair->two->sha1, pair->two->path, pair->two->mode);
238257 if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
@@ -242,8 +261,11 @@ static void filepair_cb(struct diff_filepair *pair) · 3 unmodified lines
242261 print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
243262 return;
244263 }
245− if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
264+ if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
265+ &new_size, &binary, print_line))
246266 cgit_print_error("Error running diff");
267+ if (binary)
268+ html("Binary files differ");
247269 }
248270
249271 void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix)
ui-log.c+6−1
@@ -26,9 +26,14 @@ void count_lines(char *line, int size) · 25 unmodified lines
2626
2727 void inspect_files(struct diff_filepair *pair)
2828 {
29+ unsigned long old_size = 0;
30+ unsigned long new_size = 0;
31+ int binary = 0;
32+
2933 files++;
3034 if (ctx.repo->enable_log_linecount)
31− cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines);
35+ cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
36+ &new_size, &binary, count_lines);
3237 }
3338
3439 void show_commit_decorations(struct commit *commit)
ui-patch.c+8−1
@@ -57,6 +57,10 @@ static void header(unsigned char *sha1, char *path1, int mode1, · 56 unmodified lines
5757
5858 static void filepair_cb(struct diff_filepair *pair)
5959 {
60+ unsigned long old_size = 0;
61+ unsigned long new_size = 0;
62+ int binary = 0;
63+
6064 header(pair->one->sha1, pair->one->path, pair->one->mode,
6165 pair->two->sha1, pair->two->path, pair->two->mode);
6266 if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
@@ -66,8 +70,11 @@ static void filepair_cb(struct diff_filepair *pair) · 3 unmodified lines
6670 print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
6771 return;
6872 }
69− if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
73+ if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
74+ &new_size, &binary, print_line))
7075 html("Error running diff");
76+ if (binary)
77+ html("Binary files differ\n");
7178 }
7279
7380 void cgit_print_patch(char *hex)
ui-tree.c+48−23
@@ -6,6 +6,7 @@ · 5 unmodified lines
66 * (see COPYING for full license text)
77 */
88
9+#include <ctype.h>
910 #include "cgit.h"
1011 #include "html.h"
1112 #include "ui-shared.h"
@@ -14,12 +15,53 @@ char *curr_rev; · 2 unmodified lines
1415 char *match_path;
1516 int header = 0;
1617
18+static void print_text_buffer(char *buf, unsigned long size)
19+{
20+ unsigned long lineno, idx;
21+ const char *numberfmt =
22+ "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
23+
24+ html("<table summary='blob content' class='blob'>\n");
25+ html("<tr><td class='linenumbers'><pre>");
26+ idx = 0;
27+ lineno = 0;
28+ htmlf(numberfmt, ++lineno);
29+ while(idx < size - 1) { // skip absolute last newline
30+ if (buf[idx] == '\n')
31+ htmlf(numberfmt, ++lineno);
32+ idx++;
33+ }
34+ html("</pre></td>\n");
35+ html("<td class='lines'><pre><code>");
36+ html_txt(buf);
37+ html("</code></pre></td></tr></table>\n");
38+}
39+
40+static void print_binary_buffer(char *buf, unsigned long size)
41+{
42+ unsigned long ofs, idx;
43+
44+ html("<table summary='blob content' class='bin-blob'>\n");
45+ html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>");
46+ for (ofs = 0; ofs < size; ofs += 32, buf += 32) {
47+ htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs);
48+ for (idx = 0; idx < 32 && ofs + idx < size; idx++)
49+ htmlf("%*s%02x",
50+ idx == 16 ? 4 : 1, "",
51+ buf[idx] & 0xff);
52+ html(" </td><td class='hex'>");
53+ for (idx = 0; idx < 32 && ofs + idx < size; idx++)
54+ htmlf("%c", isgraph(buf[idx]) ? buf[idx] : '.');
55+ html("</td></tr>\n");
56+ }
57+ html("</table>\n");
58+}
59+
1760 static void print_object(const unsigned char *sha1, char *path)
1861 {
1962 enum object_type type;
2063 char *buf;
21− unsigned long size, lineno, idx;
22− const char *numberfmt = "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
64+ unsigned long size;
2365
2466 type = sha1_object_info(sha1, &size);
2567 if (type == OBJ_BAD) {
@@ -40,27 +82,10 @@ static void print_object(const unsigned char *sha1, char *path) · 14 unmodified lines
4082 curr_rev, path);
4183 htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));
4284
43− html("<table summary='blob content' class='blob'>\n");
44− html("<tr>\n");
45−
46− html("<td class='linenumbers'><pre>");
47− idx = 0;
48− lineno = 0;
49− htmlf(numberfmt, ++lineno);
50− while(idx < size - 1) { // skip absolute last newline
51− if (buf[idx] == '\n') {
52− htmlf(numberfmt, ++lineno);
53− }
54− idx++;
55− }
56− html("</pre></td>\n");
57−
58− html("<td class='lines'><pre><code>");
59− html_txt(buf);
60− html("</code></pre></td>\n");
61−
62− html("</tr>\n");
63− html("</table>\n");
85+ if (buffer_is_binary(buf, size))
86+ print_binary_buffer(buf, size);
87+ else
88+ print_text_buffer(buf, size);
6489 }
6590
6691