diff options
| author | 2008-12-02 03:13:44 (JST) | |
|---|---|---|
| committer | 2008-12-02 03:13:44 (JST) | |
| commit | 4b4f8d1256669bf9838e17f83a070de0ec09a699 (patch) | |
| tree | cef7fce789b607f1c68c836976c9a1e371cbbcda | |
| parent | 314d9ea5a3bc60ec518e314bb0bf8072123dc08f (diff) | |
| download | cgit-4b4f8d1256669bf9838e17f83a070de0ec09a699.zip cgit-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>
| -rw-r--r-- | ui-snapshot.c | 80 |
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, | |||
| 114 | return 0; | 114 | return 0; |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | char *dwim_filename = NULL; | 117 | /* Try to guess the requested revision from the requested snapshot name. |
| 118 | const char *dwim_refname = NULL; | 118 | * First the format extension is stripped, e.g. "cgit-0.7.2.tar.gz" become |
| 119 | 119 | * "cgit-0.7.2". If this is a valid commit object name we've got a winner. | |
| 120 | static int ref_cb(const char *refname, const unsigned char *sha1, int flags, | 120 | * Otherwise, if the snapshot name has a prefix matching the result from |
| 121 | void *cb_data) | 121 | * repo_basename(), we strip the basename and any following '-' and '_' |
| 122 | { | 122 | * characters ("cgit-0.7.2" -> "0.7.2") and check the resulting name once |
| 123 | const char *r = refname; | 123 | * more. If this still isn't a valid commit object name, we check if pre- |
| 124 | while (r && *r) { | 124 | * pending a 'v' to the remaining snapshot name ("0.7.2" -> "v0.7.2") gives |
| 125 | fprintf(stderr, " cmp %s with %s:", dwim_filename, r); | 125 | * us something valid. |
| 126 | if (!strcmp(dwim_filename, r)) { | ||
| 127 | fprintf(stderr, "MATCH!\n"); | ||
| 128 | dwim_refname = refname; | ||
| 129 | return 1; | ||
| 130 | } | ||
| 131 | fprintf(stderr, "no match\n"); | ||
| 132 | if (isdigit(*r)) | ||
| 133 | break; | ||
| 134 | r++; | ||
| 135 | } | ||
| 136 | return 0; | ||
| 137 | } | ||
| 138 | |||
| 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 | ||
| 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". | ||
| 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". | ||
| 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. | ||
| 147 | * we first compare with "v0.7.2", then with "0.7.2" and we've got a match. | ||
| 148 | */ | 126 | */ |
| 149 | static const char *get_ref_from_filename(const char *url, const char *filename, | 127 | static const char *get_ref_from_filename(const char *url, const char *filename, |
| 150 | const struct cgit_snapshot_format *fmt) | 128 | const struct cgit_snapshot_format *format) |
| 151 | { | 129 | { |
| 152 | const char *reponame = cgit_repobasename(url); | 130 | const char *reponame; |
| 153 | fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename); | 131 | unsigned char sha1[20]; |
| 154 | if (prefixcmp(filename, reponame)) | 132 | char *snapshot; |
| 155 | return NULL; | 133 | |
| 156 | filename += strlen(reponame); | 134 | snapshot = xstrdup(filename); |
| 157 | while (filename && (*filename == '-' || *filename == '_')) | 135 | snapshot[strlen(snapshot) - strlen(format->suffix)] = '\0'; |
| 158 | filename++; | 136 | fprintf(stderr, "snapshot=%s\n", snapshot); |
| 159 | dwim_filename = xstrdup(filename); | 137 | |
| 160 | dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0'; | 138 | if (get_sha1(snapshot, sha1) == 0) |
| 161 | for_each_tag_ref(ref_cb, NULL); | 139 | return snapshot; |
| 162 | return dwim_refname; | 140 | |
| 141 | reponame = cgit_repobasename(url); | ||
| 142 | fprintf(stderr, "reponame=%s\n", reponame); | ||
| 143 | if (prefixcmp(snapshot, reponame) == 0) { | ||
| 144 | snapshot += strlen(reponame); | ||
| 145 | while (snapshot && (*snapshot == '-' || *snapshot == '_')) | ||
| 146 | snapshot++; | ||
| 147 | } | ||
| 148 | |||
| 149 | if (get_sha1(snapshot, sha1) == 0) | ||
| 150 | return snapshot; | ||
| 151 | |||
| 152 | snapshot = fmt("v%s", snapshot); | ||
| 153 | if (get_sha1(snapshot, sha1) == 0) | ||
| 154 | return snapshot; | ||
| 155 | |||
| 156 | return NULL; | ||
| 163 | } | 157 | } |
| 164 | 158 | ||
| 165 | void cgit_print_snapshot(const char *head, const char *hex, | 159 | void cgit_print_snapshot(const char *head, const char *hex, |
