diff -r 0121592e2512 -r bbddb595e366 plover-gtk/transactionhelper.c --- a/plover-gtk/transactionhelper.c Thu Jul 16 19:54:45 2020 +0100 +++ b/plover-gtk/transactionhelper.c Mon Aug 31 07:12:39 2020 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014, 2016, 2018 J. Ali Harlow + * Copyright (C) 2014, 2016, 2018, 2020 J. Ali Harlow * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -903,7 +903,7 @@ { /* * If there are no reportable packages tasked for action there - * shouldn't by any packages at all, but let's be paranoid. + * shouldn't be any packages at all, but let's be paranoid. */ other_packages=FALSE; razor_install_iterator_rewind(ii); @@ -915,7 +915,9 @@ action=PLOVER_TRANSACTION_HELPER_REPORT_REMOVE; else continue; - if (action==report_action) + if (action==report_action || + razor_action==RAZOR_INSTALL_ACTION_ADD && + report_action==PLOVER_TRANSACTION_HELPER_REPORT_UPDATE) { razor_package_get_details(report_set,package,RAZOR_DETAIL_NAME, &name,RAZOR_DETAIL_LAST); @@ -1165,6 +1167,114 @@ } /* + * Returns TRUE if there is work to be done or FALSE if the group is + * empty or on error. + * + * The default action is to: + * - install (and update all) if any of the packages in @group are + * missing or out of date, + * - otherwise update all if any packages are out of date, + * - otherwise remove ALL packages for distribution-local comps, + * - otherwise remove all packages in @group, their dependants and leaves. + */ +gboolean plover_transaction_helper_default_action_on_group( + PloverTransactionHelper *helper,const char *group,GError **error) +{ + gboolean distribution_local=FALSE,retval; + GError *tmp_err=NULL; + struct comps *comps; + struct plover_vector *selected_packages; + PloverTransaction *transaction; + g_return_val_if_fail(PLOVER_IS_TRANSACTION_HELPER(helper),FALSE); + selected_packages=plover_transaction_helper_group_get_default_packages( + helper,group,error); + if (!selected_packages) + return FALSE; + if (!selected_packages->len) + { + g_set_error(error,PLOVER_GENERAL_ERROR, + PLOVER_GENERAL_ERROR_FAILED,"%s: no default packages",group); + plover_vector_free(selected_packages); + return FALSE; + } + comps=plover_transaction_helper_get_comps(helper,NULL); + if (comps && comps->database==COMPS_DATABASE_DISTRIBUTION_LOCAL) + distribution_local=TRUE; + transaction=plover_transaction_helper_new_transaction(helper,error); + if (!transaction) + { + plover_vector_free(selected_packages); + return FALSE; + } + if (!plover_transaction_install_with_update_all(transaction, + selected_packages->strings,error)) + { + g_object_unref(transaction); + plover_vector_free(selected_packages); + return FALSE; + } + retval=plover_transaction_helper_add_transaction(helper,transaction, + selected_packages,PLOVER_TRANSACTION_HELPER_REPORT_INSTALL,&tmp_err); + g_object_unref(transaction); + if (!retval) + { + if (!g_error_matches(tmp_err,PLOVER_GENERAL_ERROR, + PLOVER_GENERAL_ERROR_NO_WORK)) + { + g_propagate_error(error,tmp_err); + plover_vector_free(selected_packages); + return FALSE; + } + g_clear_error(&tmp_err); + transaction=plover_transaction_helper_new_transaction(helper,error); + if (!transaction) + { + plover_vector_free(selected_packages); + return FALSE; + } + if (!plover_transaction_update(transaction,NULL,error)) + { + g_object_unref(transaction); + plover_vector_free(selected_packages); + return FALSE; + } + retval=plover_transaction_helper_add_transaction(helper,transaction, + selected_packages,PLOVER_TRANSACTION_HELPER_REPORT_UPDATE,&tmp_err); + g_object_unref(transaction); + if (!retval) + { + if (!g_error_matches(tmp_err,PLOVER_GENERAL_ERROR, + PLOVER_GENERAL_ERROR_NO_WORK)) + { + g_propagate_error(error,tmp_err); + plover_vector_free(selected_packages); + return FALSE; + } + g_clear_error(&tmp_err); + transaction=plover_transaction_helper_new_transaction(helper,error); + if (!transaction) + { + plover_vector_free(selected_packages); + return FALSE; + } + if (!plover_transaction_remove_with_dependants_and_leaves( + transaction,distribution_local?NULL:selected_packages->strings, + error)) + { + g_object_unref(transaction); + plover_vector_free(selected_packages); + return FALSE; + } + retval=plover_transaction_helper_add_transaction(helper,transaction, + NULL,PLOVER_TRANSACTION_HELPER_REPORT_REMOVE,error); + g_object_unref(transaction); + } + } + plover_vector_free(selected_packages); + return retval; +} + +/* * Returns TRUE if there is work to be done or FALSE if all updates have * already been applied or on error. */