summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c3
-rw-r--r--cgit.h7
-rw-r--r--shared.c2
-rw-r--r--ui-commit.c46
-rw-r--r--ui-diff.c64
-rw-r--r--ui-shared.c22
6 files changed, 75 insertions, 69 deletions
diff --git a/cgit.c b/cgit.c
index b936a70..3fc90bf 100644
--- a/cgit.c
+++ b/cgit.c
@@ -104,6 +104,5 @@ static void cgit_print_repo_page(struct cacheitem *item)
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:
diff --git a/cgit.h b/cgit.h
index c276a24..bd2dd0d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -208,4 +208,6 @@ extern void cgit_log_link(char *name, char *title, char *class, char *head,
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);
@@ -224,7 +226,6 @@ extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *
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,
diff --git a/shared.c b/shared.c
index c7cd8a5..f20fb5c 100644
--- a/shared.c
+++ b/shared.c
@@ -361,5 +361,5 @@ void cgit_diff_tree(const unsigned char *old_sha1,
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
diff --git a/ui-commit.c b/ui-commit.c
index d489d7c..2679b59 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -12,4 +12,5 @@ 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 {
@@ -28,5 +29,4 @@ static struct fileinfo {
void print_fileinfo(struct fileinfo *info)
{
- char *query, *query2;
char *class;
@@ -76,22 +76,10 @@ void print_fileinfo(struct fileinfo *info)
}
htmlf("</td><td class='%s'>", class);
- query = fmt("id=%s&amp;id2=%s&amp;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);
@@ -146,5 +134,5 @@ void inspect_filepair(struct diff_filepair *pair)
-void cgit_print_commit(const char *hex)
+void cgit_print_commit(char *hex)
{
struct commit *commit, *parent;
@@ -152,5 +140,4 @@ void cgit_print_commit(const char *hex)
struct commit_list *p;
unsigned char sha1[20];
- char *query;
char *filename;
char *tmp;
@@ -159,4 +146,5 @@ void cgit_print_commit(const char *hex)
if (!hex)
hex = cgit_query_head;
+ curr_rev = hex;
if (get_sha1(hex, sha1)) {
@@ -203,9 +191,8 @@ void cgit_print_commit(const char *hex)
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&amp;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) {
@@ -234,8 +221,7 @@ void cgit_print_commit(const char *hex)
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);
diff --git a/ui-diff.c b/ui-diff.c
index 5c864d9..a76a234 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -90,52 +90,50 @@ static void filepair_cb(struct diff_filepair *pair)
}
-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
@@ -177,4 +177,26 @@ void cgit_commit_link(char *name, char *title, char *class, char *head,
}
+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 = "&amp;";
+ }
+ 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)
{