author | Johan Herland <johan@herland.net> | 2010-06-09 23:09:30 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2010-06-19 08:40:23 (UTC) |
commit | 48f7b982d3bb52f1307df73ceb6dd4cab3fdcc80 (patch) (unidiff) | |
tree | e1d275b72e7e3fe47eafd44dbae3b720c895da1f | |
parent | 24fd7e54c82294efa68ecae5dd9cb8a8986c04bf (diff) | |
download | cgit-48f7b982d3bb52f1307df73ceb6dd4cab3fdcc80.zip cgit-48f7b982d3bb52f1307df73ceb6dd4cab3fdcc80.tar.gz cgit-48f7b982d3bb52f1307df73ceb6dd4cab3fdcc80.tar.bz2 |
ui-tree: Remove unnecessary path breadcrumb navigation
The path breadcrumb navigation at the top of the 'tree' page has now been
duplicated in ui-shared, which leaves the ui-tree implementation unnecessary.
This patch removes the breadcrumb navigation from ui-tree, and moves the
"(plain)" link that followed the breadcrumb when displaying blobs to the
end of the next line, following the blob SHA1.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | ui-tree.c | 15 |
1 files changed, 2 insertions, 13 deletions
@@ -57,100 +57,100 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size) | |||
57 | html("</code></pre></td></tr></table>\n"); | 57 | html("</code></pre></td></tr></table>\n"); |
58 | } | 58 | } |
59 | 59 | ||
60 | #define ROWLEN 32 | 60 | #define ROWLEN 32 |
61 | 61 | ||
62 | static void print_binary_buffer(char *buf, unsigned long size) | 62 | static void print_binary_buffer(char *buf, unsigned long size) |
63 | { | 63 | { |
64 | unsigned long ofs, idx; | 64 | unsigned long ofs, idx; |
65 | static char ascii[ROWLEN + 1]; | 65 | static char ascii[ROWLEN + 1]; |
66 | 66 | ||
67 | html("<table summary='blob content' class='bin-blob'>\n"); | 67 | html("<table summary='blob content' class='bin-blob'>\n"); |
68 | html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>"); | 68 | html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>"); |
69 | for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { | 69 | for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { |
70 | htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs); | 70 | htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs); |
71 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) | 71 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) |
72 | htmlf("%*s%02x", | 72 | htmlf("%*s%02x", |
73 | idx == 16 ? 4 : 1, "", | 73 | idx == 16 ? 4 : 1, "", |
74 | buf[idx] & 0xff); | 74 | buf[idx] & 0xff); |
75 | html(" </td><td class='hex'>"); | 75 | html(" </td><td class='hex'>"); |
76 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) | 76 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) |
77 | ascii[idx] = isgraph(buf[idx]) ? buf[idx] : '.'; | 77 | ascii[idx] = isgraph(buf[idx]) ? buf[idx] : '.'; |
78 | ascii[idx] = '\0'; | 78 | ascii[idx] = '\0'; |
79 | html_txt(ascii); | 79 | html_txt(ascii); |
80 | html("</td></tr>\n"); | 80 | html("</td></tr>\n"); |
81 | } | 81 | } |
82 | html("</table>\n"); | 82 | html("</table>\n"); |
83 | } | 83 | } |
84 | 84 | ||
85 | static void print_object(const unsigned char *sha1, char *path, const char *basename) | 85 | static void print_object(const unsigned char *sha1, char *path, const char *basename) |
86 | { | 86 | { |
87 | enum object_type type; | 87 | enum object_type type; |
88 | char *buf; | 88 | char *buf; |
89 | unsigned long size; | 89 | unsigned long size; |
90 | 90 | ||
91 | type = sha1_object_info(sha1, &size); | 91 | type = sha1_object_info(sha1, &size); |
92 | if (type == OBJ_BAD) { | 92 | if (type == OBJ_BAD) { |
93 | cgit_print_error(fmt("Bad object name: %s", | 93 | cgit_print_error(fmt("Bad object name: %s", |
94 | sha1_to_hex(sha1))); | 94 | sha1_to_hex(sha1))); |
95 | return; | 95 | return; |
96 | } | 96 | } |
97 | 97 | ||
98 | buf = read_sha1_file(sha1, &type, &size); | 98 | buf = read_sha1_file(sha1, &type, &size); |
99 | if (!buf) { | 99 | if (!buf) { |
100 | cgit_print_error(fmt("Error reading object %s", | 100 | cgit_print_error(fmt("Error reading object %s", |
101 | sha1_to_hex(sha1))); | 101 | sha1_to_hex(sha1))); |
102 | return; | 102 | return; |
103 | } | 103 | } |
104 | 104 | ||
105 | html(" ("); | 105 | htmlf("blob: %s (", sha1_to_hex(sha1)); |
106 | cgit_plain_link("plain", NULL, NULL, ctx.qry.head, | 106 | cgit_plain_link("plain", NULL, NULL, ctx.qry.head, |
107 | curr_rev, path); | 107 | curr_rev, path); |
108 | htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1)); | 108 | html(")\n"); |
109 | 109 | ||
110 | if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { | 110 | if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { |
111 | htmlf("<div class='error'>blob size (%dKB) exceeds display size limit (%dKB).</div>", | 111 | htmlf("<div class='error'>blob size (%dKB) exceeds display size limit (%dKB).</div>", |
112 | size / 1024, ctx.cfg.max_blob_size); | 112 | size / 1024, ctx.cfg.max_blob_size); |
113 | return; | 113 | return; |
114 | } | 114 | } |
115 | 115 | ||
116 | if (buffer_is_binary(buf, size)) | 116 | if (buffer_is_binary(buf, size)) |
117 | print_binary_buffer(buf, size); | 117 | print_binary_buffer(buf, size); |
118 | else | 118 | else |
119 | print_text_buffer(basename, buf, size); | 119 | print_text_buffer(basename, buf, size); |
120 | } | 120 | } |
121 | 121 | ||
122 | 122 | ||
123 | static int ls_item(const unsigned char *sha1, const char *base, int baselen, | 123 | static int ls_item(const unsigned char *sha1, const char *base, int baselen, |
124 | const char *pathname, unsigned int mode, int stage, | 124 | const char *pathname, unsigned int mode, int stage, |
125 | void *cbdata) | 125 | void *cbdata) |
126 | { | 126 | { |
127 | char *name; | 127 | char *name; |
128 | char *fullpath; | 128 | char *fullpath; |
129 | char *class; | 129 | char *class; |
130 | enum object_type type; | 130 | enum object_type type; |
131 | unsigned long size = 0; | 131 | unsigned long size = 0; |
132 | 132 | ||
133 | name = xstrdup(pathname); | 133 | name = xstrdup(pathname); |
134 | fullpath = fmt("%s%s%s", ctx.qry.path ? ctx.qry.path : "", | 134 | fullpath = fmt("%s%s%s", ctx.qry.path ? ctx.qry.path : "", |
135 | ctx.qry.path ? "/" : "", name); | 135 | ctx.qry.path ? "/" : "", name); |
136 | 136 | ||
137 | if (!S_ISGITLINK(mode)) { | 137 | if (!S_ISGITLINK(mode)) { |
138 | type = sha1_object_info(sha1, &size); | 138 | type = sha1_object_info(sha1, &size); |
139 | if (type == OBJ_BAD) { | 139 | if (type == OBJ_BAD) { |
140 | htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>", | 140 | htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>", |
141 | name, | 141 | name, |
142 | sha1_to_hex(sha1)); | 142 | sha1_to_hex(sha1)); |
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | } | 145 | } |
146 | 146 | ||
147 | html("<tr><td class='ls-mode'>"); | 147 | html("<tr><td class='ls-mode'>"); |
148 | cgit_print_filemode(mode); | 148 | cgit_print_filemode(mode); |
149 | html("</td><td>"); | 149 | html("</td><td>"); |
150 | if (S_ISGITLINK(mode)) { | 150 | if (S_ISGITLINK(mode)) { |
151 | htmlf("<a class='ls-mod' href='"); | 151 | htmlf("<a class='ls-mod' href='"); |
152 | html_attr(fmt(ctx.repo->module_link, | 152 | html_attr(fmt(ctx.repo->module_link, |
153 | name, | 153 | name, |
154 | sha1_to_hex(sha1))); | 154 | sha1_to_hex(sha1))); |
155 | html("'>"); | 155 | html("'>"); |
156 | html_txt(name); | 156 | html_txt(name); |
@@ -180,114 +180,103 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, | |||
180 | html("</td></tr>\n"); | 180 | html("</td></tr>\n"); |
181 | free(name); | 181 | free(name); |
182 | return 0; | 182 | return 0; |
183 | } | 183 | } |
184 | 184 | ||
185 | static void ls_head() | 185 | static void ls_head() |
186 | { | 186 | { |
187 | html("<table summary='tree listing' class='list'>\n"); | 187 | html("<table summary='tree listing' class='list'>\n"); |
188 | html("<tr class='nohover'>"); | 188 | html("<tr class='nohover'>"); |
189 | html("<th class='left'>Mode</th>"); | 189 | html("<th class='left'>Mode</th>"); |
190 | html("<th class='left'>Name</th>"); | 190 | html("<th class='left'>Name</th>"); |
191 | html("<th class='right'>Size</th>"); | 191 | html("<th class='right'>Size</th>"); |
192 | html("<th/>"); | 192 | html("<th/>"); |
193 | html("</tr>\n"); | 193 | html("</tr>\n"); |
194 | header = 1; | 194 | header = 1; |
195 | } | 195 | } |
196 | 196 | ||
197 | static void ls_tail() | 197 | static void ls_tail() |
198 | { | 198 | { |
199 | if (!header) | 199 | if (!header) |
200 | return; | 200 | return; |
201 | html("</table>\n"); | 201 | html("</table>\n"); |
202 | header = 0; | 202 | header = 0; |
203 | } | 203 | } |
204 | 204 | ||
205 | static void ls_tree(const unsigned char *sha1, char *path) | 205 | static void ls_tree(const unsigned char *sha1, char *path) |
206 | { | 206 | { |
207 | struct tree *tree; | 207 | struct tree *tree; |
208 | 208 | ||
209 | tree = parse_tree_indirect(sha1); | 209 | tree = parse_tree_indirect(sha1); |
210 | if (!tree) { | 210 | if (!tree) { |
211 | cgit_print_error(fmt("Not a tree object: %s", | 211 | cgit_print_error(fmt("Not a tree object: %s", |
212 | sha1_to_hex(sha1))); | 212 | sha1_to_hex(sha1))); |
213 | return; | 213 | return; |
214 | } | 214 | } |
215 | 215 | ||
216 | ls_head(); | 216 | ls_head(); |
217 | read_tree_recursive(tree, "", 0, 1, NULL, ls_item, NULL); | 217 | read_tree_recursive(tree, "", 0, 1, NULL, ls_item, NULL); |
218 | ls_tail(); | 218 | ls_tail(); |
219 | } | 219 | } |
220 | 220 | ||
221 | 221 | ||
222 | static int walk_tree(const unsigned char *sha1, const char *base, int baselen, | 222 | static int walk_tree(const unsigned char *sha1, const char *base, int baselen, |
223 | const char *pathname, unsigned mode, int stage, | 223 | const char *pathname, unsigned mode, int stage, |
224 | void *cbdata) | 224 | void *cbdata) |
225 | { | 225 | { |
226 | static int state; | 226 | static int state; |
227 | static char buffer[PATH_MAX]; | 227 | static char buffer[PATH_MAX]; |
228 | char *url; | ||
229 | 228 | ||
230 | if (state == 0) { | 229 | if (state == 0) { |
231 | memcpy(buffer, base, baselen); | 230 | memcpy(buffer, base, baselen); |
232 | strcpy(buffer+baselen, pathname); | 231 | strcpy(buffer+baselen, pathname); |
233 | url = cgit_pageurl(ctx.qry.repo, "tree", | ||
234 | fmt("h=%s&path=%s", curr_rev, buffer)); | ||
235 | html("/"); | ||
236 | cgit_tree_link(xstrdup(pathname), NULL, NULL, ctx.qry.head, | ||
237 | curr_rev, buffer); | ||
238 | |||
239 | if (strcmp(match_path, buffer)) | 232 | if (strcmp(match_path, buffer)) |
240 | return READ_TREE_RECURSIVE; | 233 | return READ_TREE_RECURSIVE; |
241 | 234 | ||
242 | if (S_ISDIR(mode)) { | 235 | if (S_ISDIR(mode)) { |
243 | state = 1; | 236 | state = 1; |
244 | ls_head(); | 237 | ls_head(); |
245 | return READ_TREE_RECURSIVE; | 238 | return READ_TREE_RECURSIVE; |
246 | } else { | 239 | } else { |
247 | print_object(sha1, buffer, pathname); | 240 | print_object(sha1, buffer, pathname); |
248 | return 0; | 241 | return 0; |
249 | } | 242 | } |
250 | } | 243 | } |
251 | ls_item(sha1, base, baselen, pathname, mode, stage, NULL); | 244 | ls_item(sha1, base, baselen, pathname, mode, stage, NULL); |
252 | return 0; | 245 | return 0; |
253 | } | 246 | } |
254 | 247 | ||
255 | 248 | ||
256 | /* | 249 | /* |
257 | * Show a tree or a blob | 250 | * Show a tree or a blob |
258 | * rev: the commit pointing at the root tree object | 251 | * rev: the commit pointing at the root tree object |
259 | * path: path to tree or blob | 252 | * path: path to tree or blob |
260 | */ | 253 | */ |
261 | void cgit_print_tree(const char *rev, char *path) | 254 | void cgit_print_tree(const char *rev, char *path) |
262 | { | 255 | { |
263 | unsigned char sha1[20]; | 256 | unsigned char sha1[20]; |
264 | struct commit *commit; | 257 | struct commit *commit; |
265 | const char *paths[] = {path, NULL}; | 258 | const char *paths[] = {path, NULL}; |
266 | 259 | ||
267 | if (!rev) | 260 | if (!rev) |
268 | rev = ctx.qry.head; | 261 | rev = ctx.qry.head; |
269 | 262 | ||
270 | curr_rev = xstrdup(rev); | 263 | curr_rev = xstrdup(rev); |
271 | if (get_sha1(rev, sha1)) { | 264 | if (get_sha1(rev, sha1)) { |
272 | cgit_print_error(fmt("Invalid revision name: %s", rev)); | 265 | cgit_print_error(fmt("Invalid revision name: %s", rev)); |
273 | return; | 266 | return; |
274 | } | 267 | } |
275 | commit = lookup_commit_reference(sha1); | 268 | commit = lookup_commit_reference(sha1); |
276 | if (!commit || parse_commit(commit)) { | 269 | if (!commit || parse_commit(commit)) { |
277 | cgit_print_error(fmt("Invalid commit reference: %s", rev)); | 270 | cgit_print_error(fmt("Invalid commit reference: %s", rev)); |
278 | return; | 271 | return; |
279 | } | 272 | } |
280 | 273 | ||
281 | html("path: <a href='"); | ||
282 | html_attr(cgit_pageurl(ctx.qry.repo, "tree", fmt("h=%s", rev))); | ||
283 | html("'>root</a>"); | ||
284 | |||
285 | if (path == NULL) { | 274 | if (path == NULL) { |
286 | ls_tree(commit->tree->object.sha1, NULL); | 275 | ls_tree(commit->tree->object.sha1, NULL); |
287 | return; | 276 | return; |
288 | } | 277 | } |
289 | 278 | ||
290 | match_path = path; | 279 | match_path = path; |
291 | read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL); | 280 | read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL); |
292 | ls_tail(); | 281 | ls_tail(); |
293 | } | 282 | } |