[pacman-dev] [PATCH] Report local file URL for -Sp operations if package is in cache
Allan McRae
allan at archlinux.org
Tue Mar 29 12:03:00 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
Fixes FS#15868
Signed-off-by: Allan McRae <allan at 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
More information about the pacman-dev
mailing list