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:
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user