BPackageManager: Auto-refresh if repository cache is missing

This makes the initial "pkgman refresh" superfluous, that was necessary
for "install"/"search" to work.
This commit is contained in:
Ingo Weinhold
2013-09-29 13:14:43 +02:00
parent b5a871b1bf
commit 81a828b660
2 changed files with 20 additions and 19 deletions
@@ -115,9 +115,9 @@ private:
InstalledRepository* repository); InstalledRepository* repository);
void _AddRemoteRepository(BPackageRoster& roster, void _AddRemoteRepository(BPackageRoster& roster,
const char* name, bool refresh); const char* name, bool refresh);
status_t _GetRepositoryConfig(BPackageRoster& roster, status_t _GetRepositoryCache(BPackageRoster& roster,
const char* name, bool refresh, const BRepositoryConfig& config,
BRepositoryConfig& _config); bool refresh, BRepositoryCache& _cache);
bool _NextSpecificInstallationLocation(); bool _NextSpecificInstallationLocation();
+17 -16
View File
@@ -11,6 +11,7 @@
#include <Directory.h> #include <Directory.h>
#include <package/PackageRoster.h> #include <package/PackageRoster.h>
#include <package/RepositoryCache.h>
#include <package/solver/SolverPackage.h> #include <package/solver/SolverPackage.h>
#include <package/solver/SolverPackageSpecifier.h> #include <package/solver/SolverPackageSpecifier.h>
#include <package/solver/SolverPackageSpecifierList.h> #include <package/solver/SolverPackageSpecifierList.h>
@@ -637,46 +638,46 @@ BPackageManager::_AddRemoteRepository(BPackageRoster& roster, const char* name,
bool refresh) bool refresh)
{ {
BRepositoryConfig config; BRepositoryConfig config;
status_t error = _GetRepositoryConfig(roster, name, refresh, config); status_t error = roster.GetRepositoryConfig(name, &config);
if (error != B_OK) { if (error != B_OK) {
fUserInteractionHandler->Warn(error, fUserInteractionHandler->Warn(error,
"failed to get config for repository \"%s\". Skipping.", name); "failed to get config for repository \"%s\". Skipping.", name);
return; 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); RemoteRepository* repository = new RemoteRepository(config);
if (!fOtherRepositories.AddItem(repository)) { if (!fOtherRepositories.AddItem(repository)) {
delete repository; delete repository;
throw std::bad_alloc(); throw std::bad_alloc();
} }
BRepositoryBuilder(*repository, repository->Config()) BRepositoryBuilder(*repository, cache, config.Name())
.AddToSolver(fSolver, false); .AddToSolver(fSolver, false);
} }
status_t status_t
BPackageManager::_GetRepositoryConfig(BPackageRoster& roster, const char* name, BPackageManager::_GetRepositoryCache(BPackageRoster& roster,
bool refresh, BRepositoryConfig& _config) const BRepositoryConfig& config, bool refresh, BRepositoryCache& _cache)
{ {
// get the repository config if (!refresh && roster.GetRepositoryCache(config.Name(), &_cache) == B_OK)
status_t error = roster.GetRepositoryConfig(name, &_config);
if (error != B_OK)
return error;
// refresh
if (!refresh)
return B_OK; return B_OK;
error = fRequestHandler->RefreshRepository(_config); status_t error = fRequestHandler->RefreshRepository(config);
if (error != B_OK) { if (error != B_OK) {
fUserInteractionHandler->Warn(error, fUserInteractionHandler->Warn(error,
"refreshing repository \"%s\" failed", name); "refreshing repository \"%s\" failed", config.Name().String());
return B_OK;
} }
// re-get the config return roster.GetRepositoryCache(config.Name(), &_cache);
return roster.GetRepositoryConfig(name, &_config);
} }