diff --git a/alpm/manager.cpp b/alpm/manager.cpp index 3f91d1f..346da64 100644 --- a/alpm/manager.cpp +++ b/alpm/manager.cpp @@ -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(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(pkg); } } @@ -151,9 +151,9 @@ unique_ptr 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(db, m_config.alpmDbPath(), m_syncDbs.size() + 1)); + m_syncDbs.emplace_back(make_unique(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(repoEntry.sigLevel())); - auto emplaced = m_syncDbs.emplace(repoEntry.name(), make_unique(db, m_config.alpmDbPath(), m_syncDbs.size() + 1)); + m_syncDbs.emplace_back(make_unique(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 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 > 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 > &Manager::syncDatabases() const +const std::map &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; } diff --git a/alpm/manager.h b/alpm/manager.h index 32fb91b..a1a2f91 100644 --- a/alpm/manager.h +++ b/alpm/manager.h @@ -71,7 +71,7 @@ public: // repository lookup const AlpmDatabase *localDataBase() const; AlpmDatabase *localDataBase(); - const std::map > &syncDatabases() const; + const std::map &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 m_userRepo; std::unique_ptr m_localDb; - std::map > m_syncDbs; + std::list > m_syncDbs; + std::map m_syncDbMap; mutable QJsonObject m_basicRepoInfo; mutable QMutex m_basicRepoInfoMutex; mutable QJsonArray m_groupInfo; diff --git a/alpm/mingwbundle.cpp b/alpm/mingwbundle.cpp index 1033ea6..b5026ef 100644 --- a/alpm/mingwbundle.cpp +++ b/alpm/mingwbundle.cpp @@ -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()); } } } diff --git a/alpm/mingwbundle.h b/alpm/mingwbundle.h index ee21f30..d744e7e 100644 --- a/alpm/mingwbundle.h +++ b/alpm/mingwbundle.h @@ -23,7 +23,7 @@ private: void addDependencies(const Package *pkg); Manager &m_manager; - std::list > m_packages; + std::list > m_packages; const ApplicationUtilities::StringVector &m_extraPackages; };