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);
+   }
 }
 
 /**


Reply via email to