xbps-install: improved -D,--download-only support.
Added support to download all dependencies even if the euid does not have write perms to rootdir. In this mode we only care if cachedir is writable, rootdir access is not necessary. This is really useful to download all binary packages required by any number of packages as any regular user to later perform off-line installations, i.e: ``` $ xbps-install -c $PWD/cachedir -yD xbps ... $ tree cachedir cachedir/ ├── acl-2.2.53_1.x86_64-musl.xbps ├── acl-2.2.53_1.x86_64-musl.xbps.sig ├── attr-2.4.48_1.x86_64-musl.xbps ├── attr-2.4.48_1.x86_64-musl.xbps.sig ├── bzip2-1.0.8_1.x86_64-musl.xbps ├── bzip2-1.0.8_1.x86_64-musl.xbps.sig ├── ca-certificates-20190110_1.noarch.xbps ├── ca-certificates-20190110_1.noarch.xbps.sig ├── libarchive-3.4.1_1.x86_64-musl.xbps ├── libarchive-3.4.1_1.x86_64-musl.xbps.sig ├── libcrypto45-3.0.2_2.x86_64-musl.xbps ├── libcrypto45-3.0.2_2.x86_64-musl.xbps.sig ├── liblz4-1.9.2_1.x86_64-musl.xbps ├── liblz4-1.9.2_1.x86_64-musl.xbps.sig ├── liblzma-5.2.4_2.x86_64-musl.xbps ├── liblzma-5.2.4_2.x86_64-musl.xbps.sig ├── libressl-3.0.2_2.x86_64-musl.xbps ├── libressl-3.0.2_2.x86_64-musl.xbps.sig ├── libssl47-3.0.2_2.x86_64-musl.xbps ├── libssl47-3.0.2_2.x86_64-musl.xbps.sig ├── libtls19-3.0.2_2.x86_64-musl.xbps ├── libtls19-3.0.2_2.x86_64-musl.xbps.sig ├── libxbps-0.57.1_8.x86_64-musl.xbps ├── libxbps-0.57.1_8.x86_64-musl.xbps.sig ├── libzstd-1.4.4_1.x86_64-musl.xbps ├── libzstd-1.4.4_1.x86_64-musl.xbps.sig ├── musl-1.1.24_1.x86_64-musl.xbps ├── musl-1.1.24_1.x86_64-musl.xbps.sig ├── run-parts-4.9.1_1.x86_64-musl.xbps ├── run-parts-4.9.1_1.x86_64-musl.xbps.sig ├── xbps-0.57.1_8.x86_64-musl.xbps ├── xbps-0.57.1_8.x86_64-musl.xbps.sig ├── xbps-triggers-0.113_3.noarch.xbps ├── xbps-triggers-0.113_3.noarch.xbps.sig ├── zlib-1.2.11_3.x86_64-musl.xbps └── zlib-1.2.11_3.x86_64-musl.xbps.sig 0 directories, 36 files $ ``` Inpired by #213 Closes #213
This commit is contained in:
@ -62,7 +62,6 @@ compute_transaction_stats(struct xbps_handle *xhp)
|
||||
struct statvfs svfs;
|
||||
uint64_t rootdir_free_size, tsize, dlsize, instsize, rmsize;
|
||||
uint32_t inst_pkgcnt, up_pkgcnt, cf_pkgcnt, rm_pkgcnt, dl_pkgcnt;
|
||||
const char *tract, *pkgver, *repo;
|
||||
|
||||
inst_pkgcnt = up_pkgcnt = cf_pkgcnt = rm_pkgcnt = dl_pkgcnt = 0;
|
||||
tsize = dlsize = instsize = rmsize = 0;
|
||||
@ -72,6 +71,7 @@ compute_transaction_stats(struct xbps_handle *xhp)
|
||||
return EINVAL;
|
||||
|
||||
while ((obj = xbps_object_iterator_next(iter)) != NULL) {
|
||||
const char *pkgver = NULL, *repo = NULL, *tract = NULL;
|
||||
bool preserve = false;
|
||||
/*
|
||||
* Count number of pkgs to be removed, configured,
|
||||
@ -82,6 +82,20 @@ compute_transaction_stats(struct xbps_handle *xhp)
|
||||
xbps_dictionary_get_cstring_nocopy(obj, "repository", &repo);
|
||||
xbps_dictionary_get_bool(obj, "preserve", &preserve);
|
||||
|
||||
if (xhp->flags & XBPS_FLAG_DOWNLOAD_ONLY) {
|
||||
tract = "download";
|
||||
if (xbps_repository_is_remote(repo) &&
|
||||
!xbps_binpkg_exists(xhp, obj)) {
|
||||
xbps_dictionary_get_uint64(obj,
|
||||
"filename-size", &tsize);
|
||||
tsize += 512;
|
||||
dlsize += tsize;
|
||||
dl_pkgcnt++;
|
||||
xbps_dictionary_set_bool(obj, "download", true);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(tract, "configure") == 0) {
|
||||
cf_pkgcnt++;
|
||||
continue;
|
||||
@ -347,6 +361,13 @@ xbps_transaction_prepare(struct xbps_handle *xhp)
|
||||
if (all_on_hold)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Do not perform any checks if XBPS_FLAG_DOWNLOAD_ONLY
|
||||
* is set. We just need to download the archives (dependencies).
|
||||
*/
|
||||
if (xhp->flags & XBPS_FLAG_DOWNLOAD_ONLY)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Check for packages to be replaced.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user