libxbps: simplify xbps_transaction_commit().
This commit is contained in:
parent
bda1feb396
commit
a80df68b15
@ -175,10 +175,9 @@ xbps_transaction_commit(prop_dictionary_t transd)
|
|||||||
prop_object_iterator_t iter;
|
prop_object_iterator_t iter;
|
||||||
const char *pkgname, *version, *pkgver, *filen, *tract;
|
const char *pkgname, *version, *pkgver, *filen, *tract;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
bool update, preserve;
|
bool update;
|
||||||
pkg_state_t state;
|
|
||||||
|
|
||||||
assert(transd != NULL);
|
assert(prop_object_type(transd) == PROP_TYPE_DICTIONARY);
|
||||||
|
|
||||||
xhp = xbps_handle_get();
|
xhp = xbps_handle_get();
|
||||||
iter = xbps_array_iter_from_dict(transd, "packages");
|
iter = xbps_array_iter_from_dict(transd, "packages");
|
||||||
@ -191,7 +190,6 @@ xbps_transaction_commit(prop_dictionary_t transd)
|
|||||||
"[*] Downloading binary packages", NULL, NULL, NULL);
|
"[*] Downloading binary packages", NULL, NULL, NULL);
|
||||||
if ((rv = download_binpkgs(xhp, iter)) != 0)
|
if ((rv = download_binpkgs(xhp, iter)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check SHA256 hashes for binary packages in transaction.
|
* Check SHA256 hashes for binary packages in transaction.
|
||||||
*/
|
*/
|
||||||
@ -199,31 +197,27 @@ xbps_transaction_commit(prop_dictionary_t transd)
|
|||||||
"[*] Verifying binary package integrity", NULL, NULL, NULL);
|
"[*] Verifying binary package integrity", NULL, NULL, NULL);
|
||||||
if ((rv = check_binpkgs_hash(xhp, iter)) != 0)
|
if ((rv = check_binpkgs_hash(xhp, iter)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove packages to be replaced.
|
* Install, update, configure or remove packages as specified
|
||||||
|
* in the transaction dictionary.
|
||||||
*/
|
*/
|
||||||
if (prop_dictionary_get(transd, "total-remove-pkgs")) {
|
RUN_TRANS_CB(XBPS_TRANS_STATE_INSTALL,
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_REPLACE,
|
"[*] Running transaction tasks", NULL, NULL, NULL);
|
||||||
"[*] Removing packages to be replaced", NULL, NULL, NULL);
|
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction",
|
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
||||||
&tract);
|
prop_dictionary_get_cstring_nocopy(obj, "pkgname", &pkgname);
|
||||||
if (strcmp(tract, "remove"))
|
prop_dictionary_get_cstring_nocopy(obj, "version", &version);
|
||||||
continue;
|
prop_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver);
|
||||||
|
prop_dictionary_get_cstring_nocopy(obj, "filename", &filen);
|
||||||
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgname",
|
if (strcmp(tract, "remove") == 0) {
|
||||||
&pkgname);
|
/*
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "version",
|
* Remove a package.
|
||||||
&version);
|
*/
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgver",
|
|
||||||
&pkgver);
|
|
||||||
update = false;
|
update = false;
|
||||||
prop_dictionary_get_bool(obj, "remove-and-update",
|
prop_dictionary_get_bool(obj, "remove-and-update",
|
||||||
&update);
|
&update);
|
||||||
|
|
||||||
/* Remove and purge packages that shall be replaced */
|
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_REMOVE,
|
RUN_TRANS_CB(XBPS_TRANS_STATE_REMOVE,
|
||||||
NULL, pkgver, NULL, NULL);
|
NULL, pkgver, NULL, NULL);
|
||||||
rv = xbps_remove_pkg(pkgname, version, update);
|
rv = xbps_remove_pkg(pkgname, version, update);
|
||||||
@ -242,72 +236,32 @@ xbps_transaction_commit(prop_dictionary_t transd)
|
|||||||
pkgver, rv);
|
pkgver, rv);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
} else if (strcmp(tract, "configure") == 0) {
|
||||||
prop_object_iterator_reset(iter);
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Configure pending packages.
|
* Reconfigure pending package.
|
||||||
*/
|
*/
|
||||||
if (prop_dictionary_get(transd, "total-configure-pkgs")) {
|
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_CONFIGURE,
|
|
||||||
"[*] Reconfigure unpacked packages", NULL, NULL, NULL);
|
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction",
|
|
||||||
&tract);
|
|
||||||
if (strcmp(tract, "configure"))
|
|
||||||
continue;
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgname",
|
|
||||||
&pkgname);
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "version",
|
|
||||||
&version);
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgver",
|
|
||||||
&pkgver);
|
|
||||||
|
|
||||||
rv = xbps_configure_pkg(pkgname, version, false, false);
|
rv = xbps_configure_pkg(pkgname, version, false, false);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_CONFIGURE,
|
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_CONFIGURE,
|
||||||
pkgver, rv);
|
pkgver, rv);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
prop_object_iterator_reset(iter);
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Install or update packages in transaction.
|
* Install or update a package.
|
||||||
*/
|
*/
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_INSTALL,
|
if (strcmp(tract, "update") == 0)
|
||||||
"[*] Unpacking packages to be installed/updated", NULL, NULL, NULL);
|
update = true;
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
if (update) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
|
||||||
/* Match only packages to be installed or updated */
|
|
||||||
if ((strcmp(tract, "remove") == 0) ||
|
|
||||||
(strcmp(tract, "configure") == 0))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
preserve = false;
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgname", &pkgname);
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "version", &version);
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver);
|
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "filename", &filen);
|
|
||||||
prop_dictionary_get_bool(obj, "preserve", &preserve);
|
|
||||||
/*
|
/*
|
||||||
* If dependency is already unpacked skip this phase.
|
* Update a package: execute pre-remove
|
||||||
|
* action if found before unpacking.
|
||||||
*/
|
*/
|
||||||
state = 0;
|
|
||||||
if (xbps_pkg_state_dictionary(obj, &state) != 0) {
|
|
||||||
rv = EINVAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (state == XBPS_PKG_STATE_UNPACKED)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (strcmp(tract, "update") == 0) {
|
|
||||||
/* Update a package, execute pre-remove action if found */
|
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_UPDATE,
|
RUN_TRANS_CB(XBPS_TRANS_STATE_UPDATE,
|
||||||
NULL, pkgver, filen, NULL);
|
NULL, pkgver, filen, NULL);
|
||||||
if ((rv = xbps_remove_pkg(pkgname, version, true)) != 0) {
|
rv = xbps_remove_pkg(pkgname, version, true);
|
||||||
|
if (rv != 0) {
|
||||||
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UPDATE,
|
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UPDATE,
|
||||||
pkgver, rv);
|
pkgver, rv);
|
||||||
goto out;
|
goto out;
|
||||||
@ -316,28 +270,31 @@ xbps_transaction_commit(prop_dictionary_t transd)
|
|||||||
/*
|
/*
|
||||||
* Unpack binary package.
|
* Unpack binary package.
|
||||||
*/
|
*/
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_UNPACK, NULL, pkgver, filen, NULL);
|
RUN_TRANS_CB(XBPS_TRANS_STATE_UNPACK, NULL,
|
||||||
|
pkgver, filen, NULL);
|
||||||
if ((rv = xbps_unpack_binary_pkg(obj)) != 0) {
|
if ((rv = xbps_unpack_binary_pkg(obj)) != 0) {
|
||||||
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UNPACK, pkgver, rv);
|
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UNPACK,
|
||||||
|
pkgver, rv);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Register binary package.
|
* Register package.
|
||||||
*/
|
*/
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_REGISTER,
|
RUN_TRANS_CB(XBPS_TRANS_STATE_REGISTER,
|
||||||
NULL, pkgver, filen, NULL);
|
NULL, pkgver, filen, NULL);
|
||||||
if ((rv = xbps_register_pkg(obj)) != 0) {
|
if ((rv = xbps_register_pkg(obj)) != 0) {
|
||||||
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_REGISTER, pkgver, rv);
|
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_REGISTER,
|
||||||
|
pkgver, rv);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
prop_object_iterator_reset(iter);
|
prop_object_iterator_reset(iter);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure all unpacked packages.
|
* Configure all unpacked packages.
|
||||||
*/
|
*/
|
||||||
RUN_TRANS_CB(XBPS_TRANS_STATE_CONFIGURE,
|
RUN_TRANS_CB(XBPS_TRANS_STATE_CONFIGURE,
|
||||||
"[*] Configuring packages installed/updated", NULL, NULL, NULL);
|
"[*] Configuring unpacked packages", NULL, NULL, NULL);
|
||||||
|
|
||||||
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
while ((obj = prop_object_iterator_next(iter)) != NULL) {
|
||||||
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
prop_dictionary_get_cstring_nocopy(obj, "transaction", &tract);
|
||||||
@ -350,9 +307,10 @@ xbps_transaction_commit(prop_dictionary_t transd)
|
|||||||
if (strcmp(tract, "update") == 0)
|
if (strcmp(tract, "update") == 0)
|
||||||
update = true;
|
update = true;
|
||||||
|
|
||||||
rv = xbps_configure_pkg(pkgname, version, false, update);
|
if ((rv = xbps_configure_pkg(pkgname, version,
|
||||||
if (rv != 0) {
|
false, update)) != 0) {
|
||||||
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_CONFIGURE, pkgver, rv);
|
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_CONFIGURE,
|
||||||
|
pkgver, rv);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user