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:
		| @@ -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; | ||||||
| 		return NULL; |  | ||||||
| 	filename += strlen(reponame); | 	snapshot = xstrdup(filename); | ||||||
| 	while (filename && (*filename == '-' || *filename == '_')) | 	snapshot[strlen(snapshot) - strlen(format->suffix)] = '\0'; | ||||||
| 		filename++; | 	fprintf(stderr, "snapshot=%s\n", snapshot); | ||||||
| 	dwim_filename = xstrdup(filename); |  | ||||||
| 	dwim_filename[strlen(filename) - strlen(fmt->suffix)] = '\0'; | 	if (get_sha1(snapshot, sha1) == 0) | ||||||
| 	for_each_tag_ref(ref_cb, NULL); | 		return snapshot; | ||||||
| 	return dwim_refname; |  | ||||||
|  | 	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, | void cgit_print_snapshot(const char *head, const char *hex, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lars Hjemli
					Lars Hjemli