diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2007-05-13 23:13:12 +0200 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2007-05-13 23:27:53 +0200 | 
| commit | 6a8749d3bd1570faa3dc07e80efc8fcef5953aa0 (patch) | |
| tree | 1c76a6b2434cea448bc8d73f452904d8024a8ccb /ui-diff.c | |
| parent | Add graphical diffstat to commit view (diff) | |
| download | cgit-6a8749d3bd1570faa3dc07e80efc8fcef5953aa0.tar.gz cgit-6a8749d3bd1570faa3dc07e80efc8fcef5953aa0.tar.bz2 cgit-6a8749d3bd1570faa3dc07e80efc8fcef5953aa0.zip | |
Add commitdiff between commit and each of it's parent
A link is added next to each parent of a commit, leading to the new
diff-functionality in ui-diff.c.
Also added support for a path-parameter to filelevel diffs accessed via the
diffstat.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to '')
| -rw-r--r-- | ui-diff.c | 45 | 
1 files changed, 41 insertions, 4 deletions
| @@ -31,15 +31,52 @@ static void print_line(char *line, int len)  	line[len-1] = c;  } -void cgit_print_diff(const char *old_hex, const char *new_hex) +static void filepair_cb(struct diff_filepair *pair) +{ +	html("<tr><th>"); +	html_txt(pair->two->path); +	html("</th></tr>"); +	html("<tr><td>"); +	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 *old_hex, const char *new_hex, char *path)  {  	unsigned char sha1[20], sha2[20]; +	enum object_type type; +	unsigned long size;  	get_sha1(old_hex, sha1);  	get_sha1(new_hex, sha2); -	html("<table class='diff'><tr><td>"); -	if (cgit_diff_files(sha1, sha2, print_line)) -		cgit_print_error("Error running diff"); +	type = sha1_object_info(sha1, &size); +	if (type == OBJ_BAD) { +		type = sha1_object_info(sha2, &size); +		if (type == OBJ_BAD) { +			cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); +			return; +		} +	} + +	html("<table class='diff'>"); +	switch(type) { +	case OBJ_BLOB: +		if (path) +			htmlf("<tr><th>%s</th></tr>", path); +		html("<tr><td>"); +		if (cgit_diff_files(sha1, sha2, print_line)) +			cgit_print_error("Error running diff"); +		html("</tr></td>"); +		break; +	case OBJ_TREE: +		cgit_diff_tree(sha1, sha2, filepair_cb); +		break; +	default: +		cgit_print_error(fmt("Unhandled object type: %s", +				     typename(type))); +		break; +	}  	html("</td></tr></table>");  } | 
