When using "pacman -Sp" operation to get URLs of packages to download, it is useful to know which packages are already in the file cache and do not need downloaded. Print packages in the cache with a file:// prefix. e.g $ pacman -Sp glibc file:///var/cache/pacman/glibc-2.23-1-x86_64.pkg.tar.xz Fixes FS#15868 Signed-off-by: Allan McRae <allan@archlinux.org> --- src/pacman/util.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/pacman/util.c b/src/pacman/util.c index d924bf3..5a5c0da 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -1027,11 +1027,27 @@ static char *pkg_get_location(alpm_pkg_t *pkg) char *string = NULL; switch(config->op) { case PM_OP_SYNC: - servers = alpm_db_get_servers(alpm_pkg_get_db(pkg)); - if(servers) { - pm_asprintf(&string, "%s/%s", (char *)(servers->data), - alpm_pkg_get_filename(pkg)); - return string; + if(alpm_pkg_download_size(pkg) == 0) { + /* file is already in the package cache */ + alpm_list_t *i; + const char *pkgfile = alpm_pkg_get_filename(pkg); + char path[PATH_MAX]; + struct stat buf; + + for(i = alpm_option_get_cachedirs(config->handle); i; i = i->next) { + snprintf(path, PATH_MAX, "%s%s", (char *)i->data, pkgfile); + if(stat(path, &buf) == 0 && S_ISREG(buf.st_mode)) { + pm_asprintf(&string, "file://%s", path); + return string; + } + } + } else { + servers = alpm_db_get_servers(alpm_pkg_get_db(pkg)); + if(servers) { + pm_asprintf(&string, "%s/%s", (char *)(servers->data), + alpm_pkg_get_filename(pkg)); + return string; + } } case PM_OP_UPGRADE: return strdup(alpm_pkg_get_filename(pkg)); -- 2.7.4