[pacman-dev] [PATCH v2] Report local file URL for -Sp operations if package is in cache
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
On 04/15/16 at 11:44pm, Allan McRae wrote:
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 */
The fall-through definitely needed to be noted, but we have it because serverless repos, although mostly useless, are allowed by pacman/alpm. In that case I think the original fallback of printing the filename is the better option. "default" is really just PM_OP_REMOVE. I also noticed that `pacman -Up` prints the filename for any repo packages instead of the url. For consistency, I think this should ultimately be changed to use the source of the package rather than the operation to determine the output format.
default: pm_asprintf(&string, "%s-%s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg)); return string; -- 2.7.4
participants (2)
-
Allan McRae
-
Andrew Gregory