-rw-r--r-- | ui-snapshot.c | 23 | ||||
-rw-r--r-- | ui-tree.c | 13 |
2 files changed, 25 insertions, 11 deletions
diff --git a/ui-snapshot.c b/ui-snapshot.c index f25613e..5372f5d 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c | |||
@@ -135,60 +135,71 @@ static const char *get_ref_from_filename(const char *url, const char *filename, | |||
135 | snapshot[strlen(snapshot) - strlen(format->suffix)] = '\0'; | 135 | snapshot[strlen(snapshot) - strlen(format->suffix)] = '\0'; |
136 | fprintf(stderr, "snapshot=%s\n", snapshot); | 136 | fprintf(stderr, "snapshot=%s\n", snapshot); |
137 | 137 | ||
138 | if (get_sha1(snapshot, sha1) == 0) | 138 | if (get_sha1(snapshot, sha1) == 0) |
139 | return snapshot; | 139 | return snapshot; |
140 | 140 | ||
141 | reponame = cgit_repobasename(url); | 141 | reponame = cgit_repobasename(url); |
142 | fprintf(stderr, "reponame=%s\n", reponame); | 142 | fprintf(stderr, "reponame=%s\n", reponame); |
143 | if (prefixcmp(snapshot, reponame) == 0) { | 143 | if (prefixcmp(snapshot, reponame) == 0) { |
144 | snapshot += strlen(reponame); | 144 | snapshot += strlen(reponame); |
145 | while (snapshot && (*snapshot == '-' || *snapshot == '_')) | 145 | while (snapshot && (*snapshot == '-' || *snapshot == '_')) |
146 | snapshot++; | 146 | snapshot++; |
147 | } | 147 | } |
148 | 148 | ||
149 | if (get_sha1(snapshot, sha1) == 0) | 149 | if (get_sha1(snapshot, sha1) == 0) |
150 | return snapshot; | 150 | return snapshot; |
151 | 151 | ||
152 | snapshot = fmt("v%s", snapshot); | 152 | snapshot = fmt("v%s", snapshot); |
153 | if (get_sha1(snapshot, sha1) == 0) | 153 | if (get_sha1(snapshot, sha1) == 0) |
154 | return snapshot; | 154 | return snapshot; |
155 | 155 | ||
156 | return NULL; | 156 | return NULL; |
157 | } | 157 | } |
158 | 158 | ||
159 | void show_error(char *msg) | ||
160 | { | ||
161 | ctx.page.mimetype = "text/html"; | ||
162 | cgit_print_http_headers(&ctx); | ||
163 | cgit_print_docstart(&ctx); | ||
164 | cgit_print_pageheader(&ctx); | ||
165 | cgit_print_error(msg); | ||
166 | cgit_print_docend(); | ||
167 | } | ||
168 | |||
159 | void cgit_print_snapshot(const char *head, const char *hex, | 169 | void cgit_print_snapshot(const char *head, const char *hex, |
160 | const char *filename, int snapshots, int dwim) | 170 | const char *filename, int snapshots, int dwim) |
161 | { | 171 | { |
162 | const struct cgit_snapshot_format* f; | 172 | const struct cgit_snapshot_format* f; |
163 | char *prefix = NULL; | 173 | char *prefix = NULL; |
164 | 174 | ||
175 | if (!filename) { | ||
176 | show_error("No snapshot name specified"); | ||
177 | return; | ||
178 | } | ||
179 | |||
165 | f = get_format(filename); | 180 | f = get_format(filename); |
166 | if (!f) { | 181 | if (!f) { |
167 | ctx.page.mimetype = "text/html"; | 182 | show_error(xstrdup(fmt("Unsupported snapshot format: %s", |
168 | cgit_print_http_headers(&ctx); | 183 | filename))); |
169 | cgit_print_docstart(&ctx); | ||
170 | cgit_print_pageheader(&ctx); | ||
171 | cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); | ||
172 | cgit_print_docend(); | ||
173 | return; | 184 | return; |
174 | } | 185 | } |
175 | 186 | ||
176 | if (!hex && dwim) { | 187 | if (!hex && dwim) { |
177 | hex = get_ref_from_filename(ctx.repo->url, filename, f); | 188 | hex = get_ref_from_filename(ctx.repo->url, filename, f); |
178 | if (hex == NULL) { | 189 | if (hex == NULL) { |
179 | html_status(404, "Not found", 0); | 190 | html_status(404, "Not found", 0); |
180 | return; | 191 | return; |
181 | } | 192 | } |
182 | prefix = xstrdup(filename); | 193 | prefix = xstrdup(filename); |
183 | prefix[strlen(filename) - strlen(f->suffix)] = '\0'; | 194 | prefix[strlen(filename) - strlen(f->suffix)] = '\0'; |
184 | } | 195 | } |
185 | 196 | ||
186 | if (!hex) | 197 | if (!hex) |
187 | hex = head; | 198 | hex = head; |
188 | 199 | ||
189 | if (!prefix) | 200 | if (!prefix) |
190 | prefix = xstrdup(cgit_repobasename(ctx.repo->url)); | 201 | prefix = xstrdup(cgit_repobasename(ctx.repo->url)); |
191 | 202 | ||
192 | make_snapshot(f, hex, prefix, filename); | 203 | make_snapshot(f, hex, prefix, filename); |
193 | free(prefix); | 204 | free(prefix); |
194 | } | 205 | } |
@@ -4,53 +4,56 @@ | |||
4 | * | 4 | * |
5 | * Licensed under GNU General Public License v2 | 5 | * Licensed under GNU General Public License v2 |
6 | * (see COPYING for full license text) | 6 | * (see COPYING for full license text) |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <ctype.h> | 9 | #include <ctype.h> |
10 | #include "cgit.h" | 10 | #include "cgit.h" |
11 | #include "html.h" | 11 | #include "html.h" |
12 | #include "ui-shared.h" | 12 | #include "ui-shared.h" |
13 | 13 | ||
14 | char *curr_rev; | 14 | char *curr_rev; |
15 | char *match_path; | 15 | char *match_path; |
16 | int header = 0; | 16 | int header = 0; |
17 | 17 | ||
18 | static void print_text_buffer(char *buf, unsigned long size) | 18 | static void print_text_buffer(char *buf, unsigned long size) |
19 | { | 19 | { |
20 | unsigned long lineno, idx; | 20 | unsigned long lineno, idx; |
21 | const char *numberfmt = | 21 | const char *numberfmt = |
22 | "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n"; | 22 | "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n"; |
23 | 23 | ||
24 | html("<table summary='blob content' class='blob'>\n"); | 24 | html("<table summary='blob content' class='blob'>\n"); |
25 | html("<tr><td class='linenumbers'><pre>"); | 25 | html("<tr><td class='linenumbers'><pre>"); |
26 | idx = 0; | 26 | idx = 0; |
27 | lineno = 0; | 27 | lineno = 0; |
28 | htmlf(numberfmt, ++lineno); | 28 | |
29 | while(idx < size - 1) { // skip absolute last newline | 29 | if (size) { |
30 | if (buf[idx] == '\n') | 30 | htmlf(numberfmt, ++lineno); |
31 | htmlf(numberfmt, ++lineno); | 31 | while(idx < size - 1) { // skip absolute last newline |
32 | idx++; | 32 | if (buf[idx] == '\n') |
33 | htmlf(numberfmt, ++lineno); | ||
34 | idx++; | ||
35 | } | ||
33 | } | 36 | } |
34 | html("</pre></td>\n"); | 37 | html("</pre></td>\n"); |
35 | html("<td class='lines'><pre><code>"); | 38 | html("<td class='lines'><pre><code>"); |
36 | html_txt(buf); | 39 | html_txt(buf); |
37 | html("</code></pre></td></tr></table>\n"); | 40 | html("</code></pre></td></tr></table>\n"); |
38 | } | 41 | } |
39 | 42 | ||
40 | #define ROWLEN 32 | 43 | #define ROWLEN 32 |
41 | 44 | ||
42 | static void print_binary_buffer(char *buf, unsigned long size) | 45 | static void print_binary_buffer(char *buf, unsigned long size) |
43 | { | 46 | { |
44 | unsigned long ofs, idx; | 47 | unsigned long ofs, idx; |
45 | static char ascii[ROWLEN + 1]; | 48 | static char ascii[ROWLEN + 1]; |
46 | 49 | ||
47 | html("<table summary='blob content' class='bin-blob'>\n"); | 50 | html("<table summary='blob content' class='bin-blob'>\n"); |
48 | html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>"); | 51 | html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>"); |
49 | for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { | 52 | for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { |
50 | htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs); | 53 | htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs); |
51 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) | 54 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) |
52 | htmlf("%*s%02x", | 55 | htmlf("%*s%02x", |
53 | idx == 16 ? 4 : 1, "", | 56 | idx == 16 ? 4 : 1, "", |
54 | buf[idx] & 0xff); | 57 | buf[idx] & 0xff); |
55 | html(" </td><td class='hex'>"); | 58 | html(" </td><td class='hex'>"); |
56 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) | 59 | for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) |