Newer
Older
apk_progress_cb cb, void *cb_ctx)
{
char *script_args[] = { NULL, NULL, NULL };
struct apk_installed_package *ipkg;
/* Upgrade script gets two args: <new-pkg> <old-pkg> */
if (oldpkg != NULL && newpkg != NULL) {
script_args[0] = newpkg->version;
script_args[1] = oldpkg->version;
} else {
script_args[0] = oldpkg ? oldpkg->version : newpkg->version;
}
/* Just purging? */
if (oldpkg != NULL && newpkg == NULL) {
ipkg = oldpkg->ipkg;
if (ipkg == NULL)
return 0;
r = apk_ipkg_run_script(ipkg, db->root_fd,
APK_SCRIPT_PRE_DEINSTALL, script_args);
apk_db_purge_pkg(db, ipkg, NULL);
r = apk_ipkg_run_script(ipkg, db->root_fd,
APK_SCRIPT_POST_DEINSTALL, script_args);
apk_pkg_uninstall(db, oldpkg);
return r;
}
/* Install the new stuff */
ipkg = apk_pkg_install(db, newpkg);
ipkg->flags |= APK_IPKGF_RUN_ALL_TRIGGERS;
if (ipkg->triggers) {
list_del(&ipkg->trigger_pkgs_list);
free(ipkg->triggers);
ipkg->triggers = NULL;
}
r = apk_db_unpack_pkg(db, ipkg, (oldpkg != NULL),
(oldpkg == newpkg), cb, cb_ctx,
script_args);
if (r != 0) {
apk_pkg_uninstall(db, newpkg);
if (oldpkg != NULL && oldpkg != newpkg && oldpkg->ipkg != NULL) {
apk_db_purge_pkg(db, oldpkg->ipkg, NULL);
apk_pkg_uninstall(db, oldpkg);
}
r = apk_ipkg_run_script(ipkg, db->root_fd,
(oldpkg == NULL) ?
APK_SCRIPT_POST_INSTALL : APK_SCRIPT_POST_UPGRADE,
script_args);
apk_error("%s-%s: Failed to execute post-install/upgrade script",
newpkg->name->name, newpkg->version);
return r;
}