[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