/** * backend_remove_packages: */ static void backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove) { guint i; guint len; gchar *pi; int ret; slapt_pkg_list_t *installed; slapt_pkg_list_t *available; slapt_transaction_t *transaction; slapt_pkg_info_t *pkg; /* FIXME: support only_trusted */ pk_backend_set_status (backend, PK_STATUS_ENUM_REMOVE); pk_backend_set_percentage (backend, 0); installed = slapt_get_installed_pkgs(); available = slapt_get_available_pkgs(); transaction = slapt_init_transaction(); len = g_strv_length (package_ids); for (i=0; i<len; i++) { pi = package_ids[i]; if (pi == NULL) { pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id"); pk_backend_finished (backend); return; } pkg = _get_pkg_from_id(pi, installed, NULL); if (pkg == NULL) { pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "package not found"); continue; } if (!pkg->installed) { char *pkgname = slapt_stringify_pkg(pkg); pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, "package %s not installed", pkgname); free(pkgname); continue; } slapt_add_remove_to_transaction(transaction, pkg); } ret = slapt_handle_transaction(_config, transaction); if (ret != 0) { pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "remove failed"); } slapt_free_transaction(transaction); slapt_free_pkg_list(available); slapt_free_pkg_list(installed); pk_backend_set_percentage (backend, 100); pk_backend_finished (backend); }
/** * backend_update_packages: */ static void backend_update_packages (PkBackend *backend, gboolean only_trusted, gchar **package_ids) { guint i; guint len; const gchar *package_id; int ret; slapt_pkg_list_t *installed; slapt_pkg_list_t *available; const gchar *search; slapt_pkg_list_t *results = NULL; slapt_transaction_t *transaction; slapt_pkg_info_t *pkg; slapt_pkg_info_t *oldpkg; /* FIXME: support only_trusted */ pk_backend_set_status (backend, PK_STATUS_ENUM_UPDATE); pk_backend_set_percentage (backend, 0); installed = slapt_get_installed_pkgs(); available = slapt_get_available_pkgs(); transaction = slapt_init_transaction(); len = g_strv_length (package_ids); for (i=0; i<len; i++) { package_id = package_ids[i]; pkg = _get_pkg_from_string(package_id, available, installed); if (pkg == NULL) { pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "package not found"); continue; } oldpkg = NULL; search = g_strdup_printf("^%s$", pkg->name); results = slapt_search_pkg_list(installed, search); g_free((gpointer) search); if (results->pkg_count > 0) { oldpkg = results->pkgs[0]; } else { continue; } slapt_add_upgrade_to_transaction(transaction, oldpkg, pkg); } ret = slapt_handle_transaction(_config, transaction); if (ret != 0) { pk_backend_error_code (backend, PK_ERROR_ENUM_TRANSACTION_ERROR, "install failed"); } slapt_free_transaction(transaction); slapt_free_pkg_list(available); slapt_free_pkg_list(installed); pk_backend_set_percentage (backend, 100); pk_backend_finished (backend); }
slapt_transaction_t *slapt_remove_from_transaction(slapt_transaction_t *tran, slapt_pkg_info_t *pkg) { unsigned int i; slapt_transaction_t *new_tran = NULL; if (slapt_search_transaction_by_pkg(tran,pkg) == 0) return tran; /* since this is a pointer, slapt_malloc before calling init */ new_tran = slapt_malloc(sizeof *new_tran); new_tran->install_pkgs = slapt_malloc(sizeof *new_tran->install_pkgs); new_tran->remove_pkgs = slapt_malloc(sizeof *new_tran->remove_pkgs); new_tran->upgrade_pkgs = slapt_malloc(sizeof *new_tran->upgrade_pkgs); new_tran->exclude_pkgs = slapt_malloc(sizeof *new_tran->exclude_pkgs); new_tran = slapt_init_transaction(); for (i = 0;i < tran->install_pkgs->pkg_count; ++i) { slapt_pkg_info_t *p = tran->install_pkgs->pkgs[i]; if ( strcmp(pkg->name,p->name) == 0 && strcmp(pkg->version,p->version) == 0 && strcmp(pkg->location,p->location) == 0 ) { continue; } slapt_add_install_to_transaction(new_tran,p); } for (i = 0;i < tran->remove_pkgs->pkg_count; ++i) { slapt_pkg_info_t *p = tran->remove_pkgs->pkgs[i]; if ( strcmp(pkg->name,p->name) == 0 && strcmp(pkg->version,p->version) == 0 && strcmp(pkg->location,p->location) == 0 ) { continue; } slapt_add_remove_to_transaction(new_tran,tran->remove_pkgs->pkgs[i]); } for (i = 0;i < tran->upgrade_pkgs->pkg_count; ++i) { slapt_pkg_info_t *u = tran->upgrade_pkgs->pkgs[i]->upgrade; slapt_pkg_info_t *p = tran->upgrade_pkgs->pkgs[i]->installed; if ( strcmp(pkg->name,u->name) == 0 && strcmp(pkg->version,u->version) == 0 && strcmp(pkg->location,u->location) == 0 ) { continue; } slapt_add_upgrade_to_transaction(new_tran, p, u); } for (i = 0; i < tran->exclude_pkgs->pkg_count; ++i) { slapt_pkg_info_t *p = tran->exclude_pkgs->pkgs[i]; if ( strcmp(pkg->name,p->name) == 0 && strcmp(pkg->version,p->version) == 0 && strcmp(pkg->location,p->location) == 0 ) { continue; } slapt_add_exclude_to_transaction(new_tran,p); } return new_tran; }