summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2008-08-06 09:07:13 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-08-06 09:21:30 (UTC)
commit65b7b876aaaf50fc15060533359d6561f4f1819a (patch) (unidiff)
treec5cfe73456cf31afb13bcb12c5331fa711f89d71
parente5da4bca54574522b28f88cab0dc8ebad9e35a73 (diff)
downloadcgit-65b7b876aaaf50fc15060533359d6561f4f1819a.zip
cgit-65b7b876aaaf50fc15060533359d6561f4f1819a.tar.gz
cgit-65b7b876aaaf50fc15060533359d6561f4f1819a.tar.bz2
ui-tree: link to plain view instead of blob view
The urls for plain view makes it possible to download blobs without knowing their SHA1, but the function needs to be promoted and the link from tree view seems like a perfect fit. PS: Although hidden, the blob view still is nice for direct blob access so there's no point in removing it. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-shared.c6
-rw-r--r--ui-shared.h2
-rw-r--r--ui-tree.c8
3 files changed, 12 insertions, 4 deletions
diff --git a/ui-shared.c b/ui-shared.c
index 4408969..a2e0dd2 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -214,64 +214,70 @@ static char *repolink(char *title, char *class, char *page, char *head,
214 } 214 }
215 if (head && strcmp(head, ctx.repo->defbranch)) { 215 if (head && strcmp(head, ctx.repo->defbranch)) {
216 html(delim); 216 html(delim);
217 html("h="); 217 html("h=");
218 html_attr(head); 218 html_attr(head);
219 delim = "&amp;"; 219 delim = "&amp;";
220 } 220 }
221 return fmt("%s", delim); 221 return fmt("%s", delim);
222} 222}
223 223
224static void reporevlink(char *page, char *name, char *title, char *class, 224static void reporevlink(char *page, char *name, char *title, char *class,
225 char *head, char *rev, char *path) 225 char *head, char *rev, char *path)
226{ 226{
227 char *delim; 227 char *delim;
228 228
229 delim = repolink(title, class, page, head, path); 229 delim = repolink(title, class, page, head, path);
230 if (rev && strcmp(rev, ctx.qry.head)) { 230 if (rev && strcmp(rev, ctx.qry.head)) {
231 html(delim); 231 html(delim);
232 html("id="); 232 html("id=");
233 html_attr(rev); 233 html_attr(rev);
234 } 234 }
235 html("'>"); 235 html("'>");
236 html_txt(name); 236 html_txt(name);
237 html("</a>"); 237 html("</a>");
238} 238}
239 239
240void cgit_tree_link(char *name, char *title, char *class, char *head, 240void cgit_tree_link(char *name, char *title, char *class, char *head,
241 char *rev, char *path) 241 char *rev, char *path)
242{ 242{
243 reporevlink("tree", name, title, class, head, rev, path); 243 reporevlink("tree", name, title, class, head, rev, path);
244} 244}
245 245
246void cgit_plain_link(char *name, char *title, char *class, char *head,
247 char *rev, char *path)
248{
249 reporevlink("plain", name, title, class, head, rev, path);
250}
251
246void cgit_log_link(char *name, char *title, char *class, char *head, 252void cgit_log_link(char *name, char *title, char *class, char *head,
247 char *rev, char *path, int ofs, char *grep, char *pattern) 253 char *rev, char *path, int ofs, char *grep, char *pattern)
248{ 254{
249 char *delim; 255 char *delim;
250 256
251 delim = repolink(title, class, "log", head, path); 257 delim = repolink(title, class, "log", head, path);
252 if (rev && strcmp(rev, ctx.qry.head)) { 258 if (rev && strcmp(rev, ctx.qry.head)) {
253 html(delim); 259 html(delim);
254 html("id="); 260 html("id=");
255 html_attr(rev); 261 html_attr(rev);
256 delim = "&"; 262 delim = "&";
257 } 263 }
258 if (grep && pattern) { 264 if (grep && pattern) {
259 html(delim); 265 html(delim);
260 html("qt="); 266 html("qt=");
261 html_attr(grep); 267 html_attr(grep);
262 delim = "&"; 268 delim = "&";
263 html(delim); 269 html(delim);
264 html("q="); 270 html("q=");
265 html_attr(pattern); 271 html_attr(pattern);
266 } 272 }
267 if (ofs > 0) { 273 if (ofs > 0) {
268 html(delim); 274 html(delim);
269 html("ofs="); 275 html("ofs=");
270 htmlf("%d", ofs); 276 htmlf("%d", ofs);
271 } 277 }
272 html("'>"); 278 html("'>");
273 html_txt(name); 279 html_txt(name);
274 html("</a>"); 280 html("</a>");
275} 281}
276 282
277void cgit_commit_link(char *name, char *title, char *class, char *head, 283void cgit_commit_link(char *name, char *title, char *class, char *head,
diff --git a/ui-shared.h b/ui-shared.h
index 07da4b4..c5ce056 100644
--- a/ui-shared.h
+++ b/ui-shared.h
@@ -1,40 +1,42 @@
1#ifndef UI_SHARED_H 1#ifndef UI_SHARED_H
2#define UI_SHARED_H 2#define UI_SHARED_H
3 3
4extern char *cgit_repourl(const char *reponame); 4extern char *cgit_repourl(const char *reponame);
5extern char *cgit_fileurl(const char *reponame, const char *pagename, 5extern char *cgit_fileurl(const char *reponame, const char *pagename,
6 const char *filename, const char *query); 6 const char *filename, const char *query);
7extern char *cgit_pageurl(const char *reponame, const char *pagename, 7extern char *cgit_pageurl(const char *reponame, const char *pagename,
8 const char *query); 8 const char *query);
9 9
10extern void cgit_index_link(char *name, char *title, char *class, 10extern void cgit_index_link(char *name, char *title, char *class,
11 char *pattern, int ofs); 11 char *pattern, int ofs);
12extern void cgit_tree_link(char *name, char *title, char *class, char *head, 12extern void cgit_tree_link(char *name, char *title, char *class, char *head,
13 char *rev, char *path); 13 char *rev, char *path);
14extern void cgit_plain_link(char *name, char *title, char *class, char *head,
15 char *rev, char *path);
14extern void cgit_log_link(char *name, char *title, char *class, char *head, 16extern void cgit_log_link(char *name, char *title, char *class, char *head,
15 char *rev, char *path, int ofs, char *grep, 17 char *rev, char *path, int ofs, char *grep,
16 char *pattern); 18 char *pattern);
17extern void cgit_commit_link(char *name, char *title, char *class, char *head, 19extern void cgit_commit_link(char *name, char *title, char *class, char *head,
18 char *rev); 20 char *rev);
19extern void cgit_patch_link(char *name, char *title, char *class, char *head, 21extern void cgit_patch_link(char *name, char *title, char *class, char *head,
20 char *rev); 22 char *rev);
21extern void cgit_refs_link(char *name, char *title, char *class, char *head, 23extern void cgit_refs_link(char *name, char *title, char *class, char *head,
22 char *rev, char *path); 24 char *rev, char *path);
23extern void cgit_snapshot_link(char *name, char *title, char *class, 25extern void cgit_snapshot_link(char *name, char *title, char *class,
24 char *head, char *rev, char *archivename); 26 char *head, char *rev, char *archivename);
25extern void cgit_diff_link(char *name, char *title, char *class, char *head, 27extern void cgit_diff_link(char *name, char *title, char *class, char *head,
26 char *new_rev, char *old_rev, char *path); 28 char *new_rev, char *old_rev, char *path);
27extern void cgit_object_link(struct object *obj); 29extern void cgit_object_link(struct object *obj);
28 30
29extern void cgit_print_error(char *msg); 31extern void cgit_print_error(char *msg);
30extern void cgit_print_date(time_t secs, char *format, int local_time); 32extern void cgit_print_date(time_t secs, char *format, int local_time);
31extern void cgit_print_age(time_t t, time_t max_relative, char *format); 33extern void cgit_print_age(time_t t, time_t max_relative, char *format);
32extern void cgit_print_http_headers(struct cgit_context *ctx); 34extern void cgit_print_http_headers(struct cgit_context *ctx);
33extern void cgit_print_docstart(struct cgit_context *ctx); 35extern void cgit_print_docstart(struct cgit_context *ctx);
34extern void cgit_print_docend(); 36extern void cgit_print_docend();
35extern void cgit_print_pageheader(struct cgit_context *ctx); 37extern void cgit_print_pageheader(struct cgit_context *ctx);
36extern void cgit_print_filemode(unsigned short mode); 38extern void cgit_print_filemode(unsigned short mode);
37extern void cgit_print_snapshot_links(const char *repo, const char *head, 39extern void cgit_print_snapshot_links(const char *repo, const char *head,
38 const char *hex, int snapshots); 40 const char *hex, int snapshots);
39 41
40#endif /* UI_SHARED_H */ 42#endif /* UI_SHARED_H */
diff --git a/ui-tree.c b/ui-tree.c
index 9a837e2..79332fc 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -6,68 +6,68 @@
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h" 11#include "ui-shared.h"
12 12
13char *curr_rev; 13char *curr_rev;
14char *match_path; 14char *match_path;
15int header = 0; 15int header = 0;
16 16
17static void print_object(const unsigned char *sha1, char *path) 17static void print_object(const unsigned char *sha1, char *path)
18{ 18{
19 enum object_type type; 19 enum object_type type;
20 char *buf; 20 char *buf;
21 unsigned long size, lineno, start, idx; 21 unsigned long size, lineno, start, idx;
22 const char *linefmt = "<tr><td class='no'><a id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a></td><td class='txt'>"; 22 const char *linefmt = "<tr><td class='no'><a id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a></td><td class='txt'>";
23 23
24 type = sha1_object_info(sha1, &size); 24 type = sha1_object_info(sha1, &size);
25 if (type == OBJ_BAD) { 25 if (type == OBJ_BAD) {
26 cgit_print_error(fmt("Bad object name: %s", 26 cgit_print_error(fmt("Bad object name: %s",
27 sha1_to_hex(sha1))); 27 sha1_to_hex(sha1)));
28 return; 28 return;
29 } 29 }
30 30
31 buf = read_sha1_file(sha1, &type, &size); 31 buf = read_sha1_file(sha1, &type, &size);
32 if (!buf) { 32 if (!buf) {
33 cgit_print_error(fmt("Error reading object %s", 33 cgit_print_error(fmt("Error reading object %s",
34 sha1_to_hex(sha1))); 34 sha1_to_hex(sha1)));
35 return; 35 return;
36 } 36 }
37 37
38 html(" blob: <a href='"); 38 html(" (");
39 html_attr(cgit_pageurl(ctx.qry.repo, "blob", 39 cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
40 fmt("id=%s&path=%s", sha1_to_hex(sha1), path))); 40 curr_rev, path);
41 htmlf("'>%s</a>",sha1_to_hex(sha1)); 41 htmlf(")<br/>blob: %s", sha1_to_hex(sha1));
42 42
43 html("<table summary='blob content' class='blob'>\n"); 43 html("<table summary='blob content' class='blob'>\n");
44 idx = 0; 44 idx = 0;
45 start = 0; 45 start = 0;
46 lineno = 0; 46 lineno = 0;
47 while(idx < size) { 47 while(idx < size) {
48 if (buf[idx] == '\n') { 48 if (buf[idx] == '\n') {
49 buf[idx] = '\0'; 49 buf[idx] = '\0';
50 htmlf(linefmt, ++lineno); 50 htmlf(linefmt, ++lineno);
51 html_txt(buf + start); 51 html_txt(buf + start);
52 html("</td></tr>\n"); 52 html("</td></tr>\n");
53 start = idx + 1; 53 start = idx + 1;
54 } 54 }
55 idx++; 55 idx++;
56 } 56 }
57 htmlf(linefmt, ++lineno); 57 htmlf(linefmt, ++lineno);
58 html_txt(buf + start); 58 html_txt(buf + start);
59 html("</td></tr>\n"); 59 html("</td></tr>\n");
60 html("</table>\n"); 60 html("</table>\n");
61} 61}
62 62
63 63
64static int ls_item(const unsigned char *sha1, const char *base, int baselen, 64static int ls_item(const unsigned char *sha1, const char *base, int baselen,
65 const char *pathname, unsigned int mode, int stage, 65 const char *pathname, unsigned int mode, int stage,
66 void *cbdata) 66 void *cbdata)
67{ 67{
68 char *name; 68 char *name;
69 char *fullpath; 69 char *fullpath;
70 enum object_type type; 70 enum object_type type;
71 unsigned long size = 0; 71 unsigned long size = 0;
72 72
73 name = xstrdup(pathname); 73 name = xstrdup(pathname);