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 | |
| 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>
| -rw-r--r-- | cgit.c | 2 | ||||
| -rw-r--r-- | cgit.css | 5 | ||||
| -rw-r--r-- | cgit.h | 2 | ||||
| -rw-r--r-- | ui-commit.c | 19 | ||||
| -rw-r--r-- | ui-diff.c | 45 | 
5 files changed, 63 insertions, 10 deletions
| @@ -116,7 +116,7 @@ static void cgit_print_repo_page(struct cacheitem *item)  	} else if (!strcmp(cgit_query_page, "view")) {  		cgit_print_view(cgit_query_sha1, cgit_query_path);  	} else if (!strcmp(cgit_query_page, "diff")) { -		cgit_print_diff(cgit_query_sha1, cgit_query_sha2); +		cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path);  	} else {  		cgit_print_error("Invalid request");  	} @@ -290,6 +290,11 @@ div.diffstat-summary {  	padding-top: 0.5em;  } +table.diff th { +	padding: 1em 0em 0.1em 0.1em; +	text-align: left; +} +  table.diff td {  	border: solid 1px black;  	font-family: monospace; @@ -174,7 +174,7 @@ extern void cgit_print_view(const char *hex, char *path);  extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);  extern void cgit_print_tree(const char *hex, char *path);  extern void cgit_print_commit(const char *hex); -extern void cgit_print_diff(const char *old_hex, const char *new_hex); +extern void cgit_print_diff(const char *old_hex, const char *new_hex, char *path);  extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,   				const char *format, const char *prefix,  				const char *filename); diff --git a/ui-commit.c b/ui-commit.c index ce33cf9..b3d1c28 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -76,8 +76,8 @@ void print_fileinfo(struct fileinfo *info)  		html("]</span>");  	}  	htmlf("</td><td class='%s'>", class); -	query = fmt("id=%s&id2=%s", sha1_to_hex(info->old_sha1), -		    sha1_to_hex(info->new_sha1)); +	query = fmt("id=%s&id2=%s&path=%s", sha1_to_hex(info->old_sha1), +		    sha1_to_hex(info->new_sha1), info->new_path);  	html_link_open(cgit_pageurl(cgit_query_repo, "diff", query),  		       NULL, NULL);  	if (info->status == DIFF_STATUS_COPIED || @@ -151,7 +151,7 @@ void inspect_filepair(struct diff_filepair *pair)  void cgit_print_commit(const char *hex)  { -	struct commit *commit; +	struct commit *commit, *parent;  	struct commitinfo *info;  	struct commit_list *p;  	unsigned char sha1[20]; @@ -190,13 +190,24 @@ void cgit_print_commit(const char *hex)  	html_attr(cgit_pageurl(cgit_query_repo, "tree", query));  	htmlf("'>%s</a></td></tr>\n", sha1_to_hex(commit->tree->object.sha1));        	for (p = commit->parents; p ; p = p->next) { +		parent = lookup_commit_reference(p->item->object.sha1); +		if (!parent) { +			html("<tr><td colspan='3'>"); +			cgit_print_error("Error reading parent commit"); +			html("</td></tr>"); +			continue; +		}  		html("<tr><th>parent</th>"  		     "<td colspan='2' class='sha1'>"  		     "<a href='");  		query = fmt("id=%s", sha1_to_hex(p->item->object.sha1));  		html_attr(cgit_pageurl(cgit_query_repo, "commit", query)); -		htmlf("'>%s</a></td></tr>\n", +		htmlf("'>%s</a> (<a href='",  		      sha1_to_hex(p->item->object.sha1)); +		query = fmt("id=%s&id2=%s", sha1_to_hex(parent->tree->object.sha1), +			    sha1_to_hex(commit->tree->object.sha1)); +		html_attr(cgit_pageurl(cgit_query_repo, "diff", query)); +		html("'>diff</a>)</td></tr>");  	}  	if (cgit_repo->snapshots) {  		htmlf("<tr><th>download</th><td colspan='2' class='sha1'><a href='"); @@ -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>");  } | 
