[pacman-dev] [PATCH v2] Report local file URL for -Sp operations if package is in cache
Andrew Gregory
andrew.gregory.8 at gmail.com
Tue Apr 19 00:20:52 UTC 2016
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 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 */
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
More information about the pacman-dev
mailing list