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