X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/f4f1339fe62fb1a28c147567195a86dd99485e25..961893b5478e7676b1a422185fcac41f89434b0a:/ui-diff.c diff --git a/ui-diff.c b/ui-diff.c index 3ed0a46..c6bad63 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -7,6 +7,191 @@ */ #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]; + +static int files, slots; +static int total_adds, total_rems, max_changes; +static int lines_added, lines_removed; + +static struct fileinfo { + char status; + unsigned char old_sha1[20]; + unsigned char new_sha1[20]; + unsigned short old_mode; + unsigned short new_mode; + char *old_path; + 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 struct diff_filepair *current_filepair; + +struct diff_filespec *cgit_get_current_old_file(void) +{ + return current_filepair->one; +} + +struct diff_filespec *cgit_get_current_new_file(void) +{ + return current_filepair->two; +} + +static void print_fileinfo(struct fileinfo *info) +{ + char *class; + + switch (info->status) { + case DIFF_STATUS_ADDED: + class = "add"; + break; + case DIFF_STATUS_COPIED: + class = "cpy"; + break; + case DIFF_STATUS_DELETED: + class = "del"; + break; + case DIFF_STATUS_MODIFIED: + class = "upd"; + break; + case DIFF_STATUS_RENAMED: + class = "mov"; + break; + case DIFF_STATUS_TYPE_CHANGED: + class = "typ"; + break; + case DIFF_STATUS_UNKNOWN: + class = "unk"; + break; + case DIFF_STATUS_UNMERGED: + class = "stg"; + break; + default: + die("bug: unhandled diff status %c", info->status); + } + + html("
| ", + info->added * 100.0 / max_changes); + htmlf(" | ", + info->removed * 100.0 / max_changes); + htmlf(" | ", + (max_changes - info->removed - info->added) * 100.0 / max_changes); + html(" |
| ");
+ subproject = (S_ISGITLINK(mode1) || S_ISGITLINK(mode2));
html(" ");
html("diff --git a/");
html_txt(path1);
@@ -68,74 +252,163 @@ static void header(unsigned char *sha1, char *path1, int mode1,
htmlf("..%.6o", mode2);
}
html(" ");
}
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;
+
+ current_filepair = pair;
+ 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 (S_ISDIRLNK(pair->one->mode) || S_ISDIRLNK(pair->two->mode)) {
- if (S_ISDIRLNK(pair->one->mode))
- print_line(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
- if (S_ISDIRLNK(pair->two->mode))
- print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
+ 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, print_line))
+ if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
+ &new_size, &binary, ctx.qry.context,
+ ctx.qry.ignorews, print_line_fn))
cgit_print_error("Error running diff");
+ if (binary) {
+ if (use_ssdiff)
+ html("--- a/"); - html_txt(path1); + if (mode1 != 0) + cgit_tree_link(path1, NULL, NULL, ctx.qry.head, + sha1_to_hex(old_rev_sha1), path1); + else + html_txt(path1); html(" +++ b/"); - html_txt(path2); + if (mode2 != 0) + cgit_tree_link(path2, NULL, NULL, ctx.qry.head, + sha1_to_hex(new_rev_sha1), path2); + else + html_txt(path2); } html(" | |||
| Binary files differ | |||
| "); - header(sha1, path, 0644, sha2, path, 0644); - if (cgit_diff_files(sha1, sha2, print_line)) - cgit_print_error("Error running diff"); - html(" |