From 8043caf05b4a690d7dbea13811731af51deafd91 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 28 Oct 2015 19:55:36 +0100 Subject: [PATCH] AUR full package request --- alpm/manager.cpp | 2 +- alpm/package.cpp | 5 ++ alpm/package.h | 4 +- alpm/packageinfolookup.cpp | 21 +++++++-- alpm/repository.cpp | 4 +- network/userrepository.cpp | 46 ++++++++++++++++--- network/userrepository.h | 1 + .../repoindex.conf.js | 12 ++--- 8 files changed, 72 insertions(+), 23 deletions(-) rename repoindex.conf.js => testing/repoindex.conf.js (55%) diff --git a/alpm/manager.cpp b/alpm/manager.cpp index 16b5128..4a10334 100644 --- a/alpm/manager.cpp +++ b/alpm/manager.cpp @@ -676,7 +676,7 @@ void Manager::cleanupAlpm() { if(m_handle) { alpm_release(m_handle); - m_handle = 0; + m_handle = nullptr; m_localDb.reset(); m_syncDbs.clear(); } diff --git a/alpm/package.cpp b/alpm/package.cpp index 26f674c..0fe175e 100644 --- a/alpm/package.cpp +++ b/alpm/package.cpp @@ -455,6 +455,11 @@ void Package::putInfo(const QList > &baseInfo, const QLi } } +void Package::putSourceFile(const QString &path, const QByteArray &data) +{ + m_sourceFiles.insert(make_pair(path, data)); +} + /*! * \brief The PackageVersion class helps parsing package versions. */ diff --git a/alpm/package.h b/alpm/package.h index a060835..a106d0e 100644 --- a/alpm/package.h +++ b/alpm/package.h @@ -176,6 +176,7 @@ public: // parsing src/pkg info void putInfo(const QList > &baseInfo, const QList > &pkgInfo); + void putSourceFile(const QString &path, const QByteArray &data); protected: explicit Package(const QString &name, Repository *repository); @@ -413,7 +414,8 @@ inline const QString &Package::fileName() const } /*! - * \brief Returns the file of the package as JSON array. + * \brief Returns the paths of the files of the binary package as JSON array. + * \remarks For source files see \a sourceFiles(). */ inline const QJsonArray &Package::files() const { diff --git a/alpm/packageinfolookup.cpp b/alpm/packageinfolookup.cpp index cd6fa4a..bfd4ce3 100644 --- a/alpm/packageinfolookup.cpp +++ b/alpm/packageinfolookup.cpp @@ -92,12 +92,23 @@ void PackageInfoLookup::addResultsFromReply() assert(m_remainingReplies); auto *reply = static_cast(sender()); reply->deleteLater(); - const auto *repo = reply->repository(); - addResultsDirectly(reply->requestedPackages(), repo); - if(!--m_remainingReplies) { - emit resultsAvailable(m_what, m_id, m_results); - deleteLater(); + if(reply->error().isEmpty()) { + addResultsDirectly(reply->requestedPackages(), reply->repository()); + if(!--m_remainingReplies) { + emit resultsAvailable(m_what, m_id, m_results); + deleteLater(); + } + } else { + // TODO: report error + /* + for(const auto &packageName : packageNames) { + QJsonObject res; + res.insert(QStringLiteral("name"), packageName); + res.insert(QStringLiteral("repo"), repo->name()); + } + */ } + } } // namespace RepoIndex diff --git a/alpm/repository.cpp b/alpm/repository.cpp index c8cb458..8da3025 100644 --- a/alpm/repository.cpp +++ b/alpm/repository.cpp @@ -518,8 +518,8 @@ void Repository::restoreSpecificCacheHeader(QDataStream &in) } /*! - * \brief Adds a package parsed from the specified \a srcInfo. - * \returns Returns the packages. + * \brief Adds packages parsed from the specified \a srcInfo. + * \returns Returns the added packages. */ QList Repository::addPackagesFromSrcInfo(const QByteArray &srcInfo) { diff --git a/network/userrepository.cpp b/network/userrepository.cpp index 1cad5e5..269108f 100644 --- a/network/userrepository.cpp +++ b/network/userrepository.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -15,6 +16,9 @@ #include #include #include +#include +#include +#include using namespace std; @@ -28,6 +32,8 @@ const QString rpcRequestTypeMultiInfo(QStringLiteral("multiinfo")); const QString rpcArgKey(QStringLiteral("arg")); const QString rpcArgArray(QStringLiteral("arg[]")); const QString pkgbuildRequestType(QString("pkgbuild")); + +QString UserRepository::m_aurBaseUrl = QStringLiteral("https://aur.archlinux.org"); QUrl UserRepository::m_aurRpcUrl = QUrl(QStringLiteral("https://aur.archlinux.org/rpc.php")); QUrl UserRepository::m_aurPkgbuildUrl = QUrl(QStringLiteral("https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD")); QUrl UserRepository::m_aurSrcInfoUrl = QUrl(QStringLiteral("https://aur.archlinux.org/cgit/aur.git/plain/.SRCINFO")); @@ -79,20 +85,42 @@ void AurFullPackageReply::processData() { auto *reply = static_cast(sender()); if(reply->error() == QNetworkReply::NoError) { - KTar tar(reply); + //QBuffer buffer; + //buffer.setData(reply->readAll()); + QTemporaryFile tmpFile; + tmpFile.setFileTemplate(QDir::tempPath() % QStringLiteral("/") % QStringLiteral("repoindex-XXXXXX.tar.gz")); + tmpFile.open(); + tmpFile.write(reply->readAll()); + tmpFile.seek(0); + //QFile testFile("/tmp/test.tar.gz"); + //testFile.open(QFile::WriteOnly); + //testFile.write(buffer.data()); + //testFile.close(); + //testFile.open(QFile::ReadOnly); + //buffer.open(QBuffer::ReadOnly); + KCompressionDevice dev(&tmpFile, false, KCompressionDevice::GZip); + KTar tar(tmpFile.fileName()); if(tar.open(QIODevice::ReadOnly)) { - const auto *baseDir = tar.directory(); - //const auto packageBase = baseDir->name(); - const auto *srcInfoEntry = baseDir->entry(QStringLiteral(".SRCINFO")); + const KArchiveDirectory *baseDir; + const KArchiveEntry *srcInfoEntry = nullptr; + if(!tar.directory()->entries().isEmpty()) { + const auto *baseEntry = tar.directory()->entry(tar.directory()->entries().front()); + if(baseEntry && baseEntry->isDirectory()) { + baseDir = static_cast(baseEntry); + srcInfoEntry = baseDir->entry(QStringLiteral(".SRCINFO")); + } + } if(srcInfoEntry && srcInfoEntry->isFile()) { - const QByteArray srcInfo = static_cast(srcInfoEntry)->data(); + const auto srcInfo = static_cast(srcInfoEntry)->data(); const auto packages = m_userRepo->addPackagesFromSrcInfo(srcInfo); // TODO: error handling for(const auto &entryName : baseDir->entries()) { if(entryName != QLatin1String(".SRCINFO")) { const auto *entry = baseDir->entry(entryName); if(entry->isFile()) { - for(const auto *package : packages) { + const auto data = static_cast(entry)->data(); + for(Package *package : packages) { + package->putSourceFile(entry->name(), data); // TODO: add source files } } else { @@ -109,6 +137,10 @@ void AurFullPackageReply::processData() } else { m_error = QStringLiteral("Error: Unable to request tarball from AUR: ") + reply->errorString(); } + if(!m_error.isEmpty()) { + qDebug() << m_error; + } + emit resultsAvailable(); } AurSuggestionsReply::AurSuggestionsReply(QNetworkReply *networkReply, const QString &term, UserRepository *repo) : @@ -241,7 +273,7 @@ AurFullPackageReply *UserRepository::requestFullPackageInfo(const QStringList &p if(pkg->tarUrl().isEmpty()) { replies << m_networkAccessManager.get(QNetworkRequest(m_aurSnapshotPath.arg(pkg->name()))); } else { - replies << m_networkAccessManager.get(QNetworkRequest(pkg->tarUrl())); + replies << m_networkAccessManager.get(QNetworkRequest(m_aurBaseUrl + pkg->tarUrl())); } } } catch(const out_of_range &) { diff --git a/network/userrepository.h b/network/userrepository.h index 8619254..13f61a0 100644 --- a/network/userrepository.h +++ b/network/userrepository.h @@ -74,6 +74,7 @@ protected: private: QNetworkAccessManager &m_networkAccessManager; + static QString m_aurBaseUrl; static QUrl m_aurRpcUrl; static QUrl m_aurPkgbuildUrl; static QUrl m_aurSrcInfoUrl; diff --git a/repoindex.conf.js b/testing/repoindex.conf.js similarity index 55% rename from repoindex.conf.js rename to testing/repoindex.conf.js index dde94b5..3512b0d 100644 --- a/repoindex.conf.js +++ b/testing/repoindex.conf.js @@ -11,8 +11,8 @@ "server": { "listeningPort": 1234, - "certFile": "some.cert", - "keyFile": "some.key", + "certFile": "/run/media/martchus/files/programming/projects/c++/qmake/projects/repoindex/cert/test.crt", + "keyFile": "/run/media/martchus/files/programming/projects/c++/qmake/projects/repoindex/cert/test.key", "insecure": false }, @@ -20,14 +20,12 @@ "fromPacmanConfig": true, "add": [ - {"name": "examplerepo", - "dataBaseFile": "path/to/database/file", + {"name": "ownstuff", "sourcesDir": "path/to/local/source/dir", - "packagesDir": "path/to/local/pkg/dir", + "packagesDir": "/run/media/devel/repo/arch/ownstuff/os/x86_64", "upgradeSources": ["aur"], "server": [ - "https://some/mirror", - "https://another/mirror" + "https://localhost/repo/arch/$repo/os/$arch" ] } ]