summaryrefslogtreecommitdiffabout
path: root/ui-snapshot.c
Unidiff
Diffstat (limited to 'ui-snapshot.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-snapshot.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 9c4d086..76457d6 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -117,72 +117,82 @@ static int make_snapshot(const struct cgit_snapshot_format *format,
117char *dwim_filename = NULL; 117char *dwim_filename = NULL;
118const char *dwim_refname = NULL; 118const char *dwim_refname = NULL;
119 119
120static int ref_cb(const char *refname, const unsigned char *sha1, int flags, 120static int ref_cb(const char *refname, const unsigned char *sha1, int flags,
121 void *cb_data) 121 void *cb_data)
122{ 122{
123 const char *r = refname; 123 const char *r = refname;
124 while (r && *r) { 124 while (r && *r) {
125 fprintf(stderr, " cmp %s with %s:", dwim_filename, r); 125 fprintf(stderr, " cmp %s with %s:", dwim_filename, r);
126 if (!strcmp(dwim_filename, r)) { 126 if (!strcmp(dwim_filename, r)) {
127 fprintf(stderr, "MATCH!\n"); 127 fprintf(stderr, "MATCH!\n");
128 dwim_refname = refname; 128 dwim_refname = refname;
129 return 1; 129 return 1;
130 } 130 }
131 fprintf(stderr, "no match\n"); 131 fprintf(stderr, "no match\n");
132 if (isdigit(*r)) 132 if (isdigit(*r))
133 break; 133 break;
134 r++; 134 r++;
135 } 135 }
136 return 0; 136 return 0;
137} 137}
138 138
139/* Try to guess the requested revision by combining repo name and tag name 139/* Try to guess the requested revision by combining repo name and tag name
140 * and comparing this to the requested snapshot name. E.g. the requested 140 * and comparing this to the requested snapshot name. E.g. the requested
141 * snapshot is "cgit-0.7.2.tar.gz" while repo name is "cgit" and tag name 141 * snapshot is "cgit-0.7.2.tar.gz" while repo name is "cgit" and tag name
142 * is "v0.7.2". First, the reponame is stripped off, leaving "-0.7.2.tar.gz". 142 * is "v0.7.2". First, the reponame is stripped off, leaving "-0.7.2.tar.gz".
143 * Next, any '-' and '_' characters are stripped, leaving "0.7.2.tar.gz". 143 * Next, any '-' and '_' characters are stripped, leaving "0.7.2.tar.gz".
144 * Finally, the requested format suffix is removed and we end up with "0.7.2". 144 * Finally, the requested format suffix is removed and we end up with "0.7.2".
145 * Then we test each tag against this dwimmed filename, and for each tag 145 * Then we test each tag against this dwimmed filename, and for each tag
146 * we even try to remove any leading characters which are non-digits. I.e. 146 * we even try to remove any leading characters which are non-digits. I.e.
147 * we first compare with "v0.7.2", then with "0.7.2" and we've got a match. 147 * we first compare with "v0.7.2", then with "0.7.2" and we've got a match.
148 */ 148 */
149static const char *get_ref_from_filename(const char *url, const char *filename, 149static const char *get_ref_from_filename(const char *url, const char *filename,
150 const struct cgit_snapshot_format *fmt) 150 const struct cgit_snapshot_format *fmt)
151{ 151{
152 const char *reponame = cgit_repobasename(url); 152 const char *reponame = cgit_repobasename(url);
153 fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename); 153 fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename);
154 if (prefixcmp(filename, reponame)) 154 if (prefixcmp(filename, reponame))
155 return NULL; 155 return NULL;
156 filename += strlen(reponame); 156 filename += strlen(reponame);
157 while (filename && (*filename == '-' || *filename == '_')) 157 while (filename && (*filename == '-' || *filename == '_'))
158 filename++; 158 filename++;
159 dwim_filename = xstrdup(filename); 159 dwim_filename = xstrdup(filename);
160 dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0'; 160 dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0';
161 for_each_tag_ref(ref_cb, NULL); 161 for_each_tag_ref(ref_cb, NULL);
162 return dwim_refname; 162 return dwim_refname;
163} 163}
164 164
165void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, 165void cgit_print_snapshot(const char *head, const char *hex,
166 const char *filename, int snapshots, int dwim) 166 const char *filename, int snapshots, int dwim)
167{ 167{
168 const struct cgit_snapshot_format* f; 168 const struct cgit_snapshot_format* f;
169 char *prefix = NULL;
169 170
170 f = get_format(filename); 171 f = get_format(filename);
171 if (!f) { 172 if (!f) {
172 ctx.page.mimetype = "text/html"; 173 ctx.page.mimetype = "text/html";
173 cgit_print_http_headers(&ctx); 174 cgit_print_http_headers(&ctx);
174 cgit_print_docstart(&ctx); 175 cgit_print_docstart(&ctx);
175 cgit_print_pageheader(&ctx); 176 cgit_print_pageheader(&ctx);
176 cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); 177 cgit_print_error(fmt("Unsupported snapshot format: %s", filename));
177 cgit_print_docend(); 178 cgit_print_docend();
178 return; 179 return;
179 } 180 }
180 181
181 if (!hex && dwim) 182 if (!hex && dwim) {
182 hex = get_ref_from_filename(ctx.repo->url, filename, f); 183 hex = get_ref_from_filename(ctx.repo->url, filename, f);
184 if (hex != NULL) {
185 prefix = xstrdup(filename);
186 prefix[strlen(filename) - strlen(f->suffix)] = '\0';
187 }
188 }
183 189
184 if (!hex) 190 if (!hex)
185 hex = head; 191 hex = head;
186 192
193 if (!prefix)
194 prefix = xstrdup(cgit_repobasename(ctx.repo->url));
195
187 make_snapshot(f, hex, prefix, filename); 196 make_snapshot(f, hex, prefix, filename);
197 free(prefix);
188} 198}