Skip to content
Snippets Groups Projects
database.c 51.7 KiB
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;
	}
	if (newpkg->installed_size != 0) {
		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);