summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c2
-rw-r--r--cgit.css5
-rw-r--r--cgit.h2
-rw-r--r--ui-commit.c19
-rw-r--r--ui-diff.c45
5 files changed, 63 insertions, 10 deletions
diff --git a/cgit.c b/cgit.c
index aee7ba3..3d85a08 100644
--- a/cgit.c
+++ b/cgit.c
@@ -117,5 +117,5 @@ static void cgit_print_repo_page(struct cacheitem *item)
117 cgit_print_view(cgit_query_sha1, cgit_query_path); 117 cgit_print_view(cgit_query_sha1, cgit_query_path);
118 } else if (!strcmp(cgit_query_page, "diff")) { 118 } else if (!strcmp(cgit_query_page, "diff")) {
119 cgit_print_diff(cgit_query_sha1, cgit_query_sha2); 119 cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path);
120 } else { 120 } else {
121 cgit_print_error("Invalid request"); 121 cgit_print_error("Invalid request");
diff --git a/cgit.css b/cgit.css
index b736b19..fe0ba50 100644
--- a/cgit.css
+++ b/cgit.css
@@ -291,4 +291,9 @@ div.diffstat-summary {
291} 291}
292 292
293table.diff th {
294 padding: 1em 0em 0.1em 0.1em;
295 text-align: left;
296}
297
293table.diff td { 298table.diff td {
294 border: solid 1px black; 299 border: solid 1px black;
diff --git a/cgit.h b/cgit.h
index 46f3173..93699b5 100644
--- a/cgit.h
+++ b/cgit.h
@@ -175,5 +175,5 @@ extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path)
175extern void cgit_print_tree(const char *hex, char *path); 175extern void cgit_print_tree(const char *hex, char *path);
176extern void cgit_print_commit(const char *hex); 176extern void cgit_print_commit(const char *hex);
177extern void cgit_print_diff(const char *old_hex, const char *new_hex); 177extern void cgit_print_diff(const char *old_hex, const char *new_hex, char *path);
178extern void cgit_print_snapshot(struct cacheitem *item, const char *hex, 178extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,
179 const char *format, const char *prefix, 179 const char *format, const char *prefix,
diff --git a/ui-commit.c b/ui-commit.c
index ce33cf9..b3d1c28 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -77,6 +77,6 @@ void print_fileinfo(struct fileinfo *info)
77 } 77 }
78 htmlf("</td><td class='%s'>", class); 78 htmlf("</td><td class='%s'>", class);
79 query = fmt("id=%s&id2=%s", sha1_to_hex(info->old_sha1), 79 query = fmt("id=%s&id2=%s&path=%s", sha1_to_hex(info->old_sha1),
80 sha1_to_hex(info->new_sha1)); 80 sha1_to_hex(info->new_sha1), info->new_path);
81 html_link_open(cgit_pageurl(cgit_query_repo, "diff", query), 81 html_link_open(cgit_pageurl(cgit_query_repo, "diff", query),
82 NULL, NULL); 82 NULL, NULL);
@@ -152,5 +152,5 @@ void inspect_filepair(struct diff_filepair *pair)
152void cgit_print_commit(const char *hex) 152void cgit_print_commit(const char *hex)
153{ 153{
154 struct commit *commit; 154 struct commit *commit, *parent;
155 struct commitinfo *info; 155 struct commitinfo *info;
156 struct commit_list *p; 156 struct commit_list *p;
@@ -191,4 +191,11 @@ void cgit_print_commit(const char *hex)
191 htmlf("'>%s</a></td></tr>\n", sha1_to_hex(commit->tree->object.sha1)); 191 htmlf("'>%s</a></td></tr>\n", sha1_to_hex(commit->tree->object.sha1));
192 for (p = commit->parents; p ; p = p->next) { 192 for (p = commit->parents; p ; p = p->next) {
193 parent = lookup_commit_reference(p->item->object.sha1);
194 if (!parent) {
195 html("<tr><td colspan='3'>");
196 cgit_print_error("Error reading parent commit");
197 html("</td></tr>");
198 continue;
199 }
193 html("<tr><th>parent</th>" 200 html("<tr><th>parent</th>"
194 "<td colspan='2' class='sha1'>" 201 "<td colspan='2' class='sha1'>"
@@ -196,6 +203,10 @@ void cgit_print_commit(const char *hex)
196 query = fmt("id=%s", sha1_to_hex(p->item->object.sha1)); 203 query = fmt("id=%s", sha1_to_hex(p->item->object.sha1));
197 html_attr(cgit_pageurl(cgit_query_repo, "commit", query)); 204 html_attr(cgit_pageurl(cgit_query_repo, "commit", query));
198 htmlf("'>%s</a></td></tr>\n", 205 htmlf("'>%s</a> (<a href='",
199 sha1_to_hex(p->item->object.sha1)); 206 sha1_to_hex(p->item->object.sha1));
207 query = fmt("id=%s&id2=%s", sha1_to_hex(parent->tree->object.sha1),
208 sha1_to_hex(commit->tree->object.sha1));
209 html_attr(cgit_pageurl(cgit_query_repo, "diff", query));
210 html("'>diff</a>)</td></tr>");
200 } 211 }
201 if (cgit_repo->snapshots) { 212 if (cgit_repo->snapshots) {
diff --git a/ui-diff.c b/ui-diff.c
index 96106af..10330d3 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -32,14 +32,51 @@ static void print_line(char *line, int len)
32} 32}
33 33
34void cgit_print_diff(const char *old_hex, const char *new_hex) 34static void filepair_cb(struct diff_filepair *pair)
35{
36 html("<tr><th>");
37 html_txt(pair->two->path);
38 html("</th></tr>");
39 html("<tr><td>");
40 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
41 cgit_print_error("Error running diff");
42 html("</tr></td>");
43}
44
45void cgit_print_diff(const char *old_hex, const char *new_hex, char *path)
35{ 46{
36 unsigned char sha1[20], sha2[20]; 47 unsigned char sha1[20], sha2[20];
48 enum object_type type;
49 unsigned long size;
37 50
38 get_sha1(old_hex, sha1); 51 get_sha1(old_hex, sha1);
39 get_sha1(new_hex, sha2); 52 get_sha1(new_hex, sha2);
40 53
41 html("<table class='diff'><tr><td>"); 54 type = sha1_object_info(sha1, &size);
42 if (cgit_diff_files(sha1, sha2, print_line)) 55 if (type == OBJ_BAD) {
43 cgit_print_error("Error running diff"); 56 type = sha1_object_info(sha2, &size);
57 if (type == OBJ_BAD) {
58 cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex));
59 return;
60 }
61 }
62
63 html("<table class='diff'>");
64 switch(type) {
65 case OBJ_BLOB:
66 if (path)
67 htmlf("<tr><th>%s</th></tr>", path);
68 html("<tr><td>");
69 if (cgit_diff_files(sha1, sha2, print_line))
70 cgit_print_error("Error running diff");
71 html("</tr></td>");
72 break;
73 case OBJ_TREE:
74 cgit_diff_tree(sha1, sha2, filepair_cb);
75 break;
76 default:
77 cgit_print_error(fmt("Unhandled object type: %s",
78 typename(type)));
79 break;
80 }
44 html("</td></tr></table>"); 81 html("</td></tr></table>");
45} 82}