keep sync dbs in order
This commit is contained in:
parent
860b9ff865
commit
8f9d03baea
|
@ -109,8 +109,8 @@ const AlpmPackage *Manager::packageFromDatabase(const QString &dbName, const QSt
|
|||
*/
|
||||
AlpmPackage *Manager::packageFromSyncDatabases(const QString &pkgName)
|
||||
{
|
||||
for(const auto &dbEntry : syncDatabases()) {
|
||||
if(auto *pkg = dbEntry.second->packageByName(pkgName)) {
|
||||
for(const auto &dbEntry : m_syncDbs) {
|
||||
if(auto *pkg = dbEntry->packageByName(pkgName)) {
|
||||
return static_cast<AlpmPackage *>(pkg);
|
||||
}
|
||||
}
|
||||
|
@ -122,8 +122,8 @@ AlpmPackage *Manager::packageFromSyncDatabases(const QString &pkgName)
|
|||
*/
|
||||
const AlpmPackage *Manager::packageFromSyncDatabases(const QString &pkgName) const
|
||||
{
|
||||
for(const auto &dbEntry : syncDatabases()) {
|
||||
if(const auto *pkg = dbEntry.second->packageByName(pkgName)) {
|
||||
for(const auto &dbEntry : m_syncDbs) {
|
||||
if(const auto *pkg = dbEntry->packageByName(pkgName)) {
|
||||
return static_cast<const AlpmPackage *>(pkg);
|
||||
}
|
||||
}
|
||||
|
@ -151,9 +151,9 @@ unique_ptr<AlpmOwnershipPackage> Manager::packageFromFile(const char *fileName,
|
|||
*/
|
||||
Package *Manager::packageProviding(const Dependency &dependency)
|
||||
{
|
||||
for(auto &dbEntry : syncDatabases()) {
|
||||
QReadLocker locker(dbEntry.second->lock());
|
||||
if(auto *pkg = dbEntry.second->packageProviding(dependency)) {
|
||||
for(auto &dbEntry : m_syncDbs) {
|
||||
QReadLocker locker(dbEntry->lock());
|
||||
if(auto *pkg = dbEntry->packageProviding(dependency)) {
|
||||
return pkg;
|
||||
}
|
||||
}
|
||||
|
@ -166,9 +166,9 @@ Package *Manager::packageProviding(const Dependency &dependency)
|
|||
*/
|
||||
const Package *Manager::packageProviding(const Dependency &dependency) const
|
||||
{
|
||||
for(const auto &dbEntry : syncDatabases()) {
|
||||
QReadLocker locker(dbEntry.second->lock());
|
||||
if(const auto *pkg = dbEntry.second->packageProviding(dependency)) {
|
||||
for(const auto &dbEntry : m_syncDbs) {
|
||||
QReadLocker locker(dbEntry->lock());
|
||||
if(const auto *pkg = dbEntry->packageProviding(dependency)) {
|
||||
return pkg;
|
||||
}
|
||||
}
|
||||
|
@ -331,7 +331,7 @@ void Manager::registerDataBasesFromPacmanConfig()
|
|||
cerr << shchar << "Error: Unable to add database from pacman config: The database name mustn't be \"local\" because this name is reserved for the local database." << endl;
|
||||
} else if(dbName.startsWith(QLatin1String("aur"), Qt::CaseInsensitive)) {
|
||||
cerr << shchar << "Error: Unable to add database from pacman config: The database name mustn't start with \"aur\" because this name is reserved for the Arch Linux User Repository." << endl;
|
||||
} else if(m_syncDbs.count(dbName)) {
|
||||
} else if(m_syncDbMap.count(dbName)) {
|
||||
cerr << shchar << "Error: Unable to add database from pacman config: Database names must be unique. Ignoring second occurance of database \"" << scope.first << "\"." << endl;
|
||||
} else {
|
||||
// read sig level and usage
|
||||
|
@ -393,10 +393,11 @@ void Manager::registerDataBasesFromPacmanConfig()
|
|||
}
|
||||
}
|
||||
// add sync db to internal map (use as index size + 1 because the local database has index 0)
|
||||
auto emplaced = m_syncDbs.emplace(dbName, make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
|
||||
m_syncDbs.emplace_back(make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
|
||||
auto emplaced = m_syncDbMap.emplace(dbName, m_syncDbs.back().get());
|
||||
if(usage & ALPM_DB_USAGE_UPGRADE) {
|
||||
// -> db is used to upgrade local database
|
||||
localDataBase()->upgradeSources() << emplaced.first->second.get();
|
||||
localDataBase()->upgradeSources() << emplaced.first->second;
|
||||
}
|
||||
} else {
|
||||
cerr << shchar << "Error: Unable to add sync database [" << scope.first << ']' << endl;
|
||||
|
@ -418,7 +419,7 @@ void Manager::registerDatabasesFromRepoIndexConfig()
|
|||
for(const RepoEntry &repoEntry : m_config.repoEntries()) {
|
||||
AlpmDatabase *syncDb = nullptr;
|
||||
try {
|
||||
syncDb = m_syncDbs.at(repoEntry.name()).get();
|
||||
syncDb = m_syncDbMap.at(repoEntry.name());
|
||||
cerr << shchar << "Applying config for database [" << syncDb->name() << ']' << endl;
|
||||
if(!repoEntry.dataBasePath().isEmpty()) {
|
||||
cerr << shchar << "Warning: Can't use data base path specified in repo index config because the repo \""
|
||||
|
@ -438,9 +439,10 @@ void Manager::registerDatabasesFromRepoIndexConfig()
|
|||
} else {
|
||||
// TODO: database path
|
||||
auto *db = alpm_register_syncdb(m_handle, repoEntry.name().toLocal8Bit().data(), static_cast<alpm_siglevel_t>(repoEntry.sigLevel()));
|
||||
auto emplaced = m_syncDbs.emplace(repoEntry.name(), make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
|
||||
m_syncDbs.emplace_back(make_unique<AlpmDatabase>(db, m_config.alpmDbPath(), m_syncDbs.size() + 1));
|
||||
auto emplaced = m_syncDbMap.emplace(repoEntry.name(), m_syncDbs.back().get());
|
||||
if(emplaced.second) {
|
||||
syncDb = emplaced.first->second.get();
|
||||
syncDb = emplaced.first->second;
|
||||
syncDb->setSourcesDirectory(repoEntry.sourceDir());
|
||||
syncDb->setPackagesDirectory(repoEntry.packageDir());
|
||||
if(m_config.isVerbose() || m_config.runServer()) {
|
||||
|
@ -456,7 +458,7 @@ void Manager::registerDatabasesFromRepoIndexConfig()
|
|||
// add upgrade sources
|
||||
for(const RepoEntry &repoEntry : m_config.repoEntries()) {
|
||||
try {
|
||||
auto &upgradeSources = m_syncDbs.at(repoEntry.name())->upgradeSources();
|
||||
auto &upgradeSources = m_syncDbMap.at(repoEntry.name())->upgradeSources();
|
||||
for(const auto &upgradeSourceName : repoEntry.upgradeSources()) {
|
||||
if(auto *source = repositoryByName(upgradeSourceName)) {
|
||||
upgradeSources << source;
|
||||
|
@ -480,9 +482,9 @@ void Manager::initAlpmDataBases(bool computeRequiredBy)
|
|||
// call the init method
|
||||
{
|
||||
QList<PackageLoader *> loaders;
|
||||
loaders.reserve(m_syncDbs.size() + 1);
|
||||
loaders.reserve(m_syncDbMap.size() + 1);
|
||||
loaders << localDataBase()->init();
|
||||
for(auto &syncDbEntry : m_syncDbs) {
|
||||
for(auto &syncDbEntry : m_syncDbMap) {
|
||||
loaders << syncDbEntry.second->init();
|
||||
}
|
||||
for(auto *loader : loaders) {
|
||||
|
@ -493,9 +495,9 @@ void Manager::initAlpmDataBases(bool computeRequiredBy)
|
|||
// compute required-by and optional-for
|
||||
if(computeRequiredBy) {
|
||||
QList<QFuture<void> > futures;
|
||||
futures.reserve(m_syncDbs.size() + 1);
|
||||
futures.reserve(m_syncDbMap.size() + 1);
|
||||
futures << localDataBase()->computeRequiredBy(*this);
|
||||
for(auto &syncDbEntry : m_syncDbs) {
|
||||
for(auto &syncDbEntry : m_syncDbMap) {
|
||||
futures << syncDbEntry.second->computeRequiredBy(*this);
|
||||
}
|
||||
for(auto &future : futures) {
|
||||
|
@ -555,9 +557,9 @@ void Manager::unregisterSyncDataBases()
|
|||
* \brief Returns a list of all sync databases.
|
||||
* \remarks Sync databases must be registered with parsePacmanConfig() before.
|
||||
*/
|
||||
const std::map<QString, std::unique_ptr<AlpmDatabase> > &Manager::syncDatabases() const
|
||||
const std::map<QString, AlpmDatabase *> &Manager::syncDatabases() const
|
||||
{
|
||||
return m_syncDbs; // m_syncDbs has been filled when the databases were registered
|
||||
return m_syncDbMap; // m_syncDbs has been filled when the databases were registered
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -652,7 +654,7 @@ const QJsonArray &Manager::groupInfo() const
|
|||
QMutexLocker locker(&m_groupInfoMutex);
|
||||
if(m_groupInfo.empty()) {
|
||||
m_groupInfo << localDataBase()->groupInfo();
|
||||
for(const auto &db : m_syncDbs) {
|
||||
for(const auto &db : m_syncDbMap) {
|
||||
m_groupInfo << db.second->groupInfo();
|
||||
}
|
||||
}
|
||||
|
@ -684,6 +686,7 @@ void Manager::cleanupAlpm()
|
|||
m_handle = nullptr;
|
||||
m_localDb.reset();
|
||||
m_syncDbs.clear();
|
||||
m_syncDbMap.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -696,7 +699,7 @@ const AlpmDatabase *Manager::databaseByName(const QString &dbName) const
|
|||
return localDataBase();
|
||||
} else {
|
||||
try {
|
||||
return m_syncDbs.at(dbName).get();
|
||||
return m_syncDbMap.at(dbName);
|
||||
} catch(const out_of_range &) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -712,7 +715,7 @@ AlpmDatabase *Manager::databaseByName(const QString &dbName)
|
|||
return localDataBase();
|
||||
} else {
|
||||
try {
|
||||
return m_syncDbs.at(dbName).get();
|
||||
return m_syncDbMap.at(dbName);
|
||||
} catch(const out_of_range &) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -730,7 +733,7 @@ const Repository *Manager::repositoryByName(const QString &name) const
|
|||
return userRepository();
|
||||
} else {
|
||||
try {
|
||||
return m_syncDbs.at(name).get();
|
||||
return m_syncDbMap.at(name);
|
||||
} catch(const out_of_range &) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -748,7 +751,7 @@ Repository *Manager::repositoryByName(const QString &name)
|
|||
return userRepository();
|
||||
} else {
|
||||
try {
|
||||
return m_syncDbs.at(name).get();
|
||||
return m_syncDbMap.at(name);
|
||||
} catch(const out_of_range &) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ public:
|
|||
// repository lookup
|
||||
const AlpmDatabase *localDataBase() const;
|
||||
AlpmDatabase *localDataBase();
|
||||
const std::map<QString, std::unique_ptr<AlpmDatabase> > &syncDatabases() const;
|
||||
const std::map<QString, AlpmDatabase *> &syncDatabases() const;
|
||||
const AlpmDatabase *databaseByName(const QString &dbName) const;
|
||||
AlpmDatabase *databaseByName(const QString &dbName);
|
||||
const Repository *repositoryByName(const QString &name) const;
|
||||
|
@ -96,7 +96,8 @@ private:
|
|||
QNetworkAccessManager m_networkAccessManager;
|
||||
std::unique_ptr<UserRepository> m_userRepo;
|
||||
std::unique_ptr<AlpmDatabase> m_localDb;
|
||||
std::map<QString, std::unique_ptr<AlpmDatabase> > m_syncDbs;
|
||||
std::list<std::unique_ptr<AlpmDatabase> > m_syncDbs;
|
||||
std::map<QString, AlpmDatabase *> m_syncDbMap;
|
||||
mutable QJsonObject m_basicRepoInfo;
|
||||
mutable QMutex m_basicRepoInfoMutex;
|
||||
mutable QJsonArray m_groupInfo;
|
||||
|
|
|
@ -35,42 +35,25 @@ MingwBundle::MingwBundle(Manager &manager, const ApplicationUtilities::StringVec
|
|||
string missing;
|
||||
// add mingw-w64 packages
|
||||
for(const auto &pkgName : packages) {
|
||||
bool found = false;
|
||||
for(const auto &syncDb : manager.syncDatabases()) {
|
||||
const Dependency dep(QString::fromLocal8Bit(ConversionUtilities::startsWith(pkgName, prefix) ? pkgName.data() : (prefix + pkgName).data()));
|
||||
if(auto *pkg = syncDb.second->packageProviding(dep)) {
|
||||
if(missing.empty()) {
|
||||
decltype(m_packages)::value_type entry(syncDb.second.get(), pkg);
|
||||
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
|
||||
m_packages.emplace_back(entry);
|
||||
}
|
||||
}
|
||||
if(auto *pkg = manager.packageProviding(Dependency(QString::fromLocal8Bit(ConversionUtilities::startsWith(pkgName, prefix) ? pkgName.data() : (prefix + pkgName).data())))) {
|
||||
decltype(m_packages)::value_type entry(pkg->repository(), pkg);
|
||||
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
|
||||
m_packages.emplace_back(entry);
|
||||
addDependencies(pkg);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
} else {
|
||||
missing.push_back(' ');
|
||||
missing.append(pkgName);
|
||||
}
|
||||
}
|
||||
// add additional icon packages
|
||||
for(const auto &pkgName : iconPackages) {
|
||||
bool found = false;
|
||||
for(const auto &syncDb : manager.syncDatabases()) {
|
||||
if(auto *pkg = syncDb.second->packageByName(QString::fromLocal8Bit(pkgName.data()))) {
|
||||
if(missing.empty()) {
|
||||
decltype(m_packages)::value_type entry(syncDb.second.get(), pkg);
|
||||
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
|
||||
m_packages.emplace_back(entry);
|
||||
}
|
||||
}
|
||||
found = true;
|
||||
break;
|
||||
if(auto *pkg = manager.packageProviding(Dependency(QString::fromLocal8Bit(pkgName.data())))) {
|
||||
decltype(m_packages)::value_type entry(pkg->repository(), pkg);
|
||||
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
|
||||
m_packages.emplace_back(entry);
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
} else {
|
||||
missing.push_back(' ');
|
||||
missing.append(pkgName);
|
||||
}
|
||||
|
@ -91,23 +74,15 @@ void MingwBundle::addDependencies(const Package *pkg)
|
|||
string missing;
|
||||
for(const auto &dep : pkg->dependencies()) {
|
||||
if(dep.name.startsWith(QLatin1String("mingw-w64-"), Qt::CaseInsensitive)) {
|
||||
bool found = false;
|
||||
for(const auto &syncDbEntry : m_manager.syncDatabases()) {
|
||||
if(const auto *pkg = syncDbEntry.second->packageProviding(dep)) {
|
||||
if(missing.empty()) {
|
||||
decltype(m_packages)::value_type entry(syncDbEntry.second.get(), pkg);
|
||||
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
|
||||
m_packages.emplace_back(entry);
|
||||
addDependencies(pkg);
|
||||
}
|
||||
}
|
||||
found = true;
|
||||
break;
|
||||
if(auto *pkg = m_manager.packageProviding(dep)) {
|
||||
decltype(m_packages)::value_type entry(pkg->repository(), pkg);
|
||||
if(find(m_packages.cbegin(), m_packages.cend(), entry) == m_packages.cend()) {
|
||||
m_packages.emplace_back(entry);
|
||||
addDependencies(pkg);
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
} else {
|
||||
missing.push_back(' ');
|
||||
missing.append(dep.name.toLocal8Bit().data());
|
||||
missing.append(dep.name.toLocal8Bit());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ private:
|
|||
void addDependencies(const Package *pkg);
|
||||
|
||||
Manager &m_manager;
|
||||
std::list<std::pair<const AlpmDatabase *, const Package *> > m_packages;
|
||||
std::list<std::pair<const Repository *, const Package *> > m_packages;
|
||||
const ApplicationUtilities::StringVector &m_extraPackages;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue