[pacman-dev] [PATCH] Report local file URL for -Sp operations if package is in cache

Allan McRae allan at archlinux.org
Thu May 5 03:37:52 UTC 2016


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 use package locations in case statements rather than opersations. This
allows the ALPM_PKG_SYNCDB to fall thorough to just printing the package name
for weird serverless repo setups.

Fixes FS#15868

Signed-off-by: Allan McRae <allan at archlinux.org>
---


v3:
 - use ALPM_PKG_FROM_* in the switch statement
 - get fall-through correct

 src/pacman/util.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/pacman/util.c b/src/pacman/util.c
index 0155493..81780f7 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -1025,16 +1025,37 @@ static char *pkg_get_location(alpm_pkg_t *pkg)
 {
 	alpm_list_t *servers;
 	char *string = NULL;
-	switch(config->op) {
-		case PM_OP_SYNC:
+	switch(alpm_pkg_get_origin(pkg)) {
+		case ALPM_PKG_FROM_SYNCDB:
+			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:
+
+			/* fallthrough - for theoretical serverless repos */
+
+		case ALPM_PKG_FROM_FILE:
 			return strdup(alpm_pkg_get_filename(pkg));
+
+		case ALPM_PKG_FROM_LOCALDB:
 		default:
 			pm_asprintf(&string, "%s-%s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
 			return string;
-- 
2.8.2


More information about the pacman-dev mailing list