+/* Try to guess the requested revision from the requested snapshot name.
+ * First the format extension is stripped, e.g. "cgit-0.7.2.tar.gz" become
+ * "cgit-0.7.2". If this is a valid commit object name we've got a winner.
+ * Otherwise, if the snapshot name has a prefix matching the result from
+ * repo_basename(), we strip the basename and any following '-' and '_'
+ * characters ("cgit-0.7.2" -> "0.7.2") and check the resulting name once
+ * more. If this still isn't a valid commit object name, we check if pre-
+ * pending a 'v' or a 'V' to the remaining snapshot name ("0.7.2" ->
+ * "v0.7.2") gives us something valid.
+ */
+static const char *get_ref_from_filename(const char *url, const char *filename,
+ const struct cgit_snapshot_format *format)
+{
+ const char *reponame;
+ unsigned char sha1[20];
+ struct strbuf snapshot = STRBUF_INIT;
+ int result = 1;
+
+ strbuf_addstr(&snapshot, filename);
+ strbuf_setlen(&snapshot, snapshot.len - strlen(format->suffix));
+
+ if (get_sha1(snapshot.buf, sha1) == 0)
+ goto out;
+
+ reponame = cgit_repobasename(url);
+ if (starts_with(snapshot.buf, reponame)) {
+ const char *new_start = snapshot.buf;
+ new_start += strlen(reponame);
+ while (new_start && (*new_start == '-' || *new_start == '_'))
+ new_start++;
+ strbuf_splice(&snapshot, 0, new_start - snapshot.buf, "", 0);
+ }
+
+ if (get_sha1(snapshot.buf, sha1) == 0)
+ goto out;
+
+ strbuf_insert(&snapshot, 0, "v", 1);
+ if (get_sha1(snapshot.buf, sha1) == 0)
+ goto out;
+
+ strbuf_splice(&snapshot, 0, 1, "V", 1);
+ if (get_sha1(snapshot.buf, sha1) == 0)
+ goto out;
+
+ result = 0;
+ strbuf_release(&snapshot);
+
+out:
+ return result ? strbuf_detach(&snapshot, NULL) : NULL;
+}
+
+__attribute__((format (printf, 1, 2)))
+static void show_error(char *fmt, ...)
+{
+ va_list ap;
+
+ ctx.page.mimetype = "text/html";
+ cgit_print_http_headers();
+ cgit_print_docstart();
+ cgit_print_pageheader();
+ va_start(ap, fmt);
+ cgit_vprint_error(fmt, ap);
+ va_end(ap);
+ cgit_print_docend();
+}
+
+void cgit_print_snapshot(const char *head, const char *hex,
+ const char *filename, int dwim)