summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2007-05-15 22:58:35 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-15 22:58:35 (UTC)
commitf9ff7df613b4ee86fe5914c4ae3400650882c03d (patch) (unidiff)
treec26fde3a4d3485943c275232f18359bebd133f1a
parenta2ddc10479ec463708e422ca5ce7ec02c22a7d02 (diff)
downloadcgit-f9ff7df613b4ee86fe5914c4ae3400650882c03d.zip
cgit-f9ff7df613b4ee86fe5914c4ae3400650882c03d.tar.gz
cgit-f9ff7df613b4ee86fe5914c4ae3400650882c03d.tar.bz2
Add support for commitdiff via h parameter
The commitdiff will be generated against the first parent, and the diff page also gets the benefit of repo.defbranch. Cleaned up some bad whitespace in cgit.h while at it. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c3
-rw-r--r--cgit.h11
-rw-r--r--ui-diff.c14
3 files changed, 21 insertions, 7 deletions
diff --git a/cgit.c b/cgit.c
index 9b4815d..3e7e595 100644
--- a/cgit.c
+++ b/cgit.c
@@ -111,25 +111,26 @@ static void cgit_print_repo_page(struct cacheitem *item)
111 111
112 if (!strcmp(cgit_query_page, "log")) { 112 if (!strcmp(cgit_query_page, "log")) {
113 cgit_print_log(cgit_query_head, cgit_query_ofs, 113 cgit_print_log(cgit_query_head, cgit_query_ofs,
114 cgit_max_commit_count, cgit_query_search, 114 cgit_max_commit_count, cgit_query_search,
115 cgit_query_path); 115 cgit_query_path);
116 } else if (!strcmp(cgit_query_page, "tree")) { 116 } else if (!strcmp(cgit_query_page, "tree")) {
117 cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path); 117 cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path);
118 } else if (!strcmp(cgit_query_page, "commit")) { 118 } else if (!strcmp(cgit_query_page, "commit")) {
119 cgit_print_commit(cgit_query_head); 119 cgit_print_commit(cgit_query_head);
120 } else if (!strcmp(cgit_query_page, "view")) { 120 } else if (!strcmp(cgit_query_page, "view")) {
121 cgit_print_view(cgit_query_sha1, cgit_query_path); 121 cgit_print_view(cgit_query_sha1, cgit_query_path);
122 } else if (!strcmp(cgit_query_page, "diff")) { 122 } else if (!strcmp(cgit_query_page, "diff")) {
123 cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path); 123 cgit_print_diff(cgit_query_head, cgit_query_sha1, cgit_query_sha2,
124 cgit_query_path);
124 } else { 125 } else {
125 cgit_print_error("Invalid request"); 126 cgit_print_error("Invalid request");
126 } 127 }
127 cgit_print_docend(); 128 cgit_print_docend();
128} 129}
129 130
130static void cgit_fill_cache(struct cacheitem *item, int use_cache) 131static void cgit_fill_cache(struct cacheitem *item, int use_cache)
131{ 132{
132 static char buf[PATH_MAX]; 133 static char buf[PATH_MAX];
133 int stdout2; 134 int stdout2;
134 135
135 getcwd(buf, sizeof(buf)); 136 getcwd(buf, sizeof(buf));
diff --git a/cgit.h b/cgit.h
index ac710a6..764225d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -148,37 +148,38 @@ extern int cgit_read_config(const char *filename, configfn fn);
148extern int cgit_parse_query(char *txt, configfn fn); 148extern int cgit_parse_query(char *txt, configfn fn);
149extern struct commitinfo *cgit_parse_commit(struct commit *commit); 149extern struct commitinfo *cgit_parse_commit(struct commit *commit);
150extern struct taginfo *cgit_parse_tag(struct tag *tag); 150extern struct taginfo *cgit_parse_tag(struct tag *tag);
151 151
152extern char *cache_safe_filename(const char *unsafe); 152extern char *cache_safe_filename(const char *unsafe);
153extern int cache_lock(struct cacheitem *item); 153extern int cache_lock(struct cacheitem *item);
154extern int cache_unlock(struct cacheitem *item); 154extern int cache_unlock(struct cacheitem *item);
155extern int cache_cancel_lock(struct cacheitem *item); 155extern int cache_cancel_lock(struct cacheitem *item);
156extern int cache_exist(struct cacheitem *item); 156extern int cache_exist(struct cacheitem *item);
157extern int cache_expired(struct cacheitem *item); 157extern int cache_expired(struct cacheitem *item);
158 158
159extern char *cgit_repourl(const char *reponame); 159extern char *cgit_repourl(const char *reponame);
160extern char *cgit_pageurl(const char *reponame, const char *pagename, 160extern char *cgit_pageurl(const char *reponame, const char *pagename,
161 const char *query); 161 const char *query);
162 162
163extern void cgit_print_error(char *msg); 163extern void cgit_print_error(char *msg);
164extern void cgit_print_date(unsigned long secs); 164extern void cgit_print_date(unsigned long secs);
165extern void cgit_print_docstart(char *title, struct cacheitem *item); 165extern void cgit_print_docstart(char *title, struct cacheitem *item);
166extern void cgit_print_docend(); 166extern void cgit_print_docend();
167extern void cgit_print_pageheader(char *title, int show_search); 167extern void cgit_print_pageheader(char *title, int show_search);
168extern void cgit_print_snapshot_start(const char *mimetype, 168extern void cgit_print_snapshot_start(const char *mimetype,
169 const char *filename, 169 const char *filename,
170 struct cacheitem *item); 170 struct cacheitem *item);
171 171
172extern void cgit_print_repolist(struct cacheitem *item); 172extern void cgit_print_repolist(struct cacheitem *item);
173extern void cgit_print_summary(); 173extern void cgit_print_summary();
174extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path); 174extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path);
175extern void cgit_print_view(const char *hex, char *path); 175extern void cgit_print_view(const char *hex, char *path);
176extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path); 176extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);
177extern void cgit_print_tree(const char *rev, const char *hex, char *path); 177extern void cgit_print_tree(const char *rev, const char *hex, char *path);
178extern void cgit_print_commit(const char *hex); 178extern void cgit_print_commit(const char *hex);
179extern void cgit_print_diff(const char *old_hex, const char *new_hex, char *path); 179extern void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex,
180extern void cgit_print_snapshot(struct cacheitem *item, const char *hex, 180 char *path);
181extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,
181 const char *format, const char *prefix, 182 const char *format, const char *prefix,
182 const char *filename); 183 const char *filename);
183 184
184#endif /* CGIT_H */ 185#endif /* CGIT_H */
diff --git a/ui-diff.c b/ui-diff.c
index 999b6f3..afe1c90 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -57,29 +57,41 @@ static void header(unsigned char *sha1, char *path1,
57 html("</div>"); 57 html("</div>");
58} 58}
59 59
60static void filepair_cb(struct diff_filepair *pair) 60static void filepair_cb(struct diff_filepair *pair)
61{ 61{
62 header(pair->one->sha1, pair->one->path, 62 header(pair->one->sha1, pair->one->path,
63 pair->two->sha1, pair->two->path); 63 pair->two->sha1, pair->two->path);
64 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line)) 64 if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line))
65 cgit_print_error("Error running diff"); 65 cgit_print_error("Error running diff");
66 html("</tr></td>"); 66 html("</tr></td>");
67} 67}
68 68
69void cgit_print_diff(const char *old_hex, const char *new_hex, char *path) 69void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex, char *path)
70{ 70{
71 unsigned char sha1[20], sha2[20]; 71 unsigned char sha1[20], sha2[20];
72 enum object_type type; 72 enum object_type type;
73 unsigned long size; 73 unsigned long size;
74 struct commit *commit;
75
76 if (head && !old_hex && !new_hex) {
77 get_sha1(head, sha1);
78 commit = lookup_commit_reference(sha1);
79 if (commit && !parse_commit(commit)) {
80 html("<table class='diff'>");
81 cgit_diff_commit(commit, filepair_cb);
82 html("</td></tr></table>");
83 }
84 return;
85 }
74 86
75 get_sha1(old_hex, sha1); 87 get_sha1(old_hex, sha1);
76 get_sha1(new_hex, sha2); 88 get_sha1(new_hex, sha2);
77 89
78 type = sha1_object_info(sha1, &size); 90 type = sha1_object_info(sha1, &size);
79 if (type == OBJ_BAD) { 91 if (type == OBJ_BAD) {
80 type = sha1_object_info(sha2, &size); 92 type = sha1_object_info(sha2, &size);
81 if (type == OBJ_BAD) { 93 if (type == OBJ_BAD) {
82 cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); 94 cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex));
83 return; 95 return;
84 } 96 }
85 } 97 }