all repos — cgit @ f4f1339fe62fb1a28c147567195a86dd99485e25

a hyperfast web frontend for git written in c

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>
Lars Hjemli hjemli@gmail.com
Wed, 16 May 2007 04:21:06 +0200
commit

f4f1339fe62fb1a28c147567195a86dd99485e25

parent

d82c08a0446aa712a7d825e07f3d51796421b3a2

1 files changed, 43 insertions(+), 19 deletions(-)

jump to
M ui-diff.cui-diff.c

@@ -31,39 +31,63 @@ html("</div>");

line[len-1] = c; } -static void header(unsigned char *sha1, char *path1, - unsigned char *sha2, char *path2) +static void header(unsigned char *sha1, char *path1, int mode1, + unsigned char *sha2, char *path2, int mode2) { char *abbrev1, *abbrev2; - if (is_null_sha1(sha1)) - path1 = "dev/null"; - if (is_null_sha1(sha2)) - path2 = "dev/null"; + int subproject; + + subproject = (S_ISDIRLNK(mode1) || S_ISDIRLNK(mode2)); html("<tr><td>"); html("<div class='head'>"); html("diff --git a/"); html_txt(path1); html(" b/"); html_txt(path2); - abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); - abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV)); - htmlf("\nindex %s..%s", abbrev1, abbrev2); - free(abbrev1); - free(abbrev2); - html("\n--- a/"); - html_txt(path1); - html("\n+++ b/"); - 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)); + abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV)); + htmlf("<br/>index %s..%s", abbrev1, abbrev2); + free(abbrev1); + free(abbrev2); + if (mode1 != 0 && mode2 != 0) { + htmlf(" %.6o", mode1); + if (mode2 != mode1) + htmlf("..%.6o", mode2); + } + html("<br/>--- a/"); + html_txt(path1); + html("<br/>+++ b/"); + html_txt(path2); + } html("</div>"); } static void filepair_cb(struct diff_filepair *pair) { - header(pair->one->sha1, pair->one->path, - pair->two->sha1, pair->two->path); + 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); + return; + } if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line)) 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)

@@ -100,7 +124,7 @@ html("<table class='diff'>");

switch(type) { case OBJ_BLOB: html("<tr><td>"); - header(sha1, path, sha2, path); + header(sha1, path, 0644, sha2, path, 0644); if (cgit_diff_files(sha1, sha2, print_line)) cgit_print_error("Error running diff"); html("</tr></td>");