Hello community,

here is the log from the commit of package PackageKit for openSUSE:Factory 
checked in at 2017-03-22 22:59:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/PackageKit (Old)
 and      /work/SRC/openSUSE:Factory/.PackageKit.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "PackageKit"

Wed Mar 22 22:59:20 2017 rev:158 rq:461114 version:1.1.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/PackageKit/PackageKit.changes    2017-01-25 
22:36:28.711310559 +0100
+++ /work/SRC/openSUSE:Factory/.PackageKit.new/PackageKit.changes       
2017-03-22 22:59:22.236549509 +0100
@@ -1,0 +2,7 @@
+Mon Feb 13 02:47:07 UTC 2017 - sck...@suse.com
+
+- Add PackageKit-zypp-backend-improve-refresh-cache.patch: Improve
+  zypp_refresh_cache in zypp backend to make PK works better with
+  zypper (bsc#899755).
+
+-------------------------------------------------------------------

New:
----
  PackageKit-zypp-backend-improve-refresh-cache.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ PackageKit.spec ++++++
--- /var/tmp/diff_new_pack.xRONO4/_old  2017-03-22 22:59:23.160418540 +0100
+++ /var/tmp/diff_new_pack.xRONO4/_new  2017-03-22 22:59:23.164417973 +0100
@@ -32,6 +32,8 @@
 Source99:       PackageKit.keyring
 # PATCH-FIX-UPSTREAM PackageKit-avoid-endless-loop-on-autoupdate.patch 
zai...@opensuse.org -- Avoid a endless loop on autoupdates.
 Patch0:         PackageKit-avoid-endless-loop-on-autoupdate.patch
+# PATCH-FIX-OPENSUSE PackageKit-zypp-backend-improve-refresh-cache.patch 
bsc#899755 sck...@suse.com -- Improve refresh-cache function in zypp backend.
+Patch1:         PackageKit-zypp-backend-improve-refresh-cache.patch
 BuildRequires:  NetworkManager-devel
 BuildRequires:  automake
 BuildRequires:  fdupes
@@ -218,6 +220,7 @@
 %prep
 %setup -q
 %patch0 -p1
+%patch1 -p1
 %if !0%{?is_opensuse}
 translation-update-upstream
 %endif


++++++ PackageKit-zypp-backend-improve-refresh-cache.patch ++++++
Index: PackageKit-1.1.4/backends/zypp/pk-backend-zypp.cpp
===================================================================
--- PackageKit-1.1.4.orig/backends/zypp/pk-backend-zypp.cpp
+++ PackageKit-1.1.4/backends/zypp/pk-backend-zypp.cpp
@@ -986,20 +986,27 @@ static gboolean
 zypp_refresh_meta_and_cache (RepoManager &manager, RepoInfo &repo, bool force 
= false)
 {
        try {
-               if (manager.checkIfToRefreshMetadata (repo, repo.url())    
//RepoManager::RefreshIfNeededIgnoreDelay)
-                   != RepoManager::REFRESH_NEEDED)
-                       return TRUE;
-
                sat::Pool pool = sat::Pool::instance ();
-               // Erase old solv file
-               pool.reposErase (repo.alias ());
+
                manager.refreshMetadata (repo, force ?
                                         RepoManager::RefreshForced :
                                         
RepoManager::RefreshIfNeededIgnoreDelay);
                manager.buildCache (repo, force ?
                                    RepoManager::BuildForced :
                                    RepoManager::BuildIfNeeded);
-               manager.loadFromCache (repo);
+               try
+               {
+                       manager.loadFromCache (repo);
+               }
+               catch (const Exception &exp)
+               {
+                       // cachefile has old fomat (or is corrupted): rebuild it
+                       manager.cleanCache (repo);
+                       manager.buildCache (repo, force ?
+                                           RepoManager::BuildForced :
+                                           RepoManager::BuildIfNeeded);
+                       manager.loadFromCache (repo);
+               }
                return TRUE;
        } catch (const AbortTransactionException &ex) {
                return FALSE;
@@ -1580,9 +1587,44 @@ zypp_refresh_cache (PkBackendJob *job, Z
        if (zypp == NULL)
                return  FALSE;
        filesystem::Pathname pathname("/");
-       // This call is needed to refresh system rpmdb status while refresh 
cache
-       zypp->finishTarget ();
-       zypp->initializeTarget (pathname);
+
+       bool poolIsClean = sat::Pool::instance ().reposEmpty ();
+       // Erase and reload all if pool is too holey (densyity [100: good | 0 
bad])
+       // NOTE sat::Pool::capacity() > 2 is asserted in division
+       if (!poolIsClean &&
+           sat::Pool::instance ().solvablesSize () * 100 / sat::Pool::instance 
().capacity () < 33)
+       {
+               sat::Pool::instance ().reposEraseAll ();
+               poolIsClean = true;
+       }
+
+       Target_Ptr target = zypp->getTarget ();
+       if (!target)
+       {
+               zypp->initializeTarget (pathname);      // initial target
+               target = zypp->getTarget ();
+       }
+       else
+       {
+               // interim storage to avoid delete while iterating
+               std::set<std::string> idsToDelete;
+               const std::set<Edition> &rpmdbKeys (zypp->target ()->rpmDb 
().pubkeyEditions ());
+
+               // load rpmdb trusted keys into zypp keyring
+               target->rpmDb ().exportTrustedKeysInZyppKeyRing ();
+
+               // keys no longer stored in the rpmdb need to be removed from 
the zypp keyring!
+               for (const PublicKeyData &el : zypp->keyRing 
()->trustedPublicKeyData ())
+               {
+                       if(!rpmdbKeys.count (Edition(el.gpgPubkeyVersion (), 
el.gpgPubkeyRelease ())))
+                               idsToDelete.insert (el.id ());
+               }
+
+               for (const std::string & idToDelete : idsToDelete)
+               zypp->keyRing ()->deleteKey (idToDelete, true);
+       }
+       // load installed packages to pool
+       target->load ();
 
        pk_backend_job_set_status (job, PK_STATUS_ENUM_REFRESH_CACHE);
        pk_backend_job_set_percentage (job, 0);
@@ -1600,6 +1642,22 @@ zypp_refresh_cache (PkBackendJob *job, Z
                return FALSE;
        }
 
+       if (!poolIsClean)
+       {
+               std::vector<std::string> aliasesToRemove;
+
+               for (const Repository &poolrepo : zypp->pool 
().knownRepositories ())
+               {
+                       if (!(poolrepo.isSystemRepo () || manager.hasRepo 
(poolrepo.alias ())))
+                               aliasesToRemove.push_back (poolrepo.alias ());
+               }
+
+               for (const std::string &aliasToRemove : aliasesToRemove)
+               {
+                       sat::Pool::instance ().reposErase (aliasToRemove);
+               }
+       }
+
        int i = 1;
        int num_of_repos = repos.size ();
        gchar *repo_messages = NULL;
@@ -1614,7 +1672,11 @@ zypp_refresh_cache (PkBackendJob *job, Z
 
                // skip disabled repos
                if (repo.enabled () == false)
+               {
+                       if (!poolIsClean)
+                               sat::Pool::instance ().reposErase (repo.alias 
());
                        continue;
+               }
 
                // do as zypper does
                if (!force && !repo.autorefresh())
@@ -1623,7 +1685,11 @@ zypp_refresh_cache (PkBackendJob *job, Z
                // skip changeable media (DVDs and CDs).  Without doing this,
                // the disc would be required to be physically present.
                if (repo.baseUrlsBegin ()->schemeIsVolatile())
+               {
+                       if (!poolIsClean)
+                               sat::Pool::instance ().reposErase (repo.alias 
());
                        continue;
+               }
 
                try {
                        // Refreshing metadata


Reply via email to