use map to assign description fields

This commit is contained in:
Martchus 2016-02-15 01:27:50 +01:00
parent 1d6761ddd8
commit 992c000751
6 changed files with 230 additions and 137 deletions

View File

@ -609,15 +609,6 @@ void Manager::maintainCache()
writeCache();
}
/*!
* \brief Unregisters all registred sync databases.
* \remarks TODO
*/
void Manager::unregisterSyncDataBases()
{
}
/*!
* \brief Returns a list of all sync databases.
* \remarks Sync databases must be registered with parsePacmanConfig() before.

View File

@ -63,8 +63,6 @@ public:
void wipeCache();
void maintainCache();
void unregisterSyncDataBases();
// package lookup
AlpmPackage *packageFromDatabase(const QString &dbName, const QString &pkgName);
const AlpmPackage *packageFromDatabase(const QString &dbName, const QString &pkgName) const;

View File

@ -13,8 +13,10 @@
#include <QStringBuilder>
#include <iostream>
#include <functional>
using namespace std;
using namespace std::placeholders;
using namespace ChronoUtilities;
namespace RepoIndex {
@ -585,34 +587,187 @@ void Package::putInfo(const QList<QPair<QString, QString> > &baseInfo, const QLi
* \cond
*/
inline void put(QString &lhs, const QStringList &rhs)
#define PUT_DEPS(lhs, rhs) \
lhs.reserve(rhs.size()); \
for(const QString &dep : rhs) { \
lhs << Dependency(dep); \
} \
const map<QString, void(Package::*)(const QStringList &)> Package::m_descMap {
{QStringLiteral("NAME"), &Package::setName},
{QStringLiteral("VERSION"), &Package::setVersion},
{QStringLiteral("DESC"), &Package::setDescription},
{QStringLiteral("URL"), &Package::setUrl},
{QStringLiteral("ARCH"), &Package::setArch},
{QStringLiteral("LICENSE"), &Package::setLicenses},
{QStringLiteral("DEPENDS"), &Package::setDepends},
{QStringLiteral("MAKEDEPENDS"), &Package::setMakeDepends},
{QStringLiteral("CHECKDEPENDS"), &Package::setCheckDepends},
{QStringLiteral("OPTDEPENDS"), &Package::setOptDepends},
{QStringLiteral("CONFLICTS"), &Package::setConflicts},
{QStringLiteral("PROVIDES"), &Package::setProvides},
{QStringLiteral("REPLACES"), &Package::setReplaces},
{QStringLiteral("BUILDDATE"), &Package::setBuildDate},
{QStringLiteral("INSTALLDATE"), &Package::setInstallDate},
{QStringLiteral("ISIZE"), &Package::setInstalledSize},
{QStringLiteral("SIZE"), &Package::setInstalledSize},
{QStringLiteral("CSIZE"), &Package::setPackageSize},
{QStringLiteral("PACKAGER"), &Package::setPackager},
{QStringLiteral("MD5SUM"), &Package::setMd5},
{QStringLiteral("SHA256SUM"), &Package::setSha256},
{QStringLiteral("FILES"), &Package::setFiles},
{QStringLiteral("REASON"), &Package::setInstallReason},
{QStringLiteral("VALIDATION"), &Package::setValidation},
{QStringLiteral("GROUPS"), &Package::setGroups},
{QStringLiteral("FILENAME"), &Package::setFileName}
};
void Package::setName(const QStringList &values)
{
if(!rhs.isEmpty()) {
lhs = rhs.back();
if(!values.isEmpty() && !values.back().isEmpty()) {
m_name = values.back();
}
}
inline void put(QList<Dependency> &lhs, const QStringList &rhs)
void Package::setVersion(const QStringList &values)
{
lhs.reserve(rhs.size());
for(const QString &dep : rhs) {
lhs << Dependency(dep);
if(!values.isEmpty() && !values.back().isEmpty()) {
m_version = values.back();
}
}
inline void put(QJsonArray &lhs, const QStringList &rhs)
void Package::setDescription(const QStringList &values)
{
for(const QString &value : rhs) {
lhs << value;
if(!values.isEmpty()) {
m_description = values.back();
}
}
inline void putFiles(QJsonArray &lhs, const QStringList &rhs)
void Package::setUrl(const QStringList &values)
{
for(const QString &value : rhs) {
if(!values.isEmpty()) {
m_upstreamUrl = values.back();
}
}
void Package::setArch(const QStringList &values)
{
if(!values.isEmpty()) {
m_buildArchitecture = values.back();
}
}
void Package::setLicenses(const QStringList &values)
{
m_licenses = values;
}
void Package::setDepends(const QStringList &values)
{
PUT_DEPS(m_dependencies, values);
}
void Package::setMakeDepends(const QStringList &values)
{
PUT_DEPS(m_makeDependencies, values);
}
void Package::setCheckDepends(const QStringList &values)
{
PUT_DEPS(m_checkDependencies, values);
}
void Package::setOptDepends(const QStringList &values)
{
PUT_DEPS(m_optionalDependencies, values);
}
void Package::setConflicts(const QStringList &values)
{
PUT_DEPS(m_conflicts, values);
}
void Package::setProvides(const QStringList &values)
{
PUT_DEPS(m_provides, values);
}
void Package::setReplaces(const QStringList &values)
{
PUT_DEPS(m_replaces, values);
}
void Package::setBuildDate(const QStringList &values)
{
if(!values.isEmpty()) {
m_buildDate = DateTime::fromTimeStampGmt(values.back().toUInt());
}
}
void Package::setInstallDate(const QStringList &values)
{
if(!values.isEmpty()) {
m_installDate = DateTime::fromTimeStampGmt(values.back().toUInt());
}
}
void Package::setInstalledSize(const QStringList &values)
{
if(!values.empty()) {
m_installedSize = values.back().toUInt();
m_hasInstallRelatedMetaData = true;
}
}
void Package::setPackageSize(const QStringList &values)
{
if(!values.empty()) {
m_packageSize = values.back().toUInt();
}
}
void Package::setPackager(const QStringList &values)
{
if(!values.isEmpty()) {
m_packager = values.back();
}
}
void Package::setMd5(const QStringList &values)
{
if(!values.isEmpty()) {
m_md5 = values.back();
}
}
void Package::setSha256(const QStringList &values)
{
if(!values.isEmpty()) {
m_sha256 = values.back();
}
}
void Package::setFiles(const QStringList &values)
{
m_files = QJsonArray();
for(const QString &value : values) {
QJsonObject fileObj;
fileObj.insert(QStringLiteral("name"), value);
lhs << fileObj;
m_files << fileObj;
}
}
void Package::setValidation(const QStringList &values)
{
if(!values.isEmpty()) {
for(const QString &value : values) {
if(value == QLatin1String("md5")) {
m_validationMethods = m_validationMethods | PackageValidation::Md5Sum;
} else if(value == QLatin1String("sha256")) {
m_validationMethods = m_validationMethods | PackageValidation::Sha256Sum;
} else if(value == QLatin1String("pgp")) {
m_validationMethods = m_validationMethods | PackageValidation::Signature;
} else {
// TODO: error handling (imporant?)
}
}
}
m_hasInstallRelatedMetaData = true;
}
void Package::setGroups(const QStringList &values)
{
m_groups = values;
}
void Package::setFileName(const QStringList &values)
{
if(!values.isEmpty()) {
m_fileName = values.back();
}
}
void Package::setInstallReason(const QStringList &values)
{
if(!values.isEmpty()) {
m_installReason = values.back().toUInt() == 1 ? InstallStatus::AsDependency : InstallStatus::Explicit;
}
}
@ -628,8 +783,13 @@ inline void putFiles(QJsonArray &lhs, const QStringList &rhs)
* - Actual parsing of desc/depends/files is done in Repository::addPackagesFromSrcInfo() because one info file
* applies to multiple packages in case of split packages.
*/
void Package::putDescription(QString name, const QList<QPair<QString, QStringList> > &description, PackageOrigin origin)
void Package::putDescription(const QString &name, const QList<QPair<QString, QStringList> > &description, PackageOrigin origin)
{
// set name
if(!name.isEmpty()) {
m_name = name;
}
// clear current meta data
m_origin = origin;
m_hasInstallRelatedMetaData = origin == PackageOrigin::LocalDb;
@ -650,103 +810,17 @@ void Package::putDescription(QString name, const QList<QPair<QString, QStringLis
m_files = QJsonArray();
m_md5.clear();
m_sha256.clear();
m_installReason = InstallStatus::None;
m_installReason = origin == PackageOrigin::LocalDb ? InstallStatus::Explicit : InstallStatus::None;
m_validationMethods = PackageValidation::Unknown;
// prevent overwriting these crucial fields with empty values
PackageVersion version;
// asign fields
for(const auto &pair : description) {
const auto &field = pair.first;
const auto &values = pair.second;
if(field == QLatin1String("FILENAME")) {
put(m_fileName, values);
} else if(field == QLatin1String("NAME")) {
put(name, values);
} else if(field == QLatin1String("VERSION")) {
if(!values.isEmpty()) {
version = PackageVersion(values.back());
}
} else if(field == QLatin1String("DESC")) {
put(m_description, values);
} else if(field == QLatin1String("URL")) {
put(m_upstreamUrl, values);
} else if(field == QLatin1String("ARCH")) {
put(m_buildArchitecture, values);
} else if(field == QLatin1String("LICENSE")) {
m_licenses = values;
} else if(field == QLatin1String("DEPENDS")) {
put(m_dependencies, values);
} else if(field == QLatin1String("MAKEDEPENDS")) {
put(m_makeDependencies, values);
} else if(field == QLatin1String("CHECKDEPENDS")) {
put(m_checkDependencies, values);
} else if(field == QLatin1String("OPTDEPENDS")) {
put(m_optionalDependencies, values);
} else if(field == QLatin1String("CONFLICTS")) {
put(m_conflicts, values);
} else if(field == QLatin1String("PROVIDES")) {
put(m_provides, values);
} else if(field == QLatin1String("REPLACES")) {
put(m_replaces, values);
} else if(field == QLatin1String("BUILDDATE")) {
if(!values.isEmpty()) {
m_buildDate = DateTime::fromTimeStampGmt(values.back().toUInt());
}
} else if(field == QLatin1String("INSTALLDATE")) {
if(!values.isEmpty()) {
m_installDate = DateTime::fromTimeStampGmt(values.back().toUInt());
m_hasInstallRelatedMetaData = true;
}
} else if(field == QLatin1String("ISIZE") || field == QLatin1String("SIZE")) {
if(!values.empty()) {
m_installedSize = values.back().toUInt();
m_hasInstallRelatedMetaData = true;
}
} else if(field == QLatin1String("CSIZE")) {
if(!values.empty()) {
m_packageSize = values.back().toUInt();
}
} else if(field == QLatin1String("PACKAGER")) {
put(m_packager, values);
} else if(field == QLatin1String("MD5SUM")) {
put(m_md5, values);
} else if(field == QLatin1String("SHA256SUM")) {
put(m_sha256, values);
} else if(field == QLatin1String("FILES")) {
putFiles(m_files, values);
} else if(field == QLatin1String("REASON")) {
if(!values.isEmpty()) {
m_installReason = values.back().toUInt() == 1 ? InstallStatus::AsDependency : InstallStatus::Explicit;
}
} else if(field == QLatin1String("VALIDATION")) {
if(!values.isEmpty()) {
for(const QString &value : values) {
if(value == QLatin1String("md5")) {
m_validationMethods = m_validationMethods | PackageValidation::Md5Sum;
} else if(value == QLatin1String("sha256")) {
m_validationMethods = m_validationMethods | PackageValidation::Sha256Sum;
} else if(value == QLatin1String("pgp")) {
m_validationMethods = m_validationMethods | PackageValidation::Signature;
} else {
// TODO: error handling (imporant?)
}
}
}
m_hasInstallRelatedMetaData = true;
} else if(field == QLatin1String("GROUPS")) {
m_groups = values;
try {
(this->*m_descMap.at(pair.first))(pair.second);
} catch(const out_of_range &) {
}
}
// ensure crucial information is still present (use old values rather than no values)
if(!name.isEmpty()) {
m_name = name;
}
if(!version.version.isEmpty()) {
m_version = version.toString();
}
// description provides source related meta data, too (except pkgbase, TODO: special flag required?)
m_hasBuildRelatedMetaData = m_hasSourceRelatedMetaData = true;
}

View File

@ -8,6 +8,7 @@
#include <QJsonArray>
#include <map>
#include <functional>
QT_FORWARD_DECLARE_CLASS(QJsonObject)
QT_FORWARD_DECLARE_CLASS(QJsonValue)
@ -288,7 +289,7 @@ public:
// parsing .SRCINFO/.PKGINFO/desc/depends/files info
void putInfo(const QList<QPair<QString, QString> > &baseInfo, const QList<QPair<QString, QString> > &pkgInfo, bool includesSourceRelatedMetaData = false, bool includesBuildRelatedMetaData = false);
void putDescription(QString name, const QList<QPair<QString, QStringList> > &description, PackageOrigin origin);
void putDescription(const QString &name, const QList<QPair<QString, QStringList> > &description, PackageOrigin origin);
void putSourceFile(const QString &path, const QByteArray &data);
protected:
@ -353,6 +354,34 @@ protected:
ChronoUtilities::DateTime m_lastModified;
QString m_tarUrl;
std::map<QString, QByteArray> m_sourceFiles;
// setter used in putDescription
static const std::map<QString, void(Package::*)(const QStringList &)> m_descMap;
void setName(const QStringList &values);
void setVersion(const QStringList &values);
void setDescription(const QStringList &values);
void setUrl(const QStringList &values);
void setArch(const QStringList &values);
void setLicenses(const QStringList &values);
void setDepends(const QStringList &values);
void setMakeDepends(const QStringList &values);
void setCheckDepends(const QStringList &values);
void setOptDepends(const QStringList &values);
void setConflicts(const QStringList &values);
void setProvides(const QStringList &values);
void setReplaces(const QStringList &values);
void setBuildDate(const QStringList &values);
void setInstallDate(const QStringList &values);
void setInstalledSize(const QStringList &values);
void setPackageSize(const QStringList &values);
void setPackager(const QStringList &values);
void setMd5(const QStringList &values);
void setSha256(const QStringList &values);
void setFiles(const QStringList &values);
void setValidation(const QStringList &values);
void setGroups(const QStringList &values);
void setFileName(const QStringList &values);
void setInstallReason(const QStringList &values);
};
/*!

View File

@ -363,17 +363,17 @@ QJsonObject Repository::packagesObjectSkeleton() const
* \cond
*/
inline void put(QJsonObject &obj, const QString &key, const QJsonValue &value)
inline void putString(QJsonObject &obj, const QString &key, const QJsonValue &value)
{
if(!value.isNull()) {
obj.insert(key, value);
}
}
inline void put(QJsonObject &obj, const QString &key, const QStringList &values)
inline void putString(QJsonObject &obj, const QString &key, const QStringList &values)
{
if(!values.isEmpty()) {
put(obj, key, QJsonArray::fromStringList(values));
putString(obj, key, QJsonArray::fromStringList(values));
}
}
@ -388,22 +388,22 @@ QJsonObject Repository::basicInfo(bool includeName) const
{
QJsonObject info;
if(includeName) {
put(info, QStringLiteral("name"), name());
putString(info, QStringLiteral("name"), name());
}
if(index() != invalidIndex) {
info.insert(QStringLiteral("index"), static_cast<int>(index()));
}
put(info, QStringLiteral("desc"), description());
put(info, QStringLiteral("servers"), serverUrls());
put(info, QStringLiteral("usage"), Utilities::usageStrings(usage()));
put(info, QStringLiteral("sigLevel"), Utilities::sigLevelStrings(sigLevel()));
put(info, QStringLiteral("upgradeSources"), upgradeSourcesJsonArray());
put(info, QStringLiteral("packages"), packagesObjectSkeleton());
putString(info, QStringLiteral("desc"), description());
putString(info, QStringLiteral("servers"), serverUrls());
putString(info, QStringLiteral("usage"), Utilities::usageStrings(usage()));
putString(info, QStringLiteral("sigLevel"), Utilities::sigLevelStrings(sigLevel()));
putString(info, QStringLiteral("upgradeSources"), upgradeSourcesJsonArray());
putString(info, QStringLiteral("packages"), packagesObjectSkeleton());
if(requestsRequired(PackageDetail::Basics) == PackageDetailAvailability::Immediately) {
info.insert(QStringLiteral("packageCount"), static_cast<qint64>(m_packages.size()));
}
put(info, QStringLiteral("srcOnly"), isSourceOnly());
put(info, QStringLiteral("pkgOnly"), isPackageOnly());
putString(info, QStringLiteral("srcOnly"), isSourceOnly());
putString(info, QStringLiteral("pkgOnly"), isPackageOnly());
return info;
}
@ -413,16 +413,16 @@ QJsonObject Repository::basicInfo(bool includeName) const
QJsonObject Repository::groupInfo() const
{
QJsonObject info;
put(info, QStringLiteral("repo"), name());
putString(info, QStringLiteral("repo"), name());
QJsonArray groupsArray;
for(const auto &groupEntry : groups()) {
QJsonObject info;
put(info, QStringLiteral("name"), groupEntry.first);
putString(info, QStringLiteral("name"), groupEntry.first);
QJsonArray pkgNames;
for(const auto *pkg : groupEntry.second) {
pkgNames << pkg->name();
}
put(info, QStringLiteral("pkgs"), pkgNames);
putString(info, QStringLiteral("pkgs"), pkgNames);
groupsArray << info;
}
info.insert(QStringLiteral("groups"), groupsArray);
@ -664,6 +664,7 @@ void Repository::parsePkgInfo(const QByteArray &pkgInfo, QString &name, QList<QP
void Repository::parseDescriptions(const QList<QByteArray> &descriptions, QString &name, QList<QPair<QString, QStringList> > &fields)
{
// define variables to store parsing results
fields.reserve(32);
QByteArray currentFieldName;
currentFieldName.reserve(16);
QByteArray currentFieldValue;

View File

@ -115,9 +115,9 @@ QJsonArray validationMethodsStrings(PackageValidation validationMethods)
if(validationMethods & PackageValidation::Signature) {
jsonArray << QStringLiteral("signature");
}
if(jsonArray.empty()) {
jsonArray << QStringLiteral("unknown");
}
//if(jsonArray.empty()) {
// jsonArray << QStringLiteral("unknown");
//}
return jsonArray;
}