fixed includes, cli interface for upgrade lookup

This commit is contained in:
Martchus 2015-09-07 19:36:45 +02:00
parent bf59a5746d
commit 98e565b8c3
29 changed files with 389 additions and 116 deletions

View File

@ -1,8 +1,8 @@
#include "alpmdatabase.h" #include "./alpmdatabase.h"
#include "group.h" #include "./group.h"
#include "upgradelookup.h" #include "./upgradelookup.h"
#include "alpmpackage.h" #include "./alpmpackage.h"
#include "utilities.h" #include "./utilities.h"
#include <c++utilities/misc/memory.h> #include <c++utilities/misc/memory.h>

View File

@ -1,8 +1,8 @@
#ifndef ALPM_DATABASE_H #ifndef ALPM_DATABASE_H
#define ALPM_DATABASE_H #define ALPM_DATABASE_H
#include "repository.h" #include "./repository.h"
#include "list.h" #include "./list.h"
#include <QJsonArray> #include <QJsonArray>
#include <QMutex> #include <QMutex>

View File

@ -1,6 +1,6 @@
#include "alpmpackage.h" #include "./alpmpackage.h"
#include "alpmdatabase.h" #include "./alpmdatabase.h"
#include "utilities.h" #include "./utilities.h"
#include <QJsonObject> #include <QJsonObject>

View File

@ -1,7 +1,7 @@
#ifndef PACKAGEMANAGEMENT_ALPMPACKAGE_H #ifndef PACKAGEMANAGEMENT_ALPMPACKAGE_H
#define PACKAGEMANAGEMENT_ALPMPACKAGE_H #define PACKAGEMANAGEMENT_ALPMPACKAGE_H
#include "package.h" #include "./package.h"
namespace RepoIndex { namespace RepoIndex {

View File

@ -1,6 +1,6 @@
#include "aurpackage.h" #include "./aurpackage.h"
#include "repoindex/network/userrepository.h" #include "../network/userrepository.h"
#include <QJsonObject> #include <QJsonObject>

View File

@ -1,7 +1,7 @@
#ifndef PACKAGEMANAGEMENT_AURPACKAGE_H #ifndef PACKAGEMANAGEMENT_AURPACKAGE_H
#define PACKAGEMANAGEMENT_AURPACKAGE_H #define PACKAGEMANAGEMENT_AURPACKAGE_H
#include "package.h" #include "./package.h"
namespace RepoIndex { namespace RepoIndex {

View File

@ -1,5 +1,5 @@
#include "config.h" #include "./config.h"
#include "manager.h" #include "./manager.h"
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>
@ -59,6 +59,8 @@ ConfigArgs::ConfigArgs(ArgumentParser &parser) :
buildOrderArg.setValueNames(pkgValueNames); buildOrderArg.setValueNames(pkgValueNames);
serverArg.setDenotesOperation(true); serverArg.setDenotesOperation(true);
upgradeLookupArg.setDenotesOperation(true); upgradeLookupArg.setDenotesOperation(true);
upgradeLookupArg.setRequiredValueCount(1);
upgradeLookupArg.setValueNames({"repo"});
mingwBundleArg.setDenotesOperation(true); mingwBundleArg.setDenotesOperation(true);
mingwBundleArg.setRequiredValueCount(-1); mingwBundleArg.setRequiredValueCount(-1);
mingwBundleArg.setValueNames(pkgValueNames); mingwBundleArg.setValueNames(pkgValueNames);
@ -112,10 +114,10 @@ ConfigArgs::ConfigArgs(ArgumentParser &parser) :
repoArg.setRequiredValueCount(1); repoArg.setRequiredValueCount(1);
repoArg.setValueNames({"repo name"}); repoArg.setValueNames({"repo name"});
serverArg.setSecondaryArguments({&rootdirArg, &dbpathArg, &pacmanConfArg, &certFileArg, &keyFileArg, &websocketAddrArg, &websocketPortArg, &insecureArg, &aurArg}); serverArg.setSecondaryArguments({&rootdirArg, &dbpathArg, &pacmanConfArg, &certFileArg, &keyFileArg, &websocketAddrArg, &websocketPortArg, &insecureArg, &aurArg});
upgradeLookupArg.setSecondaryArguments({&repoArg, &shSyntaxArg}); upgradeLookupArg.setSecondaryArguments({&shSyntaxArg});
buildOrderArg.setSecondaryArguments({&aurArg, &verboseArg, &shSyntaxArg}); buildOrderArg.setSecondaryArguments({&aurArg, &verboseArg, &shSyntaxArg});
mingwBundleArg.setSecondaryArguments({&targetDirArg, &targetNameArg, &targetFormatArg, &iconThemesArg}); mingwBundleArg.setSecondaryArguments({&targetDirArg, &targetNameArg, &targetFormatArg, &iconThemesArg});
parser.setMainArguments({&buildOrderArg, &serverArg, &mingwBundleArg, &repoindexConfArg, &repoindexConfArg, &helpArg}); parser.setMainArguments({&buildOrderArg, &upgradeLookupArg, &serverArg, &mingwBundleArg, &repoindexConfArg, &repoindexConfArg, &helpArg});
} }
/*! /*!

View File

@ -1,5 +1,5 @@
#include "group.h" #include "./group.h"
#include "package.h" #include "./package.h"
#include <QJsonArray> #include <QJsonArray>

View File

@ -1,8 +1,8 @@
#ifndef ALPM_GROUP_H #ifndef ALPM_GROUP_H
#define ALPM_GROUP_H #define ALPM_GROUP_H
#include "list.h" #include "./list.h"
#include "package.h" #include "./package.h"
#include <alpm.h> #include <alpm.h>

View File

@ -1,10 +1,10 @@
#include "manager.h" #include "./manager.h"
#include "alpmdatabase.h" #include "./alpmdatabase.h"
#include "utilities.h" #include "./utilities.h"
#include "list.h" #include "./list.h"
#include "config.h" #include "./config.h"
#include "repoindex/network/userrepository.h" #include "../network/userrepository.h"
#include <c++utilities/io/inifile.h> #include <c++utilities/io/inifile.h>
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>

View File

@ -1,8 +1,8 @@
#ifndef ALPM_MANAGER_H #ifndef ALPM_MANAGER_H
#define ALPM_MANAGER_H #define ALPM_MANAGER_H
#include "upgradelookup.h" #include "./upgradelookup.h"
#include "alpmpackage.h" #include "./alpmpackage.h"
#include <alpm.h> #include <alpm.h>

View File

@ -1,7 +1,7 @@
#include "mingwbundle.h" #include "./mingwbundle.h"
#include "utilities.h" #include "./utilities.h"
#include "manager.h" #include "./manager.h"
#include "config.h" #include "./config.h"
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>
#include <c++utilities/misc/memory.h> #include <c++utilities/misc/memory.h>

View File

@ -1,8 +1,8 @@
#ifndef PACKAGEMANAGEMENT_MINGWBUNDLE_H #ifndef PACKAGEMANAGEMENT_MINGWBUNDLE_H
#define PACKAGEMANAGEMENT_MINGWBUNDLE_H #define PACKAGEMANAGEMENT_MINGWBUNDLE_H
#include "package.h" #include "./package.h"
#include "alpmdatabase.h" #include "./alpmdatabase.h"
#include <c++utilities/application/argumentparser.h> #include <c++utilities/application/argumentparser.h>

View File

@ -1,7 +1,7 @@
#include "package.h" #include "./package.h"
#include "alpmdatabase.h" #include "./alpmdatabase.h"
#include "utilities.h" #include "./utilities.h"
#include "repository.h" #include "./repository.h"
#include <QJsonObject> #include <QJsonObject>
#include <QJsonValue> #include <QJsonValue>

View File

@ -1,7 +1,7 @@
#ifndef ALPM_PACKAGE_H #ifndef ALPM_PACKAGE_H
#define ALPM_PACKAGE_H #define ALPM_PACKAGE_H
#include "list.h" #include "./list.h"
#include <c++utilities/chrono/datetime.h> #include <c++utilities/chrono/datetime.h>

View File

@ -1,6 +1,6 @@
#include "repository.h" #include "./repository.h"
#include "upgradelookup.h" #include "./upgradelookup.h"
#include "utilities.h" #include "./utilities.h"
#include <QJsonObject> #include <QJsonObject>
#include <QNetworkReply> #include <QNetworkReply>

View File

@ -1,8 +1,8 @@
#ifndef PACKAGEMANAGEMENT_PACKAGESOURCE_H #ifndef PACKAGEMANAGEMENT_PACKAGESOURCE_H
#define PACKAGEMANAGEMENT_PACKAGESOURCE_H #define PACKAGEMANAGEMENT_PACKAGESOURCE_H
#include "package.h" #include "./package.h"
#include "group.h" #include "./group.h"
#include <QObject> #include <QObject>

View File

@ -1,7 +1,8 @@
#include "resolvebuildorder.h" #include "./resolvebuildorder.h"
#include "manager.h" #include "./manager.h"
#include "config.h" #include "./config.h"
#include "./utilities.h"
#include <c++utilities/misc/memory.h> #include <c++utilities/misc/memory.h>
@ -183,6 +184,15 @@ QStringList BuildOrderResolver::resolve(const StringVector &packages) const
} }
} }
void BuildOrderResolver::printResults(const QStringList &results)
{
if(useShSyntax) {
Utilities::printBashArray(cout, "REPOINDEX_RESULTS", results);
} else {
Utilities::printValues(cout, "Results", results);
}
}
void BuildOrderResolver::addDeps(QList<TaskInfo *> &tasks, TaskInfo *task) const void BuildOrderResolver::addDeps(QList<TaskInfo *> &tasks, TaskInfo *task) const
{ {
if(const auto pkg = m_manager.packageProviding(Dependency(task->name()))) { if(const auto pkg = m_manager.packageProviding(Dependency(task->name()))) {

View File

@ -18,6 +18,7 @@ public:
BuildOrderResolver(const Manager &manager); BuildOrderResolver(const Manager &manager);
QStringList resolve(const ApplicationUtilities::StringVector &packages) const; QStringList resolve(const ApplicationUtilities::StringVector &packages) const;
static void printResults(const QStringList &results);
private: private:
void addDeps(QList<TaskInfo *> &tasks, TaskInfo *task) const; void addDeps(QList<TaskInfo *> &tasks, TaskInfo *task) const;

View File

@ -1,24 +1,44 @@
#include "upgradelookup.h" #include "./upgradelookup.h"
#include "manager.h" #include "./manager.h"
#include "alpmdatabase.h" #include "./alpmdatabase.h"
#include "config.h" #include "./config.h"
#include "./utilities.h"
#include <QtConcurrent/QtConcurrent> #include <QtConcurrent/QtConcurrent>
#include <assert.h> #include <assert.h>
#include <iostream>
using namespace std; using namespace std;
namespace RepoIndex { namespace RepoIndex {
using namespace Utilities;
/*!
* \class UpgradeResult
* \brief The UpgradeResult class wraps and upgrade/downgrade package and the current version.
*/
/*!
* \brief Returns a JSON object for the current instance.
*/
QJsonObject UpgradeResult::json() const QJsonObject UpgradeResult::json() const
{ {
QJsonObject obj; QJsonObject obj;
obj.insert(QStringLiteral("pkg"), package->basicInfo(true)); obj.insert(QStringLiteral("pkg"), package->basicInfo(true));
obj.insert(QStringLiteral("prevVersion"), previousVersion); obj.insert(QStringLiteral("curVer"), currentVersion);
return obj; return obj;
} }
/*!
* \class UpgradeLookupProcess
* \brief The UpgradeLookupProcess class performs an async upgrade lookup for a particular upgrade source.
*/
/*!
* \brief Constructs a new upgrade lookup process. The upgrade lookup process is started immediately.
*/
UpgradeLookupProcess::UpgradeLookupProcess(UpgradeLookup *upgradeLookup, const Repository *upgradeSource) : UpgradeLookupProcess::UpgradeLookupProcess(UpgradeLookup *upgradeLookup, const Repository *upgradeSource) :
QObject(upgradeLookup), QObject(upgradeLookup),
m_toCheck(upgradeLookup->toCheck()), m_toCheck(upgradeLookup->toCheck()),
@ -49,11 +69,17 @@ UpgradeLookupProcess::UpgradeLookupProcess(UpgradeLookup *upgradeLookup, const R
} }
} }
/*!
* \brief Returns the results. Results are available, after the finished() signal has been emitted.
*/
const UpgradeLookupResults &UpgradeLookupProcess::results() const const UpgradeLookupResults &UpgradeLookupProcess::results() const
{ {
return m_results; return m_results;
} }
/*!
* \brief Internally called when the upgrade source is ready.
*/
void UpgradeLookupProcess::sourceReady() void UpgradeLookupProcess::sourceReady()
{ {
// if a request was required, check whether there occured an error // if a request was required, check whether there occured an error
@ -66,17 +92,78 @@ void UpgradeLookupProcess::sourceReady()
} }
} }
/*!
* \brief Internally called to perform the upgrade lookup.
*/
void UpgradeLookupProcess::checkUpgrades() void UpgradeLookupProcess::checkUpgrades()
{ {
m_toCheck->checkForUpgrades(m_results, QList<const Repository *>() << m_upgradeSource); m_toCheck->checkForUpgrades(m_results, QList<const Repository *>() << m_upgradeSource);
} }
UpgradeLookup::UpgradeLookup(const Manager &manager, const QJsonObject &request, QObject *parent) : /*!
* \class UpgradeLookup
* \brief The UpgradeLookup class performs an async upgrade lookup for using multiple upgrade sources.
* \remarks The object deletes itself after the lookup is done.
*/
/*!
* \brief Constructs a new upgrade lookup (protected since this is a pure virtual class).
*/
UpgradeLookup::UpgradeLookup(QObject *parent) :
QObject(parent), QObject(parent),
m_request(request),
m_toCheck(nullptr), m_toCheck(nullptr),
m_remainingProcesses(0), m_remainingProcesses(0),
m_firstFinished(false) m_firstFinished(false)
{}
/*!
* \fn UpgradeLookup::processFinished()
* \brief Internally called when the finished() signal of an UpgradeLookupProcess instance is emitted.
*/
/*!
* \class UpgradeLookupJson
* \brief The UpgradeLookupJson class performs an async upgrade lookup for using multiple upgrade sources.
*
* The request and the results are in JSON.
*
* Example request:
* {
* db: "repo", repository to be checked
* syncdbs: ["extra", "community"] upgrade sources to be used
* }
*
* Example result:
* {
* softwareUpdates: [ software upgrades
* {pkg: ..., basic info of package providing upgrade
* curVer: current version
* ],
* packageOnlyUpdates: [ package-only upgrades
* {pkg: ..., basic info of package providing upgrade
* curVer: current version
* ],
* downgrades: [ downgrades
* {pkg: ..., basic info of package providing downgrade
* curVer: current version
* ]
* orphanedPackages: [ ... ] basic info of orphaned packages
* warnings: [ ... ] warnings
* errors: [ ... ] errors
* }
*/
/*!
* \fn UpgradeLookupJson::resultsAvailable()
* \brief Emitted when all results are availabe (also in the error case).
*/
/*!
* \brief Constructs a new upgrade lookup for the specified \a request using the specified \a manager.
*/
UpgradeLookupJson::UpgradeLookupJson(const Manager &manager, const QJsonObject &request, QObject *parent) :
UpgradeLookup(parent),
m_request(request)
{ {
const auto toCheckName = request.value(QStringLiteral("db")).toString(); const auto toCheckName = request.value(QStringLiteral("db")).toString();
if((m_toCheck = manager.repositoryByName(toCheckName))) { if((m_toCheck = manager.repositoryByName(toCheckName))) {
@ -114,19 +201,19 @@ UpgradeLookup::UpgradeLookup(const Manager &manager, const QJsonObject &request,
deleteLater(); deleteLater();
} }
void UpgradeLookup::processFinished() void UpgradeLookupJson::processFinished()
{ {
assert(m_remainingProcesses); assert(m_remainingProcesses);
// add results // add results
const auto &results = static_cast<UpgradeLookupProcess *>(sender())->results(); const auto &results = static_cast<UpgradeLookupProcess *>(sender())->results();
for(const auto pkg : results.newVersions) { for(const auto &res : results.newVersions) {
m_softwareUpdatesArray << pkg.json(); m_softwareUpgradesArray << res.json();
} }
for(const auto pkg : results.newReleases) { for(const auto &res : results.newReleases) {
m_packageOnlyUpdatesArray << pkg.json(); m_packageOnlyUpgradesArray << res.json();
} }
for(const auto pkg : results.downgrades) { for(const auto &res : results.downgrades) {
m_downgradesArray << pkg.json(); m_downgradesArray << res.json();
} }
for(const auto &warning : results.warnings) { for(const auto &warning : results.warnings) {
m_warningsArray << warning; m_warningsArray << warning;
@ -148,8 +235,8 @@ void UpgradeLookup::processFinished()
} }
// add results to results QJsonObject // add results to results QJsonObject
QJsonObject results; QJsonObject results;
results.insert(QStringLiteral("softwareUpdates"), m_softwareUpdatesArray); results.insert(QStringLiteral("softwareUpdates"), m_softwareUpgradesArray);
results.insert(QStringLiteral("packageOnlyUpdates"), m_packageOnlyUpdatesArray); results.insert(QStringLiteral("packageOnlyUpdates"), m_packageOnlyUpgradesArray);
results.insert(QStringLiteral("downgrades"), m_downgradesArray); results.insert(QStringLiteral("downgrades"), m_downgradesArray);
results.insert(QStringLiteral("orphanedPackages"), m_orphanedPackagesArray); results.insert(QStringLiteral("orphanedPackages"), m_orphanedPackagesArray);
if(!m_warningsArray.isEmpty()) { if(!m_warningsArray.isEmpty()) {
@ -164,4 +251,124 @@ void UpgradeLookup::processFinished()
} }
} }
/*!
* \class UpgradeLookupCli
* \brief The UpgradeLookupJson class performs an async upgrade lookup for using multiple upgrade sources.
*
* The repository to be checked is specified as string. Results are printed to cerr/cout.
*/
/*!
* \brief Constructs a new upgrade lookup for the specified \a db using the specified \a manager.
*/
UpgradeLookupCli::UpgradeLookupCli(const Manager &manager, const string &repo, QObject *parent) :
UpgradeLookup(parent)
{
cerr << shchar << "Checking upgrades for \"" << repo << "\" ..." << endl;
const auto toCheckName = qstr(repo);
if((m_toCheck = manager.repositoryByName(toCheckName))) {
// construct upgrade lookup processes
for(const auto *src : m_toCheck->upgradeSources()) {
new UpgradeLookupProcess(this, src);
++m_remainingProcesses;
}
// check whether any processes could be constructed
if(!m_remainingProcesses) {
m_errorsArray << QStringLiteral("No upgrade sources associated for repository \"%1\".").arg(m_toCheck->name());
} else {
return; // no errors so far
}
} else {
m_errorsArray << QStringLiteral("Repository \"%1\" can not be found.").arg(toCheckName);
}
printResults(); // print errors
}
void UpgradeLookupCli::processFinished()
{
assert(m_remainingProcesses);
// add results
const auto &results = static_cast<UpgradeLookupProcess *>(sender())->results();
m_softwareUpgradesArray.reserve(m_softwareUpgradesArray.size() + results.newVersions.size());
m_packageOnlyUpgradesArray.reserve(m_packageOnlyUpgradesArray.size() + results.newReleases.size());
m_downgradesArray.reserve(m_downgradesArray.size() + results.downgrades.size());
m_warningsArray.reserve(m_warningsArray.size() + results.warnings.size());
m_errorsArray.reserve(m_errorsArray.size() + results.errors.size());
for(const auto &res : results.newVersions) {
m_softwareUpgradesArray << res.package->name();
}
for(const auto &res : results.newReleases) {
m_packageOnlyUpgradesArray << res.package->name();
}
for(const auto &res : results.downgrades) {
m_downgradesArray << res.package->name();
}
for(const auto &warning : results.warnings) {
m_warningsArray << warning;
}
for(const auto &error : results.errors) {
m_errorsArray << error;
}
if(m_firstFinished) {
m_orphanedPackages = m_orphanedPackages.intersect(results.orphaned);
} else {
m_firstFinished = true;
m_orphanedPackages = results.orphaned;
}
// check whether all processes are finished
if(--m_remainingProcesses == 0) {
// finally make info for orphanded packages
m_orphanedPackagesArray.reserve(m_orphanedPackages.size());
for(const auto *pkg : m_orphanedPackages) {
m_orphanedPackagesArray << pkg->name();
}
printResults();
}
}
void UpgradeLookupCli::printResults()
{
if(useShSyntax) {
if(!m_errorsArray.isEmpty()) {
Utilities::printBashArray(cerr, "REPOINDEX_ERRORS", m_errorsArray);
}
if(!m_warningsArray.isEmpty()) {
Utilities::printBashArray(cerr, "REPOINDEX_WARNINGS", m_warningsArray);
}
if(!m_softwareUpgradesArray.isEmpty()) {
Utilities::printBashArray(cout, "REPOINDEX_RESULTS_SOFTWARE_UPGRADES", m_softwareUpgradesArray);
}
if(!m_packageOnlyUpgradesArray.isEmpty()) {
Utilities::printBashArray(cout, "REPOINDEX_RESULTS_PACKAGE_UPGRADES", m_packageOnlyUpgradesArray);
}
if(!m_downgradesArray.isEmpty()) {
Utilities::printBashArray(cout, "REPOINDEX_RESULTS_DOWNGRADES", m_downgradesArray);
}
if(!m_orphanedPackagesArray.isEmpty()) {
Utilities::printBashArray(cout, "REPOINDEX_RESULTS_ORPHANED", m_orphanedPackagesArray);
}
} else {
if(!m_errorsArray.isEmpty()) {
Utilities::printValues(cerr, "Errors", m_errorsArray);
}
if(!m_warningsArray.isEmpty()) {
Utilities::printValues(cerr, "Warnings", m_warningsArray);
}
if(!m_softwareUpgradesArray.isEmpty()) {
Utilities::printValues(cout, "Software upgrades", m_softwareUpgradesArray);
}
if(!m_packageOnlyUpgradesArray.isEmpty()) {
Utilities::printValues(cout, "Package upgrades", m_packageOnlyUpgradesArray);
}
if(!m_downgradesArray.isEmpty()) {
Utilities::printValues(cout, "Downgrades", m_downgradesArray);
}
if(!m_orphanedPackagesArray.isEmpty()) {
Utilities::printValues(cout, "Orphaned packages", m_orphanedPackagesArray);
}
}
// lookup done, delete this helper object
deleteLater();
}
} // namespace PackageManagement } // namespace PackageManagement

View File

@ -1,7 +1,7 @@
#ifndef PACKAGEMANAGEMENT_UPDATELOOKUP_H #ifndef PACKAGEMANAGEMENT_UPDATELOOKUP_H
#define PACKAGEMANAGEMENT_UPDATELOOKUP_H #define PACKAGEMANAGEMENT_UPDATELOOKUP_H
#include "package.h" #include "./package.h"
#include <QObject> #include <QObject>
#include <QJsonObject> #include <QJsonObject>
@ -18,15 +18,18 @@ class PackageReply;
class UpgradeResult class UpgradeResult
{ {
public: public:
UpgradeResult(const Package *package, const QString &previousVersion); UpgradeResult(const Package *package, const QString &currentVersion);
const Package *package; const Package *package;
QString previousVersion; QString currentVersion;
QJsonObject json() const; QJsonObject json() const;
}; };
/*!
* \brief Constructs a new upgrade result.
*/
inline UpgradeResult::UpgradeResult(const Package *package, const QString &previousVersion) : inline UpgradeResult::UpgradeResult(const Package *package, const QString &previousVersion) :
package(package), package(package),
previousVersion(previousVersion) currentVersion(previousVersion)
{} {}
class UpgradeLookupResults class UpgradeLookupResults
@ -103,35 +106,75 @@ class UpgradeLookup : public QObject
{ {
Q_OBJECT Q_OBJECT
friend class UpgradeLookupProcess; friend class UpgradeLookupProcess;
public: public:
explicit UpgradeLookup(const Manager &manager, const QJsonObject &request, QObject *parent = nullptr);
const Repository *toCheck() const; const Repository *toCheck() const;
signals:
void resultsAvailable(const QJsonValue &what, const QJsonValue &id, const QJsonValue &value);
private slots: private slots:
void processFinished(); virtual void processFinished() = 0;
protected:
explicit UpgradeLookup(QObject *parent = nullptr);
private:
const QJsonObject m_request;
const Repository *m_toCheck; const Repository *m_toCheck;
unsigned int m_remainingProcesses; unsigned int m_remainingProcesses;
bool m_firstFinished; bool m_firstFinished;
QSet<const Package *> m_orphanedPackages; QSet<const Package *> m_orphanedPackages;
QJsonArray m_warningsArray;
QJsonArray m_errorsArray;
QJsonArray m_softwareUpdatesArray;
QJsonArray m_packageOnlyUpdatesArray;
QJsonArray m_downgradesArray;
QJsonArray m_orphanedPackagesArray;
}; };
/*!
* \brief Returns the repository to be checked (if available; otherwise nullptr).
*/
inline const Repository *UpgradeLookup::toCheck() const inline const Repository *UpgradeLookup::toCheck() const
{ {
return m_toCheck; return m_toCheck;
} }
class UpgradeLookupJson : public UpgradeLookup
{
Q_OBJECT
public:
explicit UpgradeLookupJson(const Manager &manager, const QJsonObject &request, QObject *parent = nullptr);
signals:
void resultsAvailable(const QJsonValue &what, const QJsonValue &id, const QJsonValue &value);
private slots:
virtual void processFinished();
private:
const QJsonObject m_request;
QJsonArray m_warningsArray;
QJsonArray m_errorsArray;
QJsonArray m_softwareUpgradesArray;
QJsonArray m_packageOnlyUpgradesArray;
QJsonArray m_downgradesArray;
QJsonArray m_orphanedPackagesArray;
};
class UpgradeLookupCli : public UpgradeLookup
{
Q_OBJECT
friend class UpgradeLookupProcess;
public:
explicit UpgradeLookupCli(const Manager &manager, const std::string &repo, QObject *parent = nullptr);
const Repository *toCheck() const;
private slots:
void processFinished();
private:
void printResults();
QStringList m_warningsArray;
QStringList m_errorsArray;
QStringList m_softwareUpgradesArray;
QStringList m_packageOnlyUpgradesArray;
QStringList m_downgradesArray;
QStringList m_orphanedPackagesArray;
};
} // namespace PackageManagement } // namespace PackageManagement
#endif // PACKAGEMANAGEMENT_UPDATELOOKUP_H #endif // PACKAGEMANAGEMENT_UPDATELOOKUP_H

View File

@ -1,9 +1,11 @@
#include "utilities.h" #include "./utilities.h"
#include <QJsonObject> #include <QJsonObject>
#include <QJsonArray> #include <QJsonArray>
#include <QStringList> #include <QStringList>
#include <iostream>
using namespace std; using namespace std;
namespace RepoIndex { namespace RepoIndex {
@ -202,6 +204,24 @@ QStringList qstrlist(StringList list)
return strings; return strings;
} }
void printValues(ostream &output, const char *label, const QStringList &values)
{
output << label << ':';
for(const auto &value : values) {
output << ' ' << value.toLocal8Bit().data();
}
output << endl;
}
void printBashArray(ostream &output, const char *name, const QStringList &values)
{
output << "export " << name << '=' << '(';
for(const auto &value : values) {
output << ' ' << '\'' << value.toLocal8Bit().data() << '\'';
}
output << ' ' << ')' << endl;
}
} }
} // namespace Alpm } // namespace Alpm

View File

@ -1,7 +1,7 @@
#ifndef ALPM_UTILITIES_H #ifndef ALPM_UTILITIES_H
#define ALPM_UTILITIES_H #define ALPM_UTILITIES_H
#include "list.h" #include "./list.h"
#include <QString> #include <QString>
@ -15,7 +15,6 @@ namespace RepoIndex {
namespace Utilities { namespace Utilities {
std::list<std::string> getNames(DependencyList dependencyList); std::list<std::string> getNames(DependencyList dependencyList);
QJsonArray sigLevelStrings(alpm_siglevel_t sigLevel); QJsonArray sigLevelStrings(alpm_siglevel_t sigLevel);
QJsonArray usageStrings(alpm_db_usage_t usage); QJsonArray usageStrings(alpm_db_usage_t usage);
QString sigStatusString(alpm_sigstatus_t sigStatus); QString sigStatusString(alpm_sigstatus_t sigStatus);
@ -36,6 +35,10 @@ inline QString qstr(const std::string &str)
return QString::fromLocal8Bit(str.data()); return QString::fromLocal8Bit(str.data());
} }
void printValues(std::ostream &output, const char *label, const QStringList &values);
void printBashArray(std::ostream &output, const char *name, const QStringList &values);
} }
} // namespace Alpm } // namespace Alpm

View File

@ -1,10 +1,10 @@
#include "repoindex/alpm/manager.h" #include "./alpm/manager.h"
#include "repoindex/alpm/utilities.h" #include "./alpm/utilities.h"
#include "repoindex/alpm/config.h" #include "./alpm/config.h"
#include "repoindex/alpm/resolvebuildorder.h" #include "./alpm/resolvebuildorder.h"
#include "repoindex/alpm/mingwbundle.h" #include "./alpm/mingwbundle.h"
#include "repoindex/network/server.h" #include "./network/server.h"
#include <c++utilities/application/argumentparser.h> #include <c++utilities/application/argumentparser.h>
#include <c++utilities/conversion/stringconversion.h> #include <c++utilities/conversion/stringconversion.h>
@ -64,28 +64,15 @@ int main(int argc, char *argv[])
return application.exec(); return application.exec();
} else if(configArgs.buildOrderArg.isPresent()) { } else if(configArgs.buildOrderArg.isPresent()) {
BuildOrderResolver resolver(manager); BuildOrderResolver resolver(manager);
const QStringList results = resolver.resolve(configArgs.buildOrderArg.values()); BuildOrderResolver::printResults(resolver.resolve(configArgs.buildOrderArg.values()));
// print results
if(useShSyntax) {
cout << "export REPOINDEX_RESULTS=(";
for(const auto &pkgName : results) {
cout << ' ' << '\'' << pkgName.toLocal8Bit().data() << '\'';
}
cout << ' ' << ')' << endl;
} else {
cout << "Results: ";
for(const auto &pkgName : results) {
cout << pkgName.toLocal8Bit().data() << ' ';
}
cout << endl;
}
} else if(configArgs.mingwBundleArg.isPresent()) { } else if(configArgs.mingwBundleArg.isPresent()) {
MingwBundle bundle(manager, configArgs.mingwBundleArg.values(), configArgs.iconThemesArg.values()); MingwBundle bundle(manager, configArgs.mingwBundleArg.values(), configArgs.iconThemesArg.values());
bundle.createBundle(configArgs.targetDirArg.isPresent() ? configArgs.targetDirArg.values().front() : string("."), bundle.createBundle(configArgs.targetDirArg.isPresent() ? configArgs.targetDirArg.values().front() : string("."),
configArgs.targetNameArg.values().front(), configArgs.targetNameArg.values().front(),
configArgs.targetFormatArg.isPresent() ? configArgs.targetFormatArg.values().front() : string("zip")); configArgs.targetFormatArg.isPresent() ? configArgs.targetFormatArg.values().front() : string("zip"));
} else if(configArgs.upgradeLookupArg.isPresent()) { } else if(configArgs.upgradeLookupArg.isPresent()) {
cerr << shchar << "TODO" << endl; QObject::connect(new UpgradeLookupCli(manager, configArgs.upgradeLookupArg.values().front()), &QObject::destroyed, &application, &QCoreApplication::quit);
return application.exec();
} }
} else if(!configArgs.helpArg.isPresent()) { } else if(!configArgs.helpArg.isPresent()) {
if(useShSyntax) { if(useShSyntax) {

View File

@ -1,7 +1,7 @@
#include "connection.h" #include "./connection.h"
#include "alpm/manager.h" #include "../alpm/manager.h"
#include "alpm/upgradelookup.h" #include "../alpm/upgradelookup.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
@ -75,7 +75,7 @@ void Connection::handleQuery(const QJsonObject &obj)
m_groupInfoUpdatesRequested = obj.value(QStringLiteral("updates")).toBool(m_groupInfoUpdatesRequested); m_groupInfoUpdatesRequested = obj.value(QStringLiteral("updates")).toBool(m_groupInfoUpdatesRequested);
sendResults(what, id, m_alpmManager.groupInfo()); sendResults(what, id, m_alpmManager.groupInfo());
} else if(what == QLatin1String("checkforupdates")) { } else if(what == QLatin1String("checkforupdates")) {
connect(new UpgradeLookup(m_alpmManager, obj), &UpgradeLookup::resultsAvailable, this, &Connection::sendResult); connect(new UpgradeLookupJson(m_alpmManager, obj), &UpgradeLookupJson::resultsAvailable, this, &Connection::sendResult);
} else if(what == QLatin1String("ping")) { } else if(what == QLatin1String("ping")) {
sendResult(what, id, QStringLiteral("pong")); sendResult(what, id, QStringLiteral("pong"));
} else { } else {

View File

@ -1,7 +1,7 @@
#include "server.h" #include "server.h"
#include "connection.h" #include "connection.h"
#include "alpm/config.h" #include "../alpm/config.h"
#include <QWebSocketServer> #include <QWebSocketServer>
#include <QSslCertificate> #include <QSslCertificate>

View File

@ -1,6 +1,6 @@
#include "userrepository.h" #include "userrepository.h"
#include "alpm/aurpackage.h" #include "../alpm/aurpackage.h"
#include <c++utilities/misc/memory.h> #include <c++utilities/misc/memory.h>

View File

@ -1,8 +1,8 @@
#ifndef ALPM_USER_REPOSITORY_H #ifndef ALPM_USER_REPOSITORY_H
#define ALPM_USER_REPOSITORY_H #define ALPM_USER_REPOSITORY_H
#include "repoindex/alpm/package.h" #include "./alpm/package.h"
#include "repoindex/alpm/repository.h" #include "./alpm/repository.h"
#include <QUrl> #include <QUrl>
#include <QObject> #include <QObject>

View File

@ -252,7 +252,7 @@
newEntry.info.index = updateEntries.length; newEntry.info.index = updateEntries.length;
if(updates[i1].entries[i2].pkg) { if(updates[i1].entries[i2].pkg) {
newEntry.applyBasicInfo(updates[i1].entries[i2].pkg, true); newEntry.applyBasicInfo(updates[i1].entries[i2].pkg, true);
if(updates[i1].entries[i2].prevVersion) { if(updates[i1].entries[i2].curVer) {
newEntry.info.ver = updates[i1].entries[i2].prevVersion + " → " + (newEntry.info.ver ? newEntry.info.ver : "?"); newEntry.info.ver = updates[i1].entries[i2].prevVersion + " → " + (newEntry.info.ver ? newEntry.info.ver : "?");
} }
// find associated repo entry // find associated repo entry