summaryrefslogtreecommitdiffabout
path: root/ui-diff.c
authorJohan Herland <johan@herland.net>2010-06-24 15:52:57 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-07-18 08:53:48 (UTC)
commit2cc8b99f083014c58d8937bfa4dcd2bc47cd7e58 (patch) (side-by-side diff)
tree48d555b15c0432bb98712d746100bf6c0fe2be4a /ui-diff.c
parentd20313e3daf855ee5d4808e050f54614c200d7b1 (diff)
downloadcgit-2cc8b99f083014c58d8937bfa4dcd2bc47cd7e58.zip
cgit-2cc8b99f083014c58d8937bfa4dcd2bc47cd7e58.tar.gz
cgit-2cc8b99f083014c58d8937bfa4dcd2bc47cd7e58.tar.bz2
Add URL parameter 'ignorews' for optionally ignoring whitespace in diffs
The new ctx.qry.ignorews variable is passed via cgit_diff_files() and cgit_diff_tree() to Git's diff machinery. This is equivalent to passing --ignore-all-space to 'git diff'. Signed-off-by: Johan Herland <johan@herland.net>
Diffstat (limited to 'ui-diff.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-diff.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/ui-diff.c b/ui-diff.c
index e0a72f7..1656b77 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -106,96 +106,97 @@ static void print_fileinfo(struct fileinfo *info)
htmlf("<td class='none' style='width: %.1f%%;'/>",
(max_changes - info->removed - info->added) * 100.0 / max_changes);
html("</tr></table></td></tr>\n");
}
static void count_diff_lines(char *line, int len)
{
if (line && (len > 0)) {
if (line[0] == '+')
lines_added++;
else if (line[0] == '-')
lines_removed++;
}
}
static void inspect_filepair(struct diff_filepair *pair)
{
int binary = 0;
unsigned long old_size = 0;
unsigned long new_size = 0;
files++;
lines_added = 0;
lines_removed = 0;
cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, &new_size,
- &binary, 0, count_diff_lines);
+ &binary, 0, ctx.qry.ignorews, count_diff_lines);
if (files >= slots) {
if (slots == 0)
slots = 4;
else
slots = slots * 2;
items = xrealloc(items, slots * sizeof(struct fileinfo));
}
items[files-1].status = pair->status;
hashcpy(items[files-1].old_sha1, pair->one->sha1);
hashcpy(items[files-1].new_sha1, pair->two->sha1);
items[files-1].old_mode = pair->one->mode;
items[files-1].new_mode = pair->two->mode;
items[files-1].old_path = xstrdup(pair->one->path);
items[files-1].new_path = xstrdup(pair->two->path);
items[files-1].added = lines_added;
items[files-1].removed = lines_removed;
items[files-1].old_size = old_size;
items[files-1].new_size = new_size;
items[files-1].binary = binary;
if (lines_added + lines_removed > max_changes)
max_changes = lines_added + lines_removed;
total_adds += lines_added;
total_rems += lines_removed;
}
void cgit_print_diffstat(const unsigned char *old_sha1,
const unsigned char *new_sha1, const char *prefix)
{
int i, save_context = ctx.qry.context;
html("<div class='diffstat-header'>");
cgit_diff_link("Diffstat", NULL, NULL, ctx.qry.head, ctx.qry.sha1,
ctx.qry.sha2, NULL, 0);
if (prefix)
htmlf(" (limited to '%s')", prefix);
html(" (");
ctx.qry.context = (save_context > 0 ? save_context : 3) << 1;
cgit_self_link("more", NULL, NULL, &ctx);
html("/");
ctx.qry.context = (save_context > 3 ? save_context : 3) >> 1;
cgit_self_link("less", NULL, NULL, &ctx);
ctx.qry.context = save_context;
html(" context)");
html("</div>");
html("<table summary='diffstat' class='diffstat'>");
max_changes = 0;
- cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, prefix);
+ cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, prefix,
+ ctx.qry.ignorews);
for(i = 0; i<files; i++)
print_fileinfo(&items[i]);
html("</table>");
html("<div class='diffstat-summary'>");
htmlf("%d files changed, %d insertions, %d deletions",
files, total_adds, total_rems);
html("</div>");
}
/*
* print a single line returned from xdiff
*/
static void print_line(char *line, int len)
{
char *class = "ctx";
char c = line[len-1];
if (line[0] == '+')
class = "add";
else if (line[0] == '-')
class = "del";
else if (line[0] == '@')
class = "hunk";
@@ -275,49 +276,50 @@ static void filepair_cb(struct diff_filepair *pair)
{
unsigned long old_size = 0;
unsigned long new_size = 0;
int binary = 0;
linediff_fn print_line_fn = print_line;
if (use_ssdiff) {
cgit_ssdiff_header_begin();
print_line_fn = cgit_ssdiff_line_cb;
}
header(pair->one->sha1, pair->one->path, pair->one->mode,
pair->two->sha1, pair->two->path, pair->two->mode);
if (use_ssdiff)
cgit_ssdiff_header_end();
if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
if (S_ISGITLINK(pair->one->mode))
print_line_fn(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
if (S_ISGITLINK(pair->two->mode))
print_line_fn(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
if (use_ssdiff)
cgit_ssdiff_footer();
return;
}
if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
- &new_size, &binary, ctx.qry.context, print_line_fn))
+ &new_size, &binary, ctx.qry.context,
+ ctx.qry.ignorews, print_line_fn))
cgit_print_error("Error running diff");
if (binary) {
if (use_ssdiff)
html("<tr><td colspan='4'>Binary files differ</td></tr>");
else
html("Binary files differ");
}
if (use_ssdiff)
cgit_ssdiff_footer();
}
void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix)
{
enum object_type type;
unsigned long size;
struct commit *commit, *commit2;
if (!new_rev)
new_rev = ctx.qry.head;
get_sha1(new_rev, new_rev_sha1);
type = sha1_object_info(new_rev_sha1, &size);
if (type == OBJ_BAD) {
cgit_print_error(fmt("Bad object name: %s", new_rev));
return;
@@ -335,29 +337,30 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi
if (!is_null_sha1(old_rev_sha1)) {
type = sha1_object_info(old_rev_sha1, &size);
if (type == OBJ_BAD) {
cgit_print_error(fmt("Bad object name: %s", sha1_to_hex(old_rev_sha1)));
return;
}
commit2 = lookup_commit_reference(old_rev_sha1);
if (!commit2 || parse_commit(commit2))
cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(old_rev_sha1)));
}
if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff))
use_ssdiff = 1;
print_ssdiff_link();
cgit_print_diffstat(old_rev_sha1, new_rev_sha1, prefix);
if (use_ssdiff) {
html("<table summary='ssdiff' class='ssdiff'>");
} else {
html("<table summary='diff' class='diff'>");
html("<tr><td>");
}
- cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix);
+ cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix,
+ ctx.qry.ignorews);
if (!use_ssdiff)
html("</td></tr>");
html("</table>");
}