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,102 +236,65 @@ 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); /*
} * Reconfigure pending package.
/* */
* Configure pending packages.
*/
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 a package.
/* */
* Install or update packages in transaction. if (strcmp(tract, "update") == 0)
*/ update = true;
RUN_TRANS_CB(XBPS_TRANS_STATE_INSTALL,
"[*] Unpacking packages to be installed/updated", NULL, NULL, NULL);
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 */ * Update a package: execute pre-remove
if ((strcmp(tract, "remove") == 0) || * action if found before unpacking.
(strcmp(tract, "configure") == 0)) */
continue; RUN_TRANS_CB(XBPS_TRANS_STATE_UPDATE,
NULL, pkgver, filen, NULL);
preserve = false; rv = xbps_remove_pkg(pkgname, version, true);
prop_dictionary_get_cstring_nocopy(obj, "pkgname", &pkgname); if (rv != 0) {
prop_dictionary_get_cstring_nocopy(obj, "version", &version); RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UPDATE,
prop_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); pkgver, rv);
prop_dictionary_get_cstring_nocopy(obj, "filename", &filen); goto out;
prop_dictionary_get_bool(obj, "preserve", &preserve); }
/* }
* If dependency is already unpacked skip this phase. /*
*/ * Unpack binary package.
state = 0; */
if (xbps_pkg_state_dictionary(obj, &state) != 0) { RUN_TRANS_CB(XBPS_TRANS_STATE_UNPACK, NULL,
rv = EINVAL; pkgver, filen, NULL);
goto out; if ((rv = xbps_unpack_binary_pkg(obj)) != 0) {
} RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UNPACK,
if (state == XBPS_PKG_STATE_UNPACKED) pkgver, rv);
continue; goto out;
}
if (strcmp(tract, "update") == 0) { /*
/* Update a package, execute pre-remove action if found */ * Register package.
RUN_TRANS_CB(XBPS_TRANS_STATE_UPDATE, */
RUN_TRANS_CB(XBPS_TRANS_STATE_REGISTER,
NULL, pkgver, filen, NULL); NULL, pkgver, filen, NULL);
if ((rv = xbps_remove_pkg(pkgname, version, true)) != 0) { if ((rv = xbps_register_pkg(obj)) != 0) {
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UPDATE, RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_REGISTER,
pkgver, rv); pkgver, rv);
goto out; goto out;
} }
} }
/*
* Unpack binary package.
*/
RUN_TRANS_CB(XBPS_TRANS_STATE_UNPACK, NULL, pkgver, filen, NULL);
if ((rv = xbps_unpack_binary_pkg(obj)) != 0) {
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_UNPACK, pkgver, rv);
goto out;
}
/*
* Register binary package.
*/
RUN_TRANS_CB(XBPS_TRANS_STATE_REGISTER,
NULL, pkgver, filen, NULL);
if ((rv = xbps_register_pkg(obj)) != 0) {
RUN_TRANS_ERR_CB(XBPS_TRANS_STATE_REGISTER, pkgver, rv);
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;
} }
} }