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
@@ -113,13 +113,13 @@ static void cgit_print_repo_page(struct cacheitem *item)
113 cgit_print_tree(cgit_query_sha1, cgit_query_path); 113 cgit_print_tree(cgit_query_sha1, cgit_query_path);
114 } else if (!strcmp(cgit_query_page, "commit")) { 114 } else if (!strcmp(cgit_query_page, "commit")) {
115 cgit_print_commit(cgit_query_sha1); 115 cgit_print_commit(cgit_query_sha1);
116 } else if (!strcmp(cgit_query_page, "view")) { 116 } else if (!strcmp(cgit_query_page, "view")) {
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");
122 } 122 }
123 cgit_print_docend(); 123 cgit_print_docend();
124} 124}
125 125
diff --git a/cgit.css b/cgit.css
index b736b19..fe0ba50 100644
--- a/cgit.css
+++ b/cgit.css
@@ -287,12 +287,17 @@ table.diffstat td.graph img {
287 287
288div.diffstat-summary { 288div.diffstat-summary {
289 color: #888; 289 color: #888;
290 padding-top: 0.5em; 290 padding-top: 0.5em;
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;
295 font-family: monospace; 300 font-family: monospace;
296 white-space: pre; 301 white-space: pre;
297} 302}
298 303
diff --git a/cgit.h b/cgit.h
index 46f3173..93699b5 100644
--- a/cgit.h
+++ b/cgit.h
@@ -171,12 +171,12 @@ extern void cgit_print_repolist(struct cacheitem *item);
171extern void cgit_print_summary(); 171extern void cgit_print_summary();
172extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep); 172extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep);
173extern void cgit_print_view(const char *hex, char *path); 173extern void cgit_print_view(const char *hex, char *path);
174extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path); 174extern 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,
180 const char *filename); 180 const char *filename);
181 181
182#endif /* CGIT_H */ 182#endif /* CGIT_H */
diff --git a/ui-commit.c b/ui-commit.c
index ce33cf9..b3d1c28 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -73,14 +73,14 @@ void print_fileinfo(struct fileinfo *info)
73 !is_null_sha1(info->new_sha1)) { 73 !is_null_sha1(info->new_sha1)) {
74 html("<span class='modechange'>["); 74 html("<span class='modechange'>[");
75 html_filemode(info->old_mode); 75 html_filemode(info->old_mode);
76 html("]</span>"); 76 html("]</span>");
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);
83 if (info->status == DIFF_STATUS_COPIED || 83 if (info->status == DIFF_STATUS_COPIED ||
84 info->status == DIFF_STATUS_RENAMED) { 84 info->status == DIFF_STATUS_RENAMED) {
85 html_txt(info->new_path); 85 html_txt(info->new_path);
86 htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ? 86 htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ?
@@ -148,13 +148,13 @@ void inspect_filepair(struct diff_filepair *pair)
148 total_rems += lines_removed; 148 total_rems += lines_removed;
149} 149}
150 150
151 151
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;
157 unsigned char sha1[20]; 157 unsigned char sha1[20];
158 char *query; 158 char *query;
159 char *filename; 159 char *filename;
160 int i; 160 int i;
@@ -187,19 +187,30 @@ void cgit_print_commit(const char *hex)
187 html("</td></tr>\n"); 187 html("</td></tr>\n");
188 html("<tr><th>tree</th><td colspan='2' class='sha1'><a href='"); 188 html("<tr><th>tree</th><td colspan='2' class='sha1'><a href='");
189 query = fmt("id=%s", sha1_to_hex(commit->tree->object.sha1)); 189 query = fmt("id=%s", sha1_to_hex(commit->tree->object.sha1));
190 html_attr(cgit_pageurl(cgit_query_repo, "tree", query)); 190 html_attr(cgit_pageurl(cgit_query_repo, "tree", query));
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'>"
195 "<a href='"); 202 "<a href='");
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) {
202 htmlf("<tr><th>download</th><td colspan='2' class='sha1'><a href='"); 213 htmlf("<tr><th>download</th><td colspan='2' class='sha1'><a href='");
203 filename = fmt("%s-%s.zip", cgit_query_repo, hex); 214 filename = fmt("%s-%s.zip", cgit_query_repo, hex);
204 html_attr(cgit_pageurl(cgit_query_repo, "snapshot", 215 html_attr(cgit_pageurl(cgit_query_repo, "snapshot",
205 fmt("id=%s&name=%s", hex, filename))); 216 fmt("id=%s&name=%s", hex, filename)));
diff --git a/ui-diff.c b/ui-diff.c
index 96106af..10330d3 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -28,18 +28,55 @@ static void print_line(char *line, int len)
28 line[len-1] = '\0'; 28 line[len-1] = '\0';
29 html_txt(line); 29 html_txt(line);
30 html("</div>"); 30 html("</div>");
31 line[len-1] = c; 31 line[len-1] = c;
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}