diff --git a/alpm/manager.cpp b/alpm/manager.cpp index 69d12e1..f758bfe 100644 --- a/alpm/manager.cpp +++ b/alpm/manager.cpp @@ -486,6 +486,13 @@ void Manager::initAlpmDataBases() for(auto &syncDbEntry : m_syncDbMap) { QObject::connect(syncDbEntry.second, &AlpmDatabase::initialized, bind(&Manager::computeRequiredBy, this, syncDbEntry.second)); } + } else { + if(localDatabase()) { + QObject::connect(localDatabase(), &AlpmDatabase::initialized, this, &Manager::emitUpdatesAvailable); + } + for(auto &syncDbEntry : m_syncDbMap) { + QObject::connect(syncDbEntry.second, &AlpmDatabase::initialized, this, &Manager::emitUpdatesAvailable); + } } // call the init method diff --git a/alpm/package.cpp b/alpm/package.cpp index 0b4eaf7..7924084 100644 --- a/alpm/package.cpp +++ b/alpm/package.cpp @@ -38,7 +38,7 @@ Package::Package(const QString &name, Repository *repository) : m_hasAllGeneralInfo(false), m_name(name), m_requiredByComputed(false), - m_hasInstallScript(false), + m_hasInstallScript(UnknownTrueFalse::Unknown), m_hasBuildRelatedMetaData(false), m_hasInstallRelatedMetaData(false), m_validationMethods(PackageValidation::Unknown), @@ -319,7 +319,9 @@ QJsonObject Package::detailedInfo() const put(info, QStringLiteral("repl"), replaces()); put(info, QStringLiteral("pack"), packager()); put(info, QStringLiteral("expl"), QJsonValue(installReason() == InstallStatus::Explicit)); - put(info, QStringLiteral("scri"), QJsonValue(hasInstallScript())); + if(hasInstallScript() != UnknownTrueFalse::Unknown) { + put(info, QStringLiteral("scri"), QJsonValue(hasInstallScript() == UnknownTrueFalse::True)); + } put(info, QStringLiteral("sig"), Utilities::validationMethodsStrings(validationMethods())); put(info, QStringLiteral("file"), fileName()); put(info, QStringLiteral("files"), files()); @@ -361,7 +363,7 @@ void Package::writeToCacheStream(QDataStream &out) // general info out << m_hasGeneralInfo << m_hasAllGeneralInfo << m_name << m_version << m_description << m_upstreamUrl << m_licenses << m_groups << m_dependencies << m_optionalDependencies << m_conflicts << m_provides - << m_replaces << m_requiredByComputed << m_requiredBy << m_optionalFor << m_hasInstallScript; + << m_replaces << m_requiredByComputed << m_requiredBy << m_optionalFor << static_cast(m_hasInstallScript); // build related meta data out << m_hasBuildRelatedMetaData << m_fileName << m_files << m_buildDate << m_packager << m_md5 << m_sha256 << m_buildArchitecture << m_packageSize << m_makeDependencies; @@ -392,9 +394,11 @@ void Package::restoreFromCacheStream(QDataStream &in) m_origin = static_cast(tmp); // TODO: validate value in >> m_timeStamp; // general info + unsigned char tmp2; in >> m_hasGeneralInfo >> m_hasAllGeneralInfo >> m_name >> m_version >> m_description >> m_upstreamUrl >> m_licenses >> m_groups >> m_dependencies >> m_optionalDependencies >> m_conflicts >> m_provides - >> m_replaces >> m_requiredByComputed >> m_requiredBy >> m_optionalFor >> m_hasInstallScript; + >> m_replaces >> m_requiredByComputed >> m_requiredBy >> m_optionalFor >> tmp2; + m_hasInstallScript = static_cast(tmp2); // TODO: validate value // build related meta data in >> m_hasBuildRelatedMetaData >> m_fileName >> m_files >> m_buildDate >> m_packager >> m_md5 >> m_sha256 >> m_buildArchitecture >> m_packageSize >> m_makeDependencies; @@ -454,6 +458,7 @@ void Package::putInfo(const QList > &baseInfo, const QLi m_buildDate = DateTime(); m_packager.clear(); } + m_hasInstallScript = UnknownTrueFalse::False; // prevent overwriting these crucial fields with empty values QString name; @@ -559,6 +564,8 @@ void Package::putInfo(const QList > &baseInfo, const QLi m_buildDate = DateTime::fromTimeStampGmt(value.toUInt()); } else if(field == QLatin1String("packager")) { m_packager = value; + } else if(field == QLatin1String("install")) { + m_hasInstallScript = UnknownTrueFalse::True; } } } diff --git a/alpm/package.h b/alpm/package.h index e85ac00..c23446b 100644 --- a/alpm/package.h +++ b/alpm/package.h @@ -61,6 +61,15 @@ enum class InstallStatus None = 20 }; +/*! + * \brief Either unknown, true or false. + */ +enum class UnknownTrueFalse : unsigned char { + Unknown, + True, + False +}; + /*! * \brief The PackageValidation enum specifies methods used to validate a package. * \remarks ALMP type: alpm_pkgvalidation_t @@ -249,8 +258,8 @@ public: QStringList &requiredBy(); const QStringList &optionalFor() const; QStringList &optionalFor(); - bool hasInstallScript() const; - void setHasInstallScript(bool hasInstallScript); + UnknownTrueFalse hasInstallScript() const; + void setHasInstallScript(UnknownTrueFalse hasInstallScript); // build related meta data bool hasBuildRelatedMetaData() const; @@ -335,7 +344,7 @@ protected: bool m_requiredByComputed; QStringList m_requiredBy; QStringList m_optionalFor; - bool m_hasInstallScript; + UnknownTrueFalse m_hasInstallScript; // build related meta data bool m_hasBuildRelatedMetaData; @@ -583,7 +592,7 @@ inline QStringList &Package::optionalFor() /*! * \brief Returns whether the package has an install script. */ -inline bool Package::hasInstallScript() const +inline UnknownTrueFalse Package::hasInstallScript() const { return m_hasInstallScript; } @@ -591,7 +600,7 @@ inline bool Package::hasInstallScript() const /*! * \brief Sets whether the package has an install script. */ -inline void Package::setHasInstallScript(bool hasInstallScript) +inline void Package::setHasInstallScript(UnknownTrueFalse hasInstallScript) { m_hasInstallScript = hasInstallScript; } diff --git a/alpm/repository.cpp b/alpm/repository.cpp index dfb18b6..3e6fa4f 100644 --- a/alpm/repository.cpp +++ b/alpm/repository.cpp @@ -55,6 +55,11 @@ void Reply::replyFinished() } } +/*! + * \class Repository + * \brief The Repository class represents a repository (binary repositories as well as source-only repos). + */ + /*! * \fn Repository::type() * \brief Returns the type of the package source. @@ -99,9 +104,7 @@ void Repository::updateGroups() * - Alternatively the available() and initialized() signals can be used. * - Might return nullptr if initialization is tivial. In this case the available * and initialized() signals are not emitted. - * - The returned future might be not running indicating the process - * has already finished. In this case the available and initialized() signals are not emitted. - * - Locks the repository for write access. Flags the repository as busy. + * - Flags the repository as busy. */ PackageLoader *Repository::init() { @@ -126,6 +129,9 @@ PackageLoader *Repository::init() } } +/*! + * \brief Calls init() as soon as possible. + */ void Repository::initAsSoonAsPossible() { asSoonAsPossible(bind(&Repository::init, this)); @@ -148,7 +154,7 @@ void Repository::asSoonAsPossible(std::function operation) } /*! - * \brief This method can must overriden when subclassing to initialize the repository. + * \brief This method must be overriden when subclassing to initialize the repository. * \remarks * - Mustn't emit any signals. * - The repository is already locked when this method is called. Hence mustn't lock the repository. @@ -169,11 +175,6 @@ SuggestionsReply *Repository::requestSuggestions(const QString &) return nullptr; } -/*! - * \class Repository - * \brief The Repository class represents a repository (binary repositories as well as source-only repos). - */ - /*! * \brief Constructs a new repository (protected since this is a pure virtual class). */ diff --git a/alpm/upgradelookup.cpp b/alpm/upgradelookup.cpp index 277bea1..e143ed2 100644 --- a/alpm/upgradelookup.cpp +++ b/alpm/upgradelookup.cpp @@ -72,19 +72,22 @@ void UpgradeLookupProcess::requestSources() return; } // request sources if required - switch(m_upgradeSource->requestsRequired()) { - case PackageDetailAvailability::Request: - m_reply = m_upgradeSource->requestPackageInfo(m_toCheck->packageNames()); - break; - case PackageDetailAvailability::FullRequest: - m_reply = m_upgradeSource->requestFullPackageInfo(m_toCheck->packageNames()); - break; - case PackageDetailAvailability::Never: - m_results.errors << QStringLiteral("Repository \"%1\" does not provide the required information.").arg(m_upgradeSource->name()); - emit finished(); - return; - case PackageDetailAvailability::Immediately: - break; + { + QReadLocker srcLocker(m_upgradeSource->lock()), toCheckLocker(m_toCheck->lock()); + switch(m_upgradeSource->requestsRequired()) { + case PackageDetailAvailability::Request: + m_reply = m_upgradeSource->requestPackageInfo(m_toCheck->packageNames()); + break; + case PackageDetailAvailability::FullRequest: + m_reply = m_upgradeSource->requestFullPackageInfo(m_toCheck->packageNames()); + break; + case PackageDetailAvailability::Never: + m_results.errors << QStringLiteral("Repository \"%1\" does not provide the required information.").arg(m_upgradeSource->name()); + emit finished(); + return; + case PackageDetailAvailability::Immediately: + break; + } } if(m_reply) { // a request is required -> wait until results are available diff --git a/resources/icons/hicolor/scalable/apps/repoindex.svg b/resources/icons/hicolor/scalable/apps/repoindex.svg index aad35d2..5f002a8 100644 --- a/resources/icons/hicolor/scalable/apps/repoindex.svg +++ b/resources/icons/hicolor/scalable/apps/repoindex.svg @@ -100,9 +100,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.98994949" - inkscape:cx="172.38789" - inkscape:cy="222.01635" + inkscape:zoom="1.4" + inkscape:cx="63.25466" + inkscape:cy="166.54688" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -183,78 +183,74 @@ d="m 298.74404,658.26061 -2.11338,172.15066 -146.8618,-84.02688 4.22513,-167.16276 z" sodipodi:nodetypes="ccccc" /> - - - - - - - - - - - - - - - - - + transform="matrix(0.22565866,-0.07957942,0,0.22565866,245.20373,740.17574)" + id="g2809" + style="fill:#ffffff;fill-opacity:1"> + + + + + + + + + + + + + + + diff --git a/web/js/packagemanagement.js b/web/js/packagemanagement.js index 9c7d711..d5cfb47 100644 --- a/web/js/packagemanagement.js +++ b/web/js/packagemanagement.js @@ -208,7 +208,9 @@ repoindex.addField(tb, "Install date", repoindex.makeStr(details.idate)); repoindex.addField(tb, "Install reason", details.expl ? "explicitly installed" : "installed as dependency"); } - repoindex.addField(tb, "Install script", repoindex.makeBool(details.scri)); + if(details.scri !== undefined) { + repoindex.addField(tb, "Install script", repoindex.makeBool(details.scri)); + } repoindex.addField(tb, "Validation methods", repoindex.makeArray(details.sig, ", ")); repoindex.setTree(repoindex.addField(tb, "Package files"), repoindex.makeTree(details.files)); }