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 <[email protected]>
---
Ugly patch, for not a whole lot of noise. Pointed out by Ioni that we don't
look in the cachedirs anymore for files downloaded via -U.

 lib/libalpm/dload.c |   92 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 60 insertions(+), 32 deletions(-)

diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index a3980d6..0092838 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -558,6 +558,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 0;
+       }
+
+       basename++;
+       if(basename == '\0') {
+               return 0;
+       }
+
+       return _alpm_filecache_find(handle, basename);
+}
+
 /** Fetch a remote pkg. */
 char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url)
 {
@@ -565,7 +581,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, 
const char *url)
        const char *cachedir;
        char *final_file = NULL;
        struct dload_payload payload;
-       int ret;
+       int ret = 0;
 
        CHECK_HANDLE(handle, return NULL);
        ASSERT(url, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, NULL));
@@ -574,51 +590,63 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, 
const char *url)
        cachedir = _alpm_filecache_setup(handle);
 
        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 */
-       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;
+
+       /* attempt to find the file in our pkgcache */
+       filepath = filecache_find_url(handle, url);
+       if(filepath == NULL) {
+               STRDUP(payload.fileurl, url, RET_ERR(handle, ALPM_ERR_MEMORY, 
NULL));
+               payload.allow_resume = 1;
+               payload.handle = handle;
+
+               /* 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 */
        if(ret == 0 && (handle->siglevel & ALPM_SIG_PACKAGE)) {
-               char *sig_final_file = NULL;
+               char *sig_filepath, *sig_final_file = NULL;
                size_t len;
 
                len = strlen(url) + 5;
                MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, 
NULL));
                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 */
-               payload.max_size = 16 * 1024;
-
-               ret = _alpm_download(&payload, cachedir, &sig_final_file);
-               if(ret == -1 && !payload.errors_ok) {
-                       _alpm_log(handle, ALPM_LOG_WARNING,
-                                       _("failed to download %s\n"), 
payload.fileurl);
-                       /* Warn now, but don't return NULL. We will fail later 
during package
-                        * load time. */
-               } else if(ret == 0) {
-                       _alpm_log(handle, ALPM_LOG_DEBUG,
-                                       "successfully downloaded %s\n", 
payload.fileurl);
+
+               sig_filepath = filecache_find_url(handle, payload.fileurl);
+               if(sig_filepath == NULL) {
+                       payload.handle = handle;
+                       payload.force = 1;
+                       payload.errors_ok = (handle->siglevel & 
ALPM_SIG_PACKAGE_OPTIONAL);
+
+                       /* set hard upper limit of 16KiB */
+                       payload.max_size = 16 * 1024;
+
+                       ret = _alpm_download(&payload, cachedir, 
&sig_final_file);
+                       if(ret == -1 && !payload.errors_ok) {
+                               _alpm_log(handle, ALPM_LOG_WARNING,
+                                               _("failed to download %s\n"), 
payload.fileurl);
+                               /* Warn now, but don't return NULL. We will 
fail later during package
+                                * 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);
        }
 
        /* 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);
 
        return filepath;
-- 
1.7.8.3


Reply via email to