Hello community, here is the log from the commit of package PackageKit for openSUSE:Factory checked in at 2019-10-30 14:38:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/PackageKit (Old) and /work/SRC/openSUSE:Factory/.PackageKit.new.2990 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "PackageKit" Wed Oct 30 14:38:49 2019 rev:193 rq:742520 version:1.1.12 Changes: -------- --- /work/SRC/openSUSE:Factory/PackageKit/PackageKit.changes 2019-10-17 13:05:56.880288924 +0200 +++ /work/SRC/openSUSE:Factory/.PackageKit.new.2990/PackageKit.changes 2019-10-30 14:38:52.765611618 +0100 @@ -1,0 +2,10 @@ +Tue Oct 22 00:45:02 UTC 2019 - Jonathan Kang <[email protected]> + +- Add PackageKit-zypp-reset-upgrade-mode-when-not-needed.patch: + zypp: Reset upgrade mode to FALSE when not needed + (gh#hughsie/PackageKit/commit/57e846f0). +- Add PackageKit-zypp-promt-installing-already-installed-packages.patch: + zypp: Promt users when installing already installed packages + (gh#hughsie/PackageKit/commit/c45e0f22). + +------------------------------------------------------------------- New: ---- PackageKit-zypp-promt-installing-already-installed-packages.patch PackageKit-zypp-reset-upgrade-mode-when-not-needed.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ PackageKit.spec ++++++ --- /var/tmp/diff_new_pack.oZgFmf/_old 2019-10-30 14:38:53.389612283 +0100 +++ /var/tmp/diff_new_pack.oZgFmf/_new 2019-10-30 14:38:53.393612287 +0100 @@ -12,7 +12,7 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # @@ -60,6 +60,10 @@ # PATCH-FIX-UPSTREAM PackageKit-zypp-dont-set-upgrade-mode-on-updating-specific-packages.patch gh#hughsie/PackageKit#345 [email protected] -- zypp: Don't set upgrade mode in update-packages Patch9: PackageKit-zypp-dont-set-upgrade-mode-on-updating-specific-packages.patch Patch10: zypp-perform-actions-disallowed-by-update-in-upgrade-mode.patch +# PATCH-FIX-UPSTREAM PackageKit-zypp-reset-upgrade-mode-when-not-needed.patch gh#hughsie/PackageKit/commit/57e846f0 [email protected] -- zypp: Reset upgrade mode to FALSE when not needed +Patch11: PackageKit-zypp-reset-upgrade-mode-when-not-needed.patch +# PATCH-FIX-UPSTREAM PackageKit-zypp-promt-installing-already-installed-packages.patch gh#hughsie/PackageKit/commit/c45e0f22 [email protected] -- zypp: Promt users when installing already installed packages +Patch12: PackageKit-zypp-promt-installing-already-installed-packages.patch BuildRequires: autoconf-archive BuildRequires: fdupes ++++++ PackageKit-zypp-promt-installing-already-installed-packages.patch ++++++ >From 3b120142433ab5fcee63199d2ee6f9cb415a4e69 Mon Sep 17 00:00:00 2001 From: Jonathan Kang <[email protected]> Date: Thu, 17 Oct 2019 14:31:29 +0800 Subject: [PATCH] zypp: Promt users when installing already installed packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, zypp backend doesn’t check if package of newer version or the same version has been already installed. It simply installs the package as long as that package does exist. Fix that by adding relation checks before installing a package and promt users accordingly. --- backends/zypp/pk-backend-zypp.cpp | 83 ++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp index 3a26c73a3..572c63e02 100644 --- a/backends/zypp/pk-backend-zypp.cpp +++ b/backends/zypp/pk-backend-zypp.cpp @@ -103,6 +103,11 @@ typedef enum { UPDATE } PerformType; +typedef enum { + NEWER_VERSION, + OLDER_VERSION, + EQUAL_VERSION +} VersionRelation; class ZyppJob { public: @@ -2727,7 +2732,7 @@ backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointer u PkBitfield transaction_flags = 0; gchar **package_ids; - + g_variant_get(params, "(t^a&s)", &transaction_flags, &package_ids); @@ -2745,18 +2750,24 @@ backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointer u pk_backend_job_set_status (job, PK_STATUS_ENUM_QUERY); pk_backend_job_set_percentage (job, 0); - + try { ResPool pool = zypp_build_pool (zypp, TRUE); PoolStatusSaver saver; pk_backend_job_set_percentage (job, 10); vector<PoolItem> items; - + VersionRelation relations[g_strv_length (package_ids)]; guint to_install = 0; + for (guint i = 0; package_ids[i]; i++) { MIL << package_ids[i] << endl; + g_auto(GStrv) split = NULL; + gint ret; sat::Solvable solvable = zypp_get_package_by_id (package_ids[i]); + sat::Solvable *inst_pkg = NULL; + sat::Solvable *latest_pkg = NULL; + vector<sat::Solvable> installed; if (zypp_is_no_solvable(solvable)) { // Previously stored package_id no longer matches any solvable. @@ -2764,15 +2775,75 @@ backend_install_packages_thread (PkBackendJob *job, GVariant *params, gpointer u "couldn't find package"); return; } - + + split = pk_package_id_split (package_ids[i]); + ui::Selectable::Ptr sel (ui::Selectable::get (ResKind::package, + split[PK_PACKAGE_ID_NAME])); + if (sel && !sel->installedEmpty ()) { + for_ (it, sel->installedBegin (), sel->installedEnd ()) { + if (it->satSolvable ().arch ().compare (Arch (split[PK_PACKAGE_ID_ARCH])) == 0) { + installed.push_back ((it->satSolvable ())); + } + } + } + + for (guint j = 0; j < installed.size (); j++) { + inst_pkg = &installed.at (j); + ret = inst_pkg->edition ().compare (Edition (split[PK_PACKAGE_ID_VERSION])); + + if (relations[i] == 0 && ret < 0) { + relations[i] = NEWER_VERSION; + } else if (relations[i] != EQUAL_VERSION && ret > 0) { + relations[i] = OLDER_VERSION; + if (!latest_pkg || + latest_pkg->edition ().compare (inst_pkg->edition ()) < 0) { + latest_pkg = inst_pkg; + } + } else if (ret == 0) { + relations[i] = EQUAL_VERSION; + break; + } + } + + if (relations[i] == EQUAL_VERSION && + !pk_bitfield_contain (transaction_flags, + PK_TRANSACTION_FLAG_ENUM_ALLOW_REINSTALL)) { + g_autofree gchar *printable_tmp = pk_package_id_to_printable (package_ids[i]); + pk_backend_job_error_code (job, + PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, + "%s is already installed", + printable_tmp); + return; + } + + if (relations[i] == OLDER_VERSION && + !pk_bitfield_contain (transaction_flags, + PK_TRANSACTION_FLAG_ENUM_ALLOW_DOWNGRADE)) { + pk_backend_job_error_code (job, + PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, + "higher version \"%s\" of package %s.%s is already installed", + latest_pkg->edition ().version ().c_str (), + split[PK_PACKAGE_ID_NAME], + split[PK_PACKAGE_ID_ARCH]); + return; + } + + if (relations[i] && relations[i] != EQUAL_VERSION && + pk_bitfield_contain (transaction_flags, + PK_TRANSACTION_FLAG_ENUM_JUST_REINSTALL)) { + pk_backend_job_error_code (job, + PK_ERROR_ENUM_NOT_AUTHORIZED, + "missing authorization to update or downgrade software"); + return; + } + to_install++; PoolItem item(solvable); // set status to ToBeInstalled item.status ().setToBeInstalled (ResStatus::USER); items.push_back (item); - } - + pk_backend_job_set_percentage (job, 40); if (!to_install) { -- 2.23.0 ++++++ PackageKit-zypp-reset-upgrade-mode-when-not-needed.patch ++++++ >From d9b4b4ab05a36612bf2771bbfc7e648d5534dc14 Mon Sep 17 00:00:00 2001 From: Jonathan Kang <[email protected]> Date: Wed, 16 Oct 2019 08:44:42 +0800 Subject: [PATCH] zypp: Reset upgrade mode to FALSE when not needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, after upgrade mode is set to TRUE, it’ll stay to be TRUE util PackageKit daemon quits(it’s configured to quit after idling for 15 seconds). This can lead to some unexpected error somehow. Fix that by spawning a timeout function after setting it to TRUE. We cannot direct reset it, because updates-packages relies upgrade mode in Tumbleweed to perform distribution upgrade. 1 second seems to be enough for update-packages to be called, and then we can cancel the timeout function and reset upgrade mode after all actions are done in update-packages. --- backends/zypp/pk-backend-zypp.cpp | 41 ++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) Index: PackageKit-1.1.12/backends/zypp/pk-backend-zypp.cpp =================================================================== --- PackageKit-1.1.12.orig/backends/zypp/pk-backend-zypp.cpp +++ PackageKit-1.1.12/backends/zypp/pk-backend-zypp.cpp @@ -154,6 +154,9 @@ guint _dl_count = 0; guint _dl_progress = 0; guint _dl_status = 0; +/* Timeout id for resetting upgrade mode. */ +static guint upgrade_mode_id = 0; + /** * Build a package_id from the specified resolvable. The returned * gchar * should be freed with g_free (). @@ -2409,6 +2412,18 @@ check_for_self_update (PkBackend *backen return FALSE; }*/ +static gboolean +reset_upgrade_mode (gpointer user_data) +{ + PkBackendJob *job = PK_BACKEND_JOB (user_data); + ZyppJob zjob (job); + ZYpp::Ptr zypp = zjob.get_zypp (); + + zypp->resolver ()->setUpgradeMode (FALSE); + + return G_SOURCE_REMOVE; +} + static void backend_get_updates_thread (PkBackendJob *job, GVariant *params, gpointer user_data) { @@ -2476,6 +2491,22 @@ backend_get_updates_thread (PkBackendJob } pk_backend_job_set_percentage (job, 100); + + /* We only want to set the upgrade mode to TRUE when we're + * getting available updates and updating the system in + * Tumbleweed. And we should reset it to FALSE after it's done + * so that it won't impact other actions which doesn't expect + * upgrade mode to be TRUE. + * + * For get-updates command, we can simply reset upgrade mode + * when it's done. But the issue is "pkcon update" calls + * get-updates to get a list of updates and them update those + * packages(upgrade mode should be kept TRUE in Tumbleweed). + * + * To fix that, we can spawn a timeout function to reset upgrade + * mode. We need cancel the timeout function in + * backend_update_packages_thread(). */ + upgrade_mode_id = g_timeout_add (1000, reset_upgrade_mode, job); } void @@ -3348,6 +3379,10 @@ backend_update_packages_thread (PkBacken ResPool pool = zypp_build_pool (zypp, TRUE); PkRestartEnum restart = PK_RESTART_ENUM_NONE; + if (upgrade_mode_id) { + g_source_remove (upgrade_mode_id); + } + if ( zypp->resolver()->upgradeMode() ) { zypp->resolver()->dupSetAllowVendorChange ( ZConfig::instance().solver_dupAllowVendorChange() ); } @@ -3393,6 +3428,11 @@ backend_update_packages_thread (PkBacken zypp_perform_execution (job, zypp, UPDATE, FALSE, transaction_flags); zypp->resolver()->setUpgradeMode(FALSE); + /* Don't reset upgrade mode if we're simulating the changes. Only reset + * it after the real actions has been done. */ + if (!pk_bitfield_contain (transaction_flags, PK_TRANSACTION_FLAG_ENUM_SIMULATE)) { + zypp->resolver()->setUpgradeMode(FALSE); + } } /**
