fetch_url: look for files in cache before downloading

We lost this logic somewhere between the libfetch and libcurl
transition, as it existed in the internal downloader, but was pulled
back only into the sync workflow. Add a helper function that will let us
check for existance in the filecache prior to calling the downloader.

Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dave Reisner 2012-01-14 15:27:48 -05:00 committed by Dan McGee
parent b426488e2b
commit 4e60b9646d

View file

@ -562,6 +562,22 @@ int _alpm_download(struct dload_payload *payload, const char *localpath,
} }
} }
static char *filecache_find_url(alpm_handle_t *handle, const char *url)
{
const char *basename = strrchr(url, '/');
if(basename == NULL) {
return NULL;
}
basename++;
if(basename == '\0') {
return NULL;
}
return _alpm_filecache_find(handle, basename);
}
/** Fetch a remote pkg. */ /** Fetch a remote pkg. */
char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url)
{ {
@ -569,7 +585,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url)
const char *cachedir; const char *cachedir;
char *final_file = NULL; char *final_file = NULL;
struct dload_payload payload; struct dload_payload payload;
int ret; int ret = 0;
CHECK_HANDLE(handle, return NULL); CHECK_HANDLE(handle, return NULL);
ASSERT(url, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL)); ASSERT(url, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL));
@ -578,51 +594,63 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url)
cachedir = _alpm_filecache_setup(handle); cachedir = _alpm_filecache_setup(handle);
memset(&payload, 0, sizeof(struct dload_payload)); memset(&payload, 0, sizeof(struct dload_payload));
payload.handle = handle;
STRDUP(payload.fileurl, url, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
payload.allow_resume = 1;
/* download the file */ /* attempt to find the file in our pkgcache */
ret = _alpm_download(&payload, cachedir, &final_file); filepath = filecache_find_url(handle, url);
_alpm_dload_payload_reset(&payload); if(filepath == NULL) {
if(ret == -1) { STRDUP(payload.fileurl, url, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
_alpm_log(handle, ALPM_LOG_WARNING, _("failed to download %s\n"), url); payload.allow_resume = 1;
free(final_file); payload.handle = handle;
return NULL;
/* download the file */
ret = _alpm_download(&payload, cachedir, &final_file);
_alpm_dload_payload_reset(&payload);
if(ret == -1) {
_alpm_log(handle, ALPM_LOG_WARNING, _("failed to download %s\n"), url);
free(final_file);
return NULL;
}
_alpm_log(handle, ALPM_LOG_DEBUG, "successfully downloaded %s\n", url);
} }
_alpm_log(handle, ALPM_LOG_DEBUG, "successfully downloaded %s\n", url);
/* attempt to download the signature */ /* attempt to download the signature */
if(ret == 0 && (handle->siglevel & ALPM_SIG_PACKAGE)) { if(ret == 0 && (handle->siglevel & ALPM_SIG_PACKAGE)) {
char *sig_final_file = NULL; char *sig_filepath, *sig_final_file = NULL;
size_t len; size_t len;
len = strlen(url) + 5; len = strlen(url) + 5;
MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, NULL)); MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
snprintf(payload.fileurl, len, "%s.sig", url); snprintf(payload.fileurl, len, "%s.sig", url);
payload.handle = handle;
payload.force = 1;
payload.errors_ok = (handle->siglevel & ALPM_SIG_PACKAGE_OPTIONAL);
/* set hard upper limit of 16KiB */ sig_filepath = filecache_find_url(handle, payload.fileurl);
payload.max_size = 16 * 1024; if(sig_filepath == NULL) {
payload.handle = handle;
payload.force = 1;
payload.errors_ok = (handle->siglevel & ALPM_SIG_PACKAGE_OPTIONAL);
ret = _alpm_download(&payload, cachedir, &sig_final_file); /* set hard upper limit of 16KiB */
if(ret == -1 && !payload.errors_ok) { payload.max_size = 16 * 1024;
_alpm_log(handle, ALPM_LOG_WARNING,
_("failed to download %s\n"), payload.fileurl); ret = _alpm_download(&payload, cachedir, &sig_final_file);
/* Warn now, but don't return NULL. We will fail later during package if(ret == -1 && !payload.errors_ok) {
* load time. */ _alpm_log(handle, ALPM_LOG_WARNING,
} else if(ret == 0) { _("failed to download %s\n"), payload.fileurl);
_alpm_log(handle, ALPM_LOG_DEBUG, /* Warn now, but don't return NULL. We will fail later during package
"successfully downloaded %s\n", payload.fileurl); * load time. */
} else if(ret == 0) {
_alpm_log(handle, ALPM_LOG_DEBUG,
"successfully downloaded %s\n", payload.fileurl);
}
FREE(sig_final_file);
} }
FREE(sig_final_file); free(sig_filepath);
_alpm_dload_payload_reset(&payload); _alpm_dload_payload_reset(&payload);
} }
/* we should be able to find the file the second time around */ /* we should be able to find the file the second time around */
filepath = _alpm_filecache_find(handle, final_file); if(filepath == NULL) {
filepath = _alpm_filecache_find(handle, final_file);
}
free(final_file); free(final_file);
return filepath; return filepath;