diff options
| -rw-r--r-- | cgit.c | 3 | ||||
| -rw-r--r-- | cgit.h | 7 | ||||
| -rw-r--r-- | shared.c | 2 | ||||
| -rw-r--r-- | ui-commit.c | 46 | ||||
| -rw-r--r-- | ui-diff.c | 64 | ||||
| -rw-r--r-- | ui-shared.c | 22 | 
6 files changed, 75 insertions, 69 deletions
| @@ -103,8 +103,7 @@ static void cgit_print_repo_page(struct cacheitem *item)  		cgit_print_commit(cgit_query_sha1);  		break;  	case CMD_DIFF: -		cgit_print_diff(cgit_query_head, cgit_query_sha1, cgit_query_sha2, -				cgit_query_path); +		cgit_print_diff(cgit_query_sha1, cgit_query_sha2);  		break;  	default:  		cgit_print_error("Invalid request"); @@ -207,6 +207,8 @@ extern void cgit_log_link(char *name, char *title, char *class, char *head,  			  char *rev, char *path);  extern void cgit_commit_link(char *name, char *title, char *class, char *head,  			     char *rev); +extern void cgit_diff_link(char *name, char *title, char *class, char *head, +			   char *new_rev, char *old_rev, char *path);  extern void cgit_print_error(char *msg);  extern void cgit_print_date(time_t secs, char *format); @@ -223,9 +225,8 @@ extern void cgit_print_summary();  extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path, int pager);  extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);  extern void cgit_print_tree(const char *rev, char *path); -extern void cgit_print_commit(const char *hex); -extern void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, -			    char *path); +extern void cgit_print_commit(char *hex); +extern void cgit_print_diff(const char *new_hex, const char *old_hex);  extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,  				const char *format, const char *prefix,  				const char *filename); @@ -360,7 +360,7 @@ void cgit_diff_tree(const unsigned char *old_sha1,  	opt.format_callback_data = fn;  	diff_setup_done(&opt); -	if (old_sha1) +	if (old_sha1 && !is_null_sha1(old_sha1))  		ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt);  	else  		ret = diff_root_tree_sha1(new_sha1, "", &opt); diff --git a/ui-commit.c b/ui-commit.c index d489d7c..2679b59 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -11,6 +11,7 @@  static int files, slots;  static int total_adds, total_rems, max_changes;  static int lines_added, lines_removed; +static char *curr_rev;  static struct fileinfo {  	char status; @@ -27,7 +28,6 @@ static struct fileinfo {  void print_fileinfo(struct fileinfo *info)  { -	char *query, *query2;  	char *class;  	switch (info->status) { @@ -75,24 +75,12 @@ void print_fileinfo(struct fileinfo *info)  		html("]</span>");  	}  	htmlf("</td><td class='%s'>", class); -	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 || -	    info->status == DIFF_STATUS_RENAMED) { -		html_txt(info->new_path); -		htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ? -		      "copied" : "renamed"); -		query2 = fmt("id=%s", sha1_to_hex(info->old_sha1)); -		html_link_open(cgit_pageurl(cgit_query_repo, "view", query2), -			       NULL, NULL); -		html_txt(info->old_path); -		html("</a>)"); -	} else { -		html_txt(info->new_path); -		html("</a>"); -	} +	cgit_tree_link(info->new_path, NULL, NULL, cgit_query_head, curr_rev, +		       info->new_path); +	if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED) +		htmlf(" (%s from %s)", +		      info->status == DIFF_STATUS_COPIED ? "copied" : "renamed", +		      info->old_path);  	html("</td><td class='right'>");  	htmlf("%d", info->added + info->removed);  	html("</td><td class='graph'>"); @@ -145,19 +133,19 @@ void inspect_filepair(struct diff_filepair *pair)  } -void cgit_print_commit(const char *hex) +void cgit_print_commit(char *hex)  {  	struct commit *commit, *parent;  	struct commitinfo *info;  	struct commit_list *p;  	unsigned char sha1[20]; -	char *query;  	char *filename;  	char *tmp;  	int i;  	if (!hex)  		hex = cgit_query_head; +	curr_rev = hex;  	if (get_sha1(hex, sha1)) {  		cgit_print_error(fmt("Bad object id: %s", hex)); @@ -202,11 +190,10 @@ void cgit_print_commit(const char *hex)  		     "<td colspan='2' class='sha1'>");  		cgit_commit_link(sha1_to_hex(p->item->object.sha1), NULL, NULL,  				 cgit_query_head, sha1_to_hex(p->item->object.sha1)); -		html(" (<a href='"); -		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>"); +		html(" ("); +		cgit_diff_link("diff", NULL, NULL, cgit_query_head, hex, +			       sha1_to_hex(p->item->object.sha1), NULL); +		html(")</td></tr>");  	}  	if (cgit_repo->snapshots) {  		htmlf("<tr><th>download</th><td colspan='2' class='sha1'><a href='"); @@ -233,10 +220,9 @@ void cgit_print_commit(const char *hex)  		html("<div class='diffstat-summary'>");  		htmlf("%d files changed, %d insertions, %d deletions (",  		      files, total_adds, total_rems); -		query = fmt("h=%s", hex); -		html_link_open(cgit_pageurl(cgit_query_repo, "diff", query), NULL, NULL); -		html("show diff</a>)"); -		html("</div>"); +		cgit_diff_link("show diff", NULL, NULL, cgit_query_head, hex, +			       NULL, NULL); +		html(")</div>");  	}  	cgit_free_commitinfo(info);  } @@ -89,54 +89,52 @@ static void filepair_cb(struct diff_filepair *pair)  		cgit_print_error("Error running diff");  } -void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, char *path) +void cgit_print_diff(const char *new_rev, const char *old_rev)  {  	unsigned char sha1[20], sha2[20];  	enum object_type type;  	unsigned long size; -	struct commit *commit; +	struct commit *commit, *commit2; -	html("<table class='diff'>"); -	html("<tr><td>"); - -	if (head && !old_hex && !new_hex) { -		get_sha1(head, sha1); -		commit = lookup_commit_reference(sha1); -		if (commit && !parse_commit(commit)) -			cgit_diff_commit(commit, filepair_cb); -		else -			cgit_print_error(fmt("Bad commit: %s", head)); -		html("</td></tr>"); -		html("</table>"); +	if (!new_rev) +		new_rev = cgit_query_head; +	get_sha1(new_rev, sha1); +	type = sha1_object_info(sha1, &size); +	if (type == OBJ_BAD) { +		cgit_print_error(fmt("Bad object name: %s", new_rev)); +		return; +	} +	if (type != OBJ_COMMIT) { +		cgit_print_error(fmt("Unhandled object type: %s", +				     typename(type)));  		return;  	} -	get_sha1(old_hex, sha1); -	get_sha1(new_hex, sha2); +	commit = lookup_commit_reference(sha1); +	if (!commit || parse_commit(commit)) +		cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(sha1))); -	type = sha1_object_info(sha1, &size); -	if (type == OBJ_BAD) { +	if (old_rev) +		get_sha1(old_rev, sha2); +	else if (commit->parents && commit->parents->item) +		hashcpy(sha2, commit->parents->item->object.sha1); +	else +		hashclr(sha2); + +	if (!is_null_sha1(sha2)) {  		type = sha1_object_info(sha2, &size);  		if (type == OBJ_BAD) { -			cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); +			cgit_print_error(fmt("Bad object name: %s", sha1_to_hex(sha2)));  			return;  		} +		commit2 = lookup_commit_reference(sha2); +		if (!commit2 || parse_commit(commit2)) +			cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(sha2)));  	} -	switch(type) { -	case OBJ_BLOB: -		header(sha1, path, 0644, sha2, path, 0644); -		if (cgit_diff_files(sha1, sha2, print_line)) -			cgit_print_error("Error running diff"); -		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("<table class='diff'>"); +	html("<tr><td>"); +	cgit_diff_tree(sha2, sha1, filepair_cb);  	html("</td></tr>");  	html("</table>");  } diff --git a/ui-shared.c b/ui-shared.c index 71c899a..15d8254 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -176,6 +176,28 @@ void cgit_commit_link(char *name, char *title, char *class, char *head,  	reporevlink("commit", name, title, class, head, rev, NULL);  } +void cgit_diff_link(char *name, char *title, char *class, char *head, +		    char *new_rev, char *old_rev, char *path) +{ +	char *delim; + +	delim = repolink(title, class, "diff", head, path); +	if (new_rev && strcmp(new_rev, cgit_query_head)) { +		html(delim); +		html("id="); +		html_attr(new_rev); +		delim = "&"; +	} +	if (old_rev) { +		html(delim); +		html("id2="); +		html_attr(old_rev); +	} +	html("'>"); +	html_txt(name); +	html("</a>"); +} +  void cgit_print_date(time_t secs, char *format)  {  	char buf[64]; | 
