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
263 color: black;263 color: black;
264}264}
265 265
266table.bin-blob {
267 margin-top: 0.5em;
268 border: solid 1px black;
269}
270
271table.bin-blob th {
272 font-family: monospace;
273 white-space: pre;
274 border: solid 1px #777;
275 padding: 0.5em 1em;
276}
277
278table.bin-blob td {
279 font-family: monospace;
280 white-space: pre;
281 border-left: solid 1px #777;
282 padding: 0em 1em;
283}
284
266table.nowrap td {285table.nowrap td {
267 white-space: nowrap;286 white-space: nowrap;
268}287}
cgit.h+3−1
@@ -15,6 +15,7 @@ · 14 unmodified lines
15#include <revision.h>15#include <revision.h>
16#include <log-tree.h>16#include <log-tree.h>
17#include <archive.h>17#include <archive.h>
18#include <xdiff-interface.h>
18#include <xdiff/xdiff.h>19#include <xdiff/xdiff.h>
19#include <utf8.h>20#include <utf8.h>
20 21
@@ -222,7 +223,8 @@ extern void *cgit_free_commitinfo(struct commitinfo *info); · 201 unmodified lines
222 223
223extern int cgit_diff_files(const unsigned char *old_sha1,224extern int cgit_diff_files(const unsigned char *old_sha1,
224 const unsigned char *new_sha1,225 const unsigned char *new_sha1,
225 linediff_fn fn);226 unsigned long *old_size, unsigned long *new_size,
227 int *binary, linediff_fn fn);
226 228
227extern void cgit_diff_tree(const unsigned char *old_sha1,229extern void cgit_diff_tree(const unsigned char *old_sha1,
228 const unsigned char *new_sha1,230 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
257}257}
258 258
259int cgit_diff_files(const unsigned char *old_sha1,259int cgit_diff_files(const unsigned char *old_sha1,
260 const unsigned char *new_sha1,260 const unsigned char *new_sha1, unsigned long *old_size,
261 linediff_fn fn)261 unsigned long *new_size, int *binary, linediff_fn fn)
262{262{
263 mmfile_t file1, file2;263 mmfile_t file1, file2;
264 xpparam_t diff_params;264 xpparam_t diff_params;
@@ -268,6 +268,15 @@ int cgit_diff_files(const unsigned char *old_sha1, · 3 unmodified lines
268 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1))268 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1))
269 return 1;269 return 1;
270 270
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
271 memset(&diff_params, 0, sizeof(diff_params));280 memset(&diff_params, 0, sizeof(diff_params));
272 memset(&emit_params, 0, sizeof(emit_params));281 memset(&emit_params, 0, sizeof(emit_params));
273 memset(&emit_cb, 0, sizeof(emit_cb));282 memset(&emit_cb, 0, sizeof(emit_cb));
ui-diff.c+24−2
@@ -27,6 +27,9 @@ static struct fileinfo { · 26 unmodified lines
27 char *new_path;27 char *new_path;
28 unsigned int added;28 unsigned int added;
29 unsigned int removed;29 unsigned int removed;
30 unsigned long old_size;
31 unsigned long new_size;
32 int binary:1;
30} *items;33} *items;
31 34
32 35
@@ -86,6 +89,11 @@ static void print_fileinfo(struct fileinfo *info) · 53 unmodified lines
86 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",89 info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
87 info->old_path);90 info->old_path);
88 html("</td><td class='right'>");91 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 }
89 htmlf("%d", info->added + info->removed);97 htmlf("%d", info->added + info->removed);
90 html("</td><td class='graph'>");98 html("</td><td class='graph'>");
91 htmlf("<table summary='file diffstat' width='%d%%'><tr>", (max_changes > 100 ? 100 : max_changes));99 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
110 118
111static void inspect_filepair(struct diff_filepair *pair)119static void inspect_filepair(struct diff_filepair *pair)
112{120{
121 int binary = 0;
122 unsigned long old_size = 0;
123 unsigned long new_size = 0;
113 files++;124 files++;
114 lines_added = 0;125 lines_added = 0;
115 lines_removed = 0;126 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);
117 if (files >= slots) {129 if (files >= slots) {
118 if (slots == 0)130 if (slots == 0)
119 slots = 4;131 slots = 4;
@@ -130,6 +142,9 @@ static void inspect_filepair(struct diff_filepair *pair) · 10 unmodified lines
130 items[files-1].new_path = xstrdup(pair->two->path);142 items[files-1].new_path = xstrdup(pair->two->path);
131 items[files-1].added = lines_added;143 items[files-1].added = lines_added;
132 items[files-1].removed = lines_removed;144 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;
133 if (lines_added + lines_removed > max_changes)148 if (lines_added + lines_removed > max_changes)
134 max_changes = lines_added + lines_removed;149 max_changes = lines_added + lines_removed;
135 total_adds += lines_added;150 total_adds += lines_added;
@@ -233,6 +248,10 @@ static void header(unsigned char *sha1, char *path1, int mode1, · 97 unmodified lines
233 248
234static void filepair_cb(struct diff_filepair *pair)249static void filepair_cb(struct diff_filepair *pair)
235{250{
251 unsigned long old_size = 0;
252 unsigned long new_size = 0;
253 int binary = 0;
254
236 header(pair->one->sha1, pair->one->path, pair->one->mode,255 header(pair->one->sha1, pair->one->path, pair->one->mode,
237 pair->two->sha1, pair->two->path, pair->two->mode);256 pair->two->sha1, pair->two->path, pair->two->mode);
238 if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {257 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
242 print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);261 print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
243 return;262 return;
244 }263 }
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))
246 cgit_print_error("Error running diff");266 cgit_print_error("Error running diff");
267 if (binary)
268 html("Binary files differ");
247}269}
248 270
249void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix)271void 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
26 26
27void inspect_files(struct diff_filepair *pair)27void inspect_files(struct diff_filepair *pair)
28{28{
29 unsigned long old_size = 0;
30 unsigned long new_size = 0;
31 int binary = 0;
32
29 files++;33 files++;
30 if (ctx.repo->enable_log_linecount)34 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);
32}37}
33 38
34void show_commit_decorations(struct commit *commit)39void 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
57 57
58static void filepair_cb(struct diff_filepair *pair)58static void filepair_cb(struct diff_filepair *pair)
59{59{
60 unsigned long old_size = 0;
61 unsigned long new_size = 0;
62 int binary = 0;
63
60 header(pair->one->sha1, pair->one->path, pair->one->mode,64 header(pair->one->sha1, pair->one->path, pair->one->mode,
61 pair->two->sha1, pair->two->path, pair->two->mode);65 pair->two->sha1, pair->two->path, pair->two->mode);
62 if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {66 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
66 print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);70 print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
67 return;71 return;
68 }72 }
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))
70 html("Error running diff");75 html("Error running diff");
76 if (binary)
77 html("Binary files differ\n");
71}78}
72 79
73void cgit_print_patch(char *hex)80void cgit_print_patch(char *hex)
ui-tree.c+48−23
@@ -6,6 +6,7 @@ · 5 unmodified lines
6 * (see COPYING for full license text)6 * (see COPYING for full license text)
7 */7 */
8 8
9#include <ctype.h>
9#include "cgit.h"10#include "cgit.h"
10#include "html.h"11#include "html.h"
11#include "ui-shared.h"12#include "ui-shared.h"
@@ -14,12 +15,53 @@ char *curr_rev; · 2 unmodified lines
14char *match_path;15char *match_path;
15int header = 0;16int header = 0;
16 17
18static 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
40static 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
17static void print_object(const unsigned char *sha1, char *path)60static void print_object(const unsigned char *sha1, char *path)
18{61{
19 enum object_type type;62 enum object_type type;
20 char *buf;63 char *buf;
21 unsigned long size, lineno, idx;64 unsigned long size;
22 const char *numberfmt = "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
23 65
24 type = sha1_object_info(sha1, &size);66 type = sha1_object_info(sha1, &size);
25 if (type == OBJ_BAD) {67 if (type == OBJ_BAD) {
@@ -40,27 +82,10 @@ static void print_object(const unsigned char *sha1, char *path) · 14 unmodified lines
40 curr_rev, path);82 curr_rev, path);
41 htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));83 htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));
42 84
43 html("<table summary='blob content' class='blob'>\n");85 if (buffer_is_binary(buf, size))
44 html("<tr>\n");86 print_binary_buffer(buf, size);
45 87 else
46 html("<td class='linenumbers'><pre>");88 print_text_buffer(buf, size);
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");
64}89}
65 90
66 91