diff options
| -rw-r--r-- | ui-diff.c | 62 | 
1 files changed, 43 insertions, 19 deletions
| @@ -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>"); | 
