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

Allan McRae allan at archlinux.org
Fri Apr 15 13:44:45 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 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 at 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


More information about the pacman-dev mailing list