mirror of
https://git.zx2c4.com/cgit
synced 2024-11-22 16:38:42 +00:00
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>
This commit is contained in:
parent
314d9ea5a3
commit
4b4f8d1256
@ -114,52 +114,46 @@ static int make_snapshot(const struct cgit_snapshot_format *format,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *dwim_filename = NULL;
|
/* Try to guess the requested revision from the requested snapshot name.
|
||||||
const char *dwim_refname = NULL;
|
* 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.
|
||||||
static int ref_cb(const char *refname, const unsigned char *sha1, int flags,
|
* Otherwise, if the snapshot name has a prefix matching the result from
|
||||||
void *cb_data)
|
* repo_basename(), we strip the basename and any following '-' and '_'
|
||||||
{
|
* characters ("cgit-0.7.2" -> "0.7.2") and check the resulting name once
|
||||||
const char *r = refname;
|
* more. If this still isn't a valid commit object name, we check if pre-
|
||||||
while (r && *r) {
|
* pending a 'v' to the remaining snapshot name ("0.7.2" -> "v0.7.2") gives
|
||||||
fprintf(stderr, " cmp %s with %s:", dwim_filename, r);
|
* us something valid.
|
||||||
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.
|
|
||||||
*/
|
*/
|
||||||
static const char *get_ref_from_filename(const char *url, const char *filename,
|
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);
|
const char *reponame;
|
||||||
fprintf(stderr, "reponame=%s, filename=%s\n", reponame, filename);
|
unsigned char sha1[20];
|
||||||
if (prefixcmp(filename, reponame))
|
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;
|
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cgit_print_snapshot(const char *head, const char *hex,
|
void cgit_print_snapshot(const char *head, const char *hex,
|
||||||
|
Loading…
Reference in New Issue
Block a user