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 Also reordered the case statements so that appropriate output is printed if an impossible fallthrough occurs in the sync case. Fixes FS#15868 Signed-off-by: Allan McRae <allan@archlinux.org> --- v2: - move "servers =" block in case PM_OP_SYNC out of else block - move PM_OP_SYNC below PM_OP_UPGRADE as technically a fallthrough could happen and that should go to the default output. src/pacman/util.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/pacman/util.c b/src/pacman/util.c index d924bf3..ed21bc8 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -1026,15 +1026,35 @@ static char *pkg_get_location(alpm_pkg_t *pkg) alpm_list_t *servers; char *string = NULL; switch(config->op) { + case PM_OP_UPGRADE: + return strdup(alpm_pkg_get_filename(pkg)); + case PM_OP_SYNC: + 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; + } + } + } + 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)); + + /* fallthrough should never occur */ + default: pm_asprintf(&string, "%s-%s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg)); return string; -- 2.7.4