X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/fe1230dece81450004d02fa8a470f8dab8f7fdd9..7fdff2460440c09d13fc76af3b75e85434e6f563:/ui-diff.c?ds=sidebyside
diff --git a/ui-diff.c b/ui-diff.c
index 625b5fd..fb836df 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -9,6 +9,7 @@
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
+#include "ui-ssdiff.h"
unsigned char old_rev_sha1[20];
unsigned char new_rev_sha1[20];
@@ -16,7 +17,6 @@ unsigned char new_rev_sha1[20];
static int files, slots;
static int total_adds, total_rems, max_changes;
static int lines_added, lines_removed;
-static char *curr_rev;
static struct fileinfo {
char status;
@@ -28,8 +28,12 @@ static struct fileinfo {
char *new_path;
unsigned int added;
unsigned int removed;
+ unsigned long old_size;
+ unsigned long new_size;
+ int binary:1;
} *items;
+static int use_ssdiff = 0;
static void print_fileinfo(struct fileinfo *info)
{
@@ -80,13 +84,18 @@ static void print_fileinfo(struct fileinfo *info)
html("]");
}
htmlf("
", class);
- cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, curr_rev,
- NULL, info->new_path);
+ cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1,
+ ctx.qry.sha2, info->new_path, 0);
if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED)
htmlf(" (%s from %s)",
info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
info->old_path);
html(" | ");
+ if (info->binary) {
+ htmlf("bin | %d -> %d bytes",
+ info->old_size, info->new_size);
+ return;
+ }
htmlf("%d", info->added + info->removed);
html(" | ");
htmlf("", (max_changes > 100 ? 100 : max_changes));
@@ -111,10 +120,14 @@ static void count_diff_lines(char *line, int len)
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, count_diff_lines);
+ cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, &new_size,
+ &binary, count_diff_lines);
if (files >= slots) {
if (slots == 0)
slots = 4;
@@ -131,6 +144,9 @@ static void inspect_filepair(struct diff_filepair *pair)
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;
@@ -138,14 +154,19 @@ static void inspect_filepair(struct diff_filepair *pair)
}
void cgit_print_diffstat(const unsigned char *old_sha1,
- const unsigned char *new_sha1)
+ const unsigned char *new_sha1, const char *prefix)
{
int i;
- html("");
+ html("");
html("");
max_changes = 0;
- cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, NULL);
+ cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, prefix);
for(i = 0; i");
@@ -229,19 +250,54 @@ static void header(unsigned char *sha1, char *path1, int mode1,
html("");
}
+static void print_ssdiff_link()
+{
+ if (!strcmp(ctx.qry.page, "diff")) {
+ if (use_ssdiff)
+ cgit_diff_link("Unidiff", NULL, NULL, ctx.qry.head,
+ ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1);
+ else
+ cgit_diff_link("Side-by-side diff", NULL, NULL,
+ ctx.qry.head, ctx.qry.sha1,
+ ctx.qry.sha2, ctx.qry.path, 1);
+ }
+}
+
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(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
+ print_line_fn(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
if (S_ISGITLINK(pair->two->mode))
- print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
+ 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, print_line))
+ if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
+ &new_size, &binary, print_line_fn))
cgit_print_error("Error running diff");
+ if (binary) {
+ if (use_ssdiff)
+ html("| Binary files differ | ");
+ 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)
@@ -258,12 +314,6 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi
cgit_print_error(fmt("Bad object name: %s", new_rev));
return;
}
- if (type != OBJ_COMMIT) {
- cgit_print_error(fmt("Unhandled object type: %s",
- typename(type)));
- return;
- }
-
commit = lookup_commit_reference(new_rev_sha1);
if (!commit || parse_commit(commit))
cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(new_rev_sha1)));
@@ -285,11 +335,21 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi
if (!commit2 || parse_commit(commit2))
cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(old_rev_sha1)));
}
- cgit_print_diffstat(old_rev_sha1, new_rev_sha1);
- html("");
- html("");
+ 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("");
+ } else {
+ html("");
+ html("| ");
+ }
cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix);
- html(" | ");
+ if (!use_ssdiff)
+ html("");
html(" ");
}
|
|