about summary refs log tree commit
path: root/ui-snapshot.c
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2008-12-01 19:13:44 +0100
committerLars Hjemli <hjemli@gmail.com>2008-12-01 19:13:44 +0100
commit4b4f8d1256669bf9838e17f83a070de0ec09a699 (patch)
treecef7fce789b607f1c68c836976c9a1e371cbbcda /ui-snapshot.c
parent314d9ea5a3bc60ec518e314bb0bf8072123dc08f (diff)
downloadcgit-4b4f8d1256669bf9838e17f83a070de0ec09a699.tar.gz
ui-snapshot: improve extraction of revision from snapshot name
The modified get_ref_from_filename() supports the following snapshot
formats:
* $REV.$EXT
* $REPO[-_]*v?$REV.$EXT

This implies that the following urls will retrieve the expected revision:
* http://hjemli.net/git/cgit/snapshot/v0.8.1.tar.gz
* http://hjemli.net/git/cgit/snapshot/0.8.1.tar.gz
* http://hjemli.net/git/cgit/snapshot/cgit-0.8.1.tar.gz
* http://hjemli.net/git/cgit/snapshot/cgit-140012d7a8.tar.gz

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'ui-snapshot.c')
-rw-r--r--ui-snapshot.c80
1 files changed, 37 insertions, 43 deletions
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 76457d6..6f09151 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -114,52 +114,46 @@ static int make_snapshot(const struct cgit_snapshot_format *format,
         return 0;
 }
 
-char *dwim_filename = NULL;
-const char *dwim_refname = NULL;
-
-static int ref_cb(const char *refname, const unsigned char *sha1, int flags,
-                  void *cb_data)
-{
-        const char *r = refname;
-        while (r && *r) {
-                fprintf(stderr, "  cmp %s with %s:", dwim_filename, r);
-                if (!strcmp(dwim_filename, r)) {
-                        fprintf(stderr, "MATCH!\n");
-                        dwim_refname = refname;
-                        return 1;
-                }
-                fprintf(stderr, "no match\n");
-                if (isdigit(*r))
-                        break;
-                r++;
-        }
-        return 0;
-}
-
-/* Try to guess the requested revision by combining repo name and tag name
- * and comparing this to the requested snapshot name. E.g. the requested
- * snapshot is "cgit-0.7.2.tar.gz" while repo name is "cgit" and tag name
- * is "v0.7.2". First, the reponame is stripped off, leaving "-0.7.2.tar.gz".
- * Next, any '-' and '_' characters are stripped, leaving "0.7.2.tar.gz".
- * Finally, the requested format suffix is removed and we end up with "0.7.2".
- * Then we test each tag against this dwimmed filename, and for each tag
- * we even try to remove any leading characters which are non-digits. I.e.
- * we first compare with "v0.7.2", then with "0.7.2" and we've got a match.
+/* 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' 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 *fmt)
+                                         const struct cgit_snapshot_format *format)
 {
-        const char *reponame = cgit_repobasename(url);
-        fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename);
-        if (prefixcmp(filename, reponame))
-                return NULL;
-        filename += strlen(reponame);
-        while (filename && (*filename == '-' || *filename == '_'))
-                filename++;
-        dwim_filename = xstrdup(filename);
-        dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0';
-        for_each_tag_ref(ref_cb, NULL);
-        return dwim_refname;
+        const char *reponame;
+        unsigned char sha1[20];
+        char *snapshot;
+
+        snapshot = xstrdup(filename);
+        snapshot[strlen(snapshot) - strlen(format->suffix)] = '\0';
+        fprintf(stderr, "snapshot=%s\n", snapshot);
+
+        if (get_sha1(snapshot, sha1) == 0)
+                return snapshot;
+
+        reponame = cgit_repobasename(url);
+        fprintf(stderr, "reponame=%s\n", reponame);
+        if (prefixcmp(snapshot, reponame) == 0) {
+                snapshot += strlen(reponame);
+                while (snapshot && (*snapshot == '-' || *snapshot == '_'))
+                        snapshot++;
+        }
+
+        if (get_sha1(snapshot, sha1) == 0)
+                return snapshot;
+
+        snapshot = fmt("v%s", snapshot);
+        if (get_sha1(snapshot, sha1) == 0)
+                return snapshot;
+
+        return NULL;
 }
 
 void cgit_print_snapshot(const char *head, const char *hex,