libxbps: simplify xbps_transaction_commit().

This commit is contained in:
Juan RP 2011-10-19 16:25:49 +02:00
parent bda1feb396
commit a80df68b15

View File

@ -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;
} }
} }