Don't die when diffing trees with subprojects
The subprojects needs special handling, since they refer to objects which normally won't exist in the refering repository. Fix some extended header bugs and missing features while at it. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
parent
d82c08a044
commit
f4f1339fe6
50
ui-diff.c
50
ui-diff.c
@ -31,39 +31,63 @@ static void print_line(char *line, int len)
|
|||||||
line[len-1] = c;
|
line[len-1] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void header(unsigned char *sha1, char *path1,
|
static void header(unsigned char *sha1, char *path1, int mode1,
|
||||||
unsigned char *sha2, char *path2)
|
unsigned char *sha2, char *path2, int mode2)
|
||||||
{
|
{
|
||||||
char *abbrev1, *abbrev2;
|
char *abbrev1, *abbrev2;
|
||||||
if (is_null_sha1(sha1))
|
int subproject;
|
||||||
path1 = "dev/null";
|
|
||||||
if (is_null_sha1(sha2))
|
subproject = (S_ISDIRLNK(mode1) || S_ISDIRLNK(mode2));
|
||||||
path2 = "dev/null";
|
|
||||||
html("<tr><td>");
|
html("<tr><td>");
|
||||||
html("<div class='head'>");
|
html("<div class='head'>");
|
||||||
html("diff --git a/");
|
html("diff --git a/");
|
||||||
html_txt(path1);
|
html_txt(path1);
|
||||||
html(" b/");
|
html(" b/");
|
||||||
html_txt(path2);
|
html_txt(path2);
|
||||||
|
|
||||||
|
if (is_null_sha1(sha1))
|
||||||
|
path1 = "dev/null";
|
||||||
|
if (is_null_sha1(sha2))
|
||||||
|
path2 = "dev/null";
|
||||||
|
|
||||||
|
if (mode1 == 0)
|
||||||
|
htmlf("<br/>new file mode %.6o", mode2);
|
||||||
|
|
||||||
|
if (mode2 == 0)
|
||||||
|
htmlf("<br/>deleted file mode %.6o", mode1);
|
||||||
|
|
||||||
|
if (!subproject) {
|
||||||
abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV));
|
abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV));
|
||||||
abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV));
|
abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV));
|
||||||
htmlf("\nindex %s..%s", abbrev1, abbrev2);
|
htmlf("<br/>index %s..%s", abbrev1, abbrev2);
|
||||||
free(abbrev1);
|
free(abbrev1);
|
||||||
free(abbrev2);
|
free(abbrev2);
|
||||||
html("\n--- a/");
|
if (mode1 != 0 && mode2 != 0) {
|
||||||
|
htmlf(" %.6o", mode1);
|
||||||
|
if (mode2 != mode1)
|
||||||
|
htmlf("..%.6o", mode2);
|
||||||
|
}
|
||||||
|
html("<br/>--- a/");
|
||||||
html_txt(path1);
|
html_txt(path1);
|
||||||
html("\n+++ b/");
|
html("<br/>+++ b/");
|
||||||
html_txt(path2);
|
html_txt(path2);
|
||||||
|
}
|
||||||
html("</div>");
|
html("</div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void filepair_cb(struct diff_filepair *pair)
|
static void filepair_cb(struct diff_filepair *pair)
|
||||||
{
|
{
|
||||||
header(pair->one->sha1, pair->one->path,
|
header(pair->one->sha1, pair->one->path, pair->one->mode,
|
||||||
pair->two->sha1, pair->two->path);
|
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);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
|
if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
|
||||||
cgit_print_error("Error running diff");
|
cgit_print_error("Error running diff");
|
||||||
html("</tr></td>");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, char *path)
|
void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, char *path)
|
||||||
@ -100,7 +124,7 @@ void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex,
|
|||||||
switch(type) {
|
switch(type) {
|
||||||
case OBJ_BLOB:
|
case OBJ_BLOB:
|
||||||
html("<tr><td>");
|
html("<tr><td>");
|
||||||
header(sha1, path, sha2, path);
|
header(sha1, path, 0644, sha2, path, 0644);
|
||||||
if (cgit_diff_files(sha1, sha2, print_line))
|
if (cgit_diff_files(sha1, sha2, print_line))
|
||||||
cgit_print_error("Error running diff");
|
cgit_print_error("Error running diff");
|
||||||
html("</tr></td>");
|
html("</tr></td>");
|
||||||
|
Loading…
Reference in New Issue
Block a user