repoindex/lib/alpm/resolvebuildorder.h

108 lines
2.5 KiB
C++

#ifndef PACKAGEMANAGEMENT_RESOLVEBUILDORDER_H
#define PACKAGEMANAGEMENT_RESOLVEBUILDORDER_H
#include <c++utilities/application/argumentparser.h>
#include <QObject>
#include <QString>
#include <QList>
#include <memory>
namespace RepoIndex {
class Manager;
class TaskInfo;
class Dependency;
class Package;
class PackageFinder;
class BuildOrderResolver : public QObject
{
Q_OBJECT
public:
~BuildOrderResolver();
QStringList resultNames();
bool hasFinished() const;
const QString &errorMessage() const;
public Q_SLOTS:
void findDependencies();
void printRelevantPackages();
void printResults();
void resolve();
Q_SIGNALS:
void ready();
void resolvingFinished();
void resolvingFailed(const QString &message);
protected:
BuildOrderResolver(Manager &manager, bool addSourceOnlyDeps = false, bool requireSources = true);
Manager &manager();
QList<TaskInfo *> &tasks();
private:
void addError(const QString &errorMessage);
Package *findPackageForDependency(const Dependency &dependency, bool sourceRequired);
bool addDependenciesToTask(TaskInfo *task);
bool addDependenciesToTask(TaskInfo *task, const QList<const QList<Dependency> *> &dependencies);
void requestDependenciesToBeRequested();
Manager &m_manager;
QList<TaskInfo *> m_tasks;
QList<Dependency> m_dependenciesToBeRequested;
std::unique_ptr<PackageFinder> m_finder;
QList<TaskInfo *> m_results;
bool m_addSourceOnlyDeps;
bool m_requireSources;
bool m_hasFinished;
QString m_errorMessage;
};
/*!
* \brief Returns whether adding dependencies/resolving the build order has been finished.
* \remarks Also true when an error occured. In this case errorMessage() is not empty.
*/
inline bool BuildOrderResolver::hasFinished() const
{
return m_hasFinished;
}
/*!
* \brief Returns the error message if an error occured.
*/
inline const QString &BuildOrderResolver::errorMessage() const
{
return m_errorMessage;
}
/*!
* \brief Returns the manager used to find packages.
*/
inline Manager &BuildOrderResolver::manager()
{
return m_manager;
}
/*!
* \brief Returns the tasks.
*/
inline QList<TaskInfo *> &BuildOrderResolver::tasks()
{
return m_tasks;
}
class BuildOrderResolverCli : public BuildOrderResolver
{
Q_OBJECT
public:
BuildOrderResolverCli(Manager &manager, const std::vector<const char *> &packages, bool addSourceOnlyDeps = false, bool requireSources = true);
int exec();
};
} // namespace PackageManagement
#endif // PACKAGEMANAGEMENT_RESOLVEBUILDORDER_H