about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2007-05-16 04:21:06 +0200
committerLars Hjemli <hjemli@gmail.com>2007-05-16 04:21:06 +0200
commitf4f1339fe62fb1a28c147567195a86dd99485e25 (patch)
tree948b58f6bc18ec87f81f84221510eec85c41e16d
parentDo not wrap filemode column in diffstat table (diff)
downloadcgit-pink-f4f1339fe62fb1a28c147567195a86dd99485e25.tar.gz
cgit-pink-f4f1339fe62fb1a28c147567195a86dd99485e25.zip
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>
-rw-r--r--ui-diff.c62
1 files changed, 43 insertions, 19 deletions
diff --git a/ui-diff.c b/ui-diff.c
index afe1c90..3ed0a46 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -31,39 +31,63 @@ static void print_line(char *line, int len)
 	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 @@ void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex,
 	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>");
='nohover-highlight'> 2019-12-18Hide line numbers when rendering mdocJune McEnroe Hack: output an extra <td> after rendering mdoc so that line numbers can be hidden based on there being three. This required splitting source-filter and about-filter since on about pages there is no table. 2019-12-18Customize cgit CSSJune McEnroe 2019-12-18Use :target rather than :focus pseudo-classJune McEnroe :target persists after you click on something else. 2019-12-18Copy cgit auxiliary binaries properlyJune McEnroe 2019-12-18Add git.causal.agency cgit configJune McEnroe 2019-12-18Bail from hi if input is binaryJune McEnroe NULs in the input cause an infinite loop in htmlEscape, not to mention regexes obviously not working, etc. 2019-12-16Post "cgit setup"June McEnroe