From 81a828b660cf54ac1adeb9c4a5f12fa9cd496ecf Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 29 Sep 2013 13:14:07 +0200 Subject: [PATCH] BPackageManager: Auto-refresh if repository cache is missing This makes the initial "pkgman refresh" superfluous, that was necessary for "install"/"search" to work. --- .../private/package/manager/PackageManager.h | 6 ++-- src/kits/package/manager/PackageManager.cpp | 33 ++++++++++--------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/headers/private/package/manager/PackageManager.h b/headers/private/package/manager/PackageManager.h index e37a29bed1..9844ec4113 100644 --- a/headers/private/package/manager/PackageManager.h +++ b/headers/private/package/manager/PackageManager.h @@ -115,9 +115,9 @@ private: InstalledRepository* repository); void _AddRemoteRepository(BPackageRoster& roster, const char* name, bool refresh); - status_t _GetRepositoryConfig(BPackageRoster& roster, - const char* name, bool refresh, - BRepositoryConfig& _config); + status_t _GetRepositoryCache(BPackageRoster& roster, + const BRepositoryConfig& config, + bool refresh, BRepositoryCache& _cache); bool _NextSpecificInstallationLocation(); diff --git a/src/kits/package/manager/PackageManager.cpp b/src/kits/package/manager/PackageManager.cpp index b61cc4297c..b7ce89632b 100644 --- a/src/kits/package/manager/PackageManager.cpp +++ b/src/kits/package/manager/PackageManager.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -637,46 +638,46 @@ BPackageManager::_AddRemoteRepository(BPackageRoster& roster, const char* name, bool refresh) { BRepositoryConfig config; - status_t error = _GetRepositoryConfig(roster, name, refresh, config); + status_t error = roster.GetRepositoryConfig(name, &config); if (error != B_OK) { fUserInteractionHandler->Warn(error, "failed to get config for repository \"%s\". Skipping.", name); return; } + BRepositoryCache cache; + error = _GetRepositoryCache(roster, config, refresh, cache); + if (error != B_OK) { + fUserInteractionHandler->Warn(error, + "failed to get cache for repository \"%s\". Skipping.", name); + return; + } + RemoteRepository* repository = new RemoteRepository(config); if (!fOtherRepositories.AddItem(repository)) { delete repository; throw std::bad_alloc(); } - BRepositoryBuilder(*repository, repository->Config()) + BRepositoryBuilder(*repository, cache, config.Name()) .AddToSolver(fSolver, false); } status_t -BPackageManager::_GetRepositoryConfig(BPackageRoster& roster, const char* name, - bool refresh, BRepositoryConfig& _config) +BPackageManager::_GetRepositoryCache(BPackageRoster& roster, + const BRepositoryConfig& config, bool refresh, BRepositoryCache& _cache) { - // get the repository config - status_t error = roster.GetRepositoryConfig(name, &_config); - if (error != B_OK) - return error; - - // refresh - if (!refresh) + if (!refresh && roster.GetRepositoryCache(config.Name(), &_cache) == B_OK) return B_OK; - error = fRequestHandler->RefreshRepository(_config); + status_t error = fRequestHandler->RefreshRepository(config); if (error != B_OK) { fUserInteractionHandler->Warn(error, - "refreshing repository \"%s\" failed", name); - return B_OK; + "refreshing repository \"%s\" failed", config.Name().String()); } - // re-get the config - return roster.GetRepositoryConfig(name, &_config); + return roster.GetRepositoryCache(config.Name(), &_cache); }