diff --git a/CMakeLists.txt b/CMakeLists.txt index 275764a..999f6ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}") set(META_APP_DESCRIPTION "Repository browser for Arch Linux") set(META_VERSION_MAJOR 0) set(META_VERSION_MINOR 2) -set(META_VERSION_PATCH 4) +set(META_VERSION_PATCH 5) project(${META_PROJECT_NAME}) diff --git a/lib/network/userrepository.cpp b/lib/network/userrepository.cpp index 4a4da3f..406b689 100644 --- a/lib/network/userrepository.cpp +++ b/lib/network/userrepository.cpp @@ -44,8 +44,8 @@ QUrl UserRepository::m_aurPkgbuildUrl = QUrl(QStringLiteral("https://aur.archlin QUrl UserRepository::m_aurSrcInfoUrl = QUrl(QStringLiteral("https://aur.archlinux.org/cgit/aur.git/plain/.SRCINFO")); QString UserRepository::m_aurSnapshotPath = QStringLiteral("https://aur.archlinux.org/cgit/aur.git/snapshot/%1.tar.gz"); -AurPackageReply::AurPackageReply(QNetworkReply *networkReply, const QStringList &requestedPackages, UserRepository *userRepo) : - PackageReply(networkReply, requestedPackages, userRepo), +AurPackageReply::AurPackageReply(const QList &networkReplies, const QStringList &requestedPackages, UserRepository *userRepo) : + PackageReply(networkReplies, requestedPackages, userRepo), m_userRepo(userRepo) {} @@ -243,7 +243,15 @@ AurSuggestionsReply *UserRepository::requestSuggestions(const QString &term) AurPackageReply *UserRepository::requestPackageInfo(const QStringList &packageNames, bool forceUpdate) { + if(packageNames.isEmpty()) { + return nullptr; + } + + QList replies; + replies.reserve(1 + packageNames.size() / 200); + QUrlQuery query; + size_t queryItems = 0; for(const auto &packageName : packageNames) { try { const auto &pkg = m_packages.at(packageName); @@ -253,14 +261,29 @@ AurPackageReply *UserRepository::requestPackageInfo(const QStringList &packageNa } catch(const out_of_range &) { query.addQueryItem(rpcArgArray, packageName); } + + if(++queryItems > 200) { + auto url = m_aurRpcUrl; + query.addQueryItem(rpcRequestTypeKey, rpcRequestTypeMultiInfo); + url.setQuery(query); + replies << networkAccessManager().get(QNetworkRequest(url)); + + queryItems = 0; + query.clear(); + } } - if(query.isEmpty()) { - return nullptr; - } else { + + if(!query.isEmpty()) { auto url = m_aurRpcUrl; query.addQueryItem(rpcRequestTypeKey, rpcRequestTypeMultiInfo); url.setQuery(query); - return new AurPackageReply(networkAccessManager().get(QNetworkRequest(url)), packageNames, this); + replies << networkAccessManager().get(QNetworkRequest(url)); + } + + if(replies.isEmpty()) { + return nullptr; + } else { + return new AurPackageReply(replies, packageNames, this); } } diff --git a/lib/network/userrepository.h b/lib/network/userrepository.h index 2ca5b89..4251e21 100644 --- a/lib/network/userrepository.h +++ b/lib/network/userrepository.h @@ -20,7 +20,7 @@ class AurPackageReply : public PackageReply { Q_OBJECT public: - AurPackageReply(QNetworkReply *networkReply, const QStringList &requestedPackages, UserRepository *userRepo); + AurPackageReply(const QList &networkReplies, const QStringList &requestedPackages, UserRepository *userRepo); private slots: void processData(QNetworkReply *reply);