diff options
65 files changed, 2501 insertions, 2650 deletions
diff --git a/Jamroot.jam b/Jamroot.jam index 6fb1bd3..1bd4766 100644 --- a/Jamroot.jam +++ b/Jamroot.jam @@ -35,8 +35,41 @@ project <variant>coverage:<coverage>on <toolset>tidy:<define>ICE_IGNORE_VERSION <toolset>tidy:<define>ICE_MEMBER_IMPORT_EXPORT - <toolset>tidy:<exclude>cxxstd-20-iso/maintenance.h + <toolset>tidy:<exclude>users.cpp + <toolset>tidy:<exclude>user-models.cpp + <toolset>tidy:<exclude>news-models.cpp + <toolset>tidy:<exclude>extended-models.cpp + <toolset>tidy:<exclude>portage-models.cpp + <toolset>tidy:<exclude>portage.cpp + <toolset>tidy:<exclude>maintenance.h + <toolset>tidy:<exclude>maintenance.cpp + <toolset>tidy:<exclude>notifications.h + <toolset>tidy:<exclude>notifications.cpp + <toolset>tidy:<exclude>notifications/xslt/base.h + <toolset>tidy:<exclude>notifications/xslt/base.cpp + <toolset>tidy:<exclude>notifications/xslt/news.h + <toolset>tidy:<exclude>notifications/xslt/news.cpp + <toolset>tidy:<exclude>notifications/xslt/signup.h + <toolset>tidy:<exclude>notifications/xslt/signup.cpp + <toolset>tidy:<exclude>notifications/css/style.h + <toolset>tidy:<exclude>notifications/css/style.cpp <toolset>tidy:<exclude>unpackPqTextArray.cpp + <toolset>tidy:<checkxx>boost-* + <toolset>tidy:<checkxx>bugprone-* + <toolset>tidy:<xcheckxx>bugprone-implicit-widening-of-multiplication-result + <toolset>tidy:<xcheckxx>bugprone-easily-swappable-parameters + <toolset>tidy:<xcheckxx>bugprone-macro-parentheses + <toolset>tidy:<checkxx>clang-* + <toolset>tidy:<checkxx>misc-* + <toolset>tidy:<xcheckxx>misc-non-private-member-variables-in-classes + <toolset>tidy:<checkxx>modernize-* + <toolset>tidy:<xcheckxx>modernize-use-trailing-return-type + <toolset>tidy:<checkxx>hicpp-* + <toolset>tidy:<xcheckxx>hicpp-vararg + <toolset>tidy:<xcheckxx>hicpp-signed-bitwise + <toolset>tidy:<xcheckxx>hicpp-named-parameter + <toolset>tidy:<xcheckxx>hicpp-no-array-decay + <toolset>tidy:<checkxx>performance-* <toolset>tidy:<librarydef>boost <toolset>tidy:<librarydef>std ; diff --git a/gentoobrowse-api/client/helpers.h b/gentoobrowse-api/client/helpers.h index 4caf7f9..2691498 100644 --- a/gentoobrowse-api/client/helpers.h +++ b/gentoobrowse-api/client/helpers.h @@ -1,5 +1,4 @@ -#ifndef GENTOOBROWSE_CLIENT_HELPERS_H -#define GENTOOBROWSE_CLIENT_HELPERS_H +#pragma once #include <Ice/AsyncResult.h> #include <Ice/ObjectAdapter.h> @@ -24,5 +23,3 @@ asyncMapRelated(const Collection & collection, const Proxy & p, Key CollectionMe } return rtn; } - -#endif diff --git a/gentoobrowse-api/client/main.cpp b/gentoobrowse-api/client/main.cpp index 56f0a4b..e82f5a3 100644 --- a/gentoobrowse-api/client/main.cpp +++ b/gentoobrowse-api/client/main.cpp @@ -1,7 +1,7 @@ #include "main.h" -#include "stdio.h" #include <Ice/Ice.h> #include <boost/program_options.hpp> +#include <cstdio> #include <plugins.impl.h> #include <portage.h> diff --git a/gentoobrowse-api/client/main.h b/gentoobrowse-api/client/main.h index 9c7ccef..8aeada6 100644 --- a/gentoobrowse-api/client/main.h +++ b/gentoobrowse-api/client/main.h @@ -1,5 +1,4 @@ -#ifndef GENTOO_MAIN_H -#define GENTOO_MAIN_H +#pragma once #include <plugins.h> #include <portage.h> @@ -10,5 +9,3 @@ class Module : public AdHoc::AbstractPluginImplementation { public: virtual void run(const Gentoo::PortagePrxPtr &, const std::vector<std::string> &) const = 0; }; - -#endif diff --git a/gentoobrowse-api/domain/converters.h b/gentoobrowse-api/domain/converters.h index 07188fa..db72c0f 100644 --- a/gentoobrowse-api/domain/converters.h +++ b/gentoobrowse-api/domain/converters.h @@ -1,5 +1,4 @@ -#ifndef something -#define something +#pragma once #include <boost/date_time/posix_time/posix_time.hpp> #include <portage-models.h> @@ -21,5 +20,3 @@ namespace Slicer { DLL_PUBLIC std::string posixTimeToShortDate(const boost::posix_time::ptime & s); } - -#endif diff --git a/gentoobrowse-api/domain/converters.impl.h b/gentoobrowse-api/domain/converters.impl.h index 6ba15fa..38a674e 100644 --- a/gentoobrowse-api/domain/converters.impl.h +++ b/gentoobrowse-api/domain/converters.impl.h @@ -1,5 +1,4 @@ -#ifndef GENTOOBROWSE_API_DOMAIN_CONVERTERS_IMPL_H -#define GENTOOBROWSE_API_DOMAIN_CONVERTERS_IMPL_H +#pragma once #include "unpackPqTextArray.h" #include <boost/lexical_cast.hpp> @@ -72,5 +71,3 @@ namespace Slicer { return ss.str(); } } - -#endif diff --git a/gentoobrowse-api/domain/unpackPqTextArray.h b/gentoobrowse-api/domain/unpackPqTextArray.h index b1b2857..6e39f52 100644 --- a/gentoobrowse-api/domain/unpackPqTextArray.h +++ b/gentoobrowse-api/domain/unpackPqTextArray.h @@ -1,5 +1,4 @@ -#ifndef JSONFLEXLEXER_H -#define JSONFLEXLEXER_H +#pragma once #include <portage-models.h> #ifndef yyFlexLexer @@ -21,5 +20,3 @@ namespace Slicer { std::string buffer; }; } - -#endif diff --git a/gentoobrowse-api/service/changeSet.h b/gentoobrowse-api/service/changeSet.h index ab83656..c8508dd 100644 --- a/gentoobrowse-api/service/changeSet.h +++ b/gentoobrowse-api/service/changeSet.h @@ -6,14 +6,12 @@ #include <map> #include <portage-models.h> -namespace Gentoo { - namespace Service { - struct ChangeDetails { - StringList pathParts; - git_delta_t changeType; - }; - typedef std::map<std::filesystem::path, ChangeDetails> ChangeSet; - } +namespace Gentoo::Service { + struct ChangeDetails { + StringList pathParts; + git_delta_t changeType {}; + }; + using ChangeSet = std::map<std::filesystem::path, ChangeDetails, std::less<>>; } #endif diff --git a/gentoobrowse-api/service/depend.cpp b/gentoobrowse-api/service/depend.cpp index 8b2e29b..c707e82 100644 --- a/gentoobrowse-api/service/depend.cpp +++ b/gentoobrowse-api/service/depend.cpp @@ -2,97 +2,95 @@ #include "wrap/regex.h" #include <lexer-regex.h> -AdHoc::Lexer::PatternPtr WhenUse_Begin( - AdHoc::LexerMatchers::regex("\\s*(!?[[:alnum:]-_@]+)\\?\\s*\\(\\s*", G_REGEX_OPTIMIZE)); -AdHoc::Lexer::PatternPtr WhenUse_End(AdHoc::LexerMatchers::regex("\\s*\\)\\s*", G_REGEX_OPTIMIZE)); -AdHoc::Lexer::PatternPtr Or_Begin(AdHoc::LexerMatchers::regex("\\s*\\|\\|\\s*\\(\\s*", G_REGEX_OPTIMIZE)); -AdHoc::Lexer::PatternPtr Or_Group(AdHoc::LexerMatchers::regex("\\s*\\(\\s*", G_REGEX_OPTIMIZE)); -AdHoc::Lexer::PatternPtr Or_End(AdHoc::LexerMatchers::regex("\\s*\\)\\s*", G_REGEX_OPTIMIZE)); -AdHoc::Lexer::PatternPtr AtomSpec(AdHoc::LexerMatchers::regex( - "\\s*" - "([[:punct:]]+)?" // op - "([[:alnum:]-]+)\\/" // cat - "([^ ]+)" // package - "(-([0-9][.0-9]*[[:alpha:]]?\\*?((_(alpha|beta|pre|rc|p))?[[:digit:]]*)*(-r[[:digit:]]+)?))?" // version - "(:([^/ []+(\\/[^ []+)?))?" // slot - "(\\[([^]]+)\\])?(\\s+|$)", - static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_UNGREEDY))); // use +namespace Portage::Utils { + AdHoc::Lexer::PatternPtr WhenUse_Begin( + AdHoc::LexerMatchers::regex(R"(\s*(!?[[:alnum:]-_@]+)\?\s*\(\s*)", G_REGEX_OPTIMIZE)); + AdHoc::Lexer::PatternPtr WhenUse_End(AdHoc::LexerMatchers::regex(R"(\s*\)\s*)", G_REGEX_OPTIMIZE)); + AdHoc::Lexer::PatternPtr Or_Begin(AdHoc::LexerMatchers::regex(R"(\s*\|\|\s*\(\s*)", G_REGEX_OPTIMIZE)); + AdHoc::Lexer::PatternPtr Or_Group(AdHoc::LexerMatchers::regex(R"(\s*\(\s*)", G_REGEX_OPTIMIZE)); + AdHoc::Lexer::PatternPtr Or_End(AdHoc::LexerMatchers::regex(R"(\s*\)\s*)", G_REGEX_OPTIMIZE)); + AdHoc::Lexer::PatternPtr AtomSpec(AdHoc::LexerMatchers::regex( + "\\s*" + "([[:punct:]]+)?" // op + "([[:alnum:]-]+)\\/" // cat + "([^ ]+)" // package + "(-([0-9][.0-9]*[[:alpha:]]?\\*?((_(alpha|beta|pre|rc|p))?[[:digit:]]*)*(-r[[:digit:]]+)?))?" // version + "(:([^/ []+(\\/[^ []+)?))?" // slot + "(\\[([^]]+)\\])?(\\s+|$)", + static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_UNGREEDY))); // use -const std::string InWhen("InWhen"); -const std::string InOr("InOr"); + const std::string InWhen("InWhen"); + const std::string InOr("InOr"); -namespace Portage { - namespace Utils { - template<typename T, typename Y> - Ice::optional<T> - iuo(const std::optional<Y> & x) - { - if (x) { - return Ice::optional<T>(*x); - } - return Ice::optional<T>(); + template<typename T, typename Y> + Ice::optional<T> + iuo(const std::optional<Y> & x) + { + if (x) { + return Ice::optional<T>(*x); } + return Ice::optional<T>(); + } - template<typename T, typename Y> - std::vector<T> - split(const std::optional<Y> & x) - { - std::vector<T> rtn; - if (x) { - Glib::Regex::split_simple(",", *x).assign_to(rtn); - std::sort(rtn.begin(), rtn.end()); - } - return rtn; + template<typename T, typename Y> + std::vector<T> + split(const std::optional<Y> & x) + { + std::vector<T> rtn; + if (x) { + Glib::Regex::split_simple(",", *x).assign_to(rtn); + std::sort(rtn.begin(), rtn.end()); } + return rtn; + } - Depend::Depend() : - AdHoc::Lexer({// use? ( - {{InitialState, InWhen, InOr}, WhenUse_Begin, - [this](auto es) { - es->pushState(InWhen); - when.push_back(*es->pattern()->match(1)); - }}, - // ) - {{InWhen}, WhenUse_End, - [this](auto es) { - es->popState(); - when.pop_back(); - }}, - // || ( - {{InitialState, InWhen, InOr}, Or_Begin, - [](auto es) { - es->pushState(InOr); - }}, - // ( - {{InitialState, InWhen, InOr}, Or_Group, - [](auto es) { - es->pushState(InOr); - }}, - // ) - {{InOr}, Or_End, - [](auto es) { - es->popState(); - }}, - // [op]some-cat/package[-version][:slot][uses] - {{InitialState, InWhen, InOr}, AtomSpec, [this](auto es) { - ds.push_back(std::make_shared<Gentoo::Dependency>(when, - iuo<std::string>(es->pattern()->match(1)), // op - *es->pattern()->match(2), // category - *es->pattern()->match(3), // package - iuo<std::string>(es->pattern()->match(5)), // version - iuo<std::string>(es->pattern()->match(11)), // slot - split<std::string>(es->pattern()->match(14)) // use - )); - }}}) - { - } + Depend::Depend() : + AdHoc::Lexer({// use? ( + {{InitialState, InWhen, InOr}, WhenUse_Begin, + [this](auto es) { + es->pushState(InWhen); + when.push_back(*es->pattern()->match(1)); + }}, + // ) + {{InWhen}, WhenUse_End, + [this](auto es) { + es->popState(); + when.pop_back(); + }}, + // || ( + {{InitialState, InWhen, InOr}, Or_Begin, + [](auto es) { + es->pushState(InOr); + }}, + // ( + {{InitialState, InWhen, InOr}, Or_Group, + [](auto es) { + es->pushState(InOr); + }}, + // ) + {{InOr}, Or_End, + [](auto es) { + es->popState(); + }}, + // [op]some-cat/package[-version][:slot][uses] + {{InitialState, InWhen, InOr}, AtomSpec, [this](auto es) { + ds.push_back(std::make_shared<Gentoo::Dependency>(when, + iuo<std::string>(es->pattern()->match(1)), // op + *es->pattern()->match(2), // category + *es->pattern()->match(3), // package + iuo<std::string>(es->pattern()->match(5)), // version + iuo<std::string>(es->pattern()->match(11)), // slot + split<std::string>(es->pattern()->match(14)) // use + )); + }}}) + { + } - std::vector<Gentoo::DependencyPtr> - Depend::parse(const std::string_view & s) - { - Depend d; - d.extract(s.data(), s.length()); - return d.ds; - } + std::vector<Gentoo::DependencyPtr> + Depend::parse(const std::string_view & s) + { + Depend d; + d.extract(s.data(), s.length()); + return d.ds; } } diff --git a/gentoobrowse-api/service/depend.h b/gentoobrowse-api/service/depend.h index 7a6af44..7cba039 100644 --- a/gentoobrowse-api/service/depend.h +++ b/gentoobrowse-api/service/depend.h @@ -1,23 +1,18 @@ -#ifndef GENTOOBROWSE_SERVICE_DEPEND_H -#define GENTOOBROWSE_SERVICE_DEPEND_H +#pragma once #include <istream> #include <lexer.h> #include <portage-models.h> #include <vector> -namespace Portage { - namespace Utils { - class Depend : AdHoc::Lexer { - private: - Depend(); - Gentoo::StringList when; +namespace Portage::Utils { + class Depend : AdHoc::Lexer { + private: + Depend(); + Gentoo::StringList when; - public: - static std::vector<Gentoo::DependencyPtr> parse(const std::string_view &); - std::vector<Gentoo::DependencyPtr> ds; - }; - } + public: + static std::vector<Gentoo::DependencyPtr> parse(const std::string_view &); + std::vector<Gentoo::DependencyPtr> ds; + }; } - -#endif diff --git a/gentoobrowse-api/service/main.cpp b/gentoobrowse-api/service/main.cpp index 7fd74ca..233aa91 100644 --- a/gentoobrowse-api/service/main.cpp +++ b/gentoobrowse-api/service/main.cpp @@ -12,42 +12,40 @@ #include <libexslt/exslt.h> #include <libxslt/transform.h> -namespace Gentoo { - namespace Service { - class Api : public IceTray::Service { - public: - Api() - { - xmlInitParser(); - exsltRegisterAll(); - git_libgit2_init(); - } +namespace Gentoo::Service { + class Api : public IceTray::Service { + public: + Api() + { + xmlInitParser(); + exsltRegisterAll(); + git_libgit2_init(); + } - ~Api() - { - xsltCleanupGlobals(); - xmlCleanupParser(); - git_libgit2_shutdown(); - } + ~Api() override + { + xsltCleanupGlobals(); + xmlCleanupParser(); + git_libgit2_shutdown(); + } - SPECIAL_MEMBERS_DELETE(Api); + SPECIAL_MEMBERS_DELETE(Api); - void - addObjects(const std::string &, const Ice::CommunicatorPtr & ic, const Ice::StringSeq &, - const Ice::ObjectAdapterPtr & adp) override - { - auto db = getConnectionPool(ic, "postgresql", "GentooBrowseAPI"); - auto dbp = getConnectionPool(ic, "postgresql", "GentooBrowseAPIprimary"); - auto props = ic->getProperties(); - IceTray::Cube::addObject<Gentoo::Portage, Portage>(adp, "portage", db); - IceTray::Cube::addObject<Gentoo::Maintenance, Maintenance>(adp, "maintenance", dbp, ic, props); - IceTray::Cube::addObject<Gentoo::Users, Users>(adp, "users", dbp); - IceTray::Cube::add<Gentoo::Notifications, Notifications>(); - IceTray::Cube::add<IceTray::Mail::MailServer, IceTray::Mail::LibesmtpMailServer>( - props->getPropertyWithDefault("GentooBrowseAPI.MailServer", "localhost:25")); - } - }; + void + addObjects(const std::string &, const Ice::CommunicatorPtr & ic, const Ice::StringSeq &, + const Ice::ObjectAdapterPtr & adp) override + { + auto db = getConnectionPool(ic, "postgresql", "GentooBrowseAPI"); + auto dbp = getConnectionPool(ic, "postgresql", "GentooBrowseAPIprimary"); + auto props = ic->getProperties(); + IceTray::Cube::addObject<Gentoo::Portage, Portage>(adp, "portage", db); + IceTray::Cube::addObject<Gentoo::Maintenance, Maintenance>(adp, "maintenance", dbp, ic, props); + IceTray::Cube::addObject<Gentoo::Users, Users>(adp, "users", dbp); + IceTray::Cube::add<Gentoo::Notifications, Notifications>(); + IceTray::Cube::add<IceTray::Mail::MailServer, IceTray::Mail::LibesmtpMailServer>( + props->getPropertyWithDefault("GentooBrowseAPI.MailServer", "localhost:25")); + } + }; - NAMEDFACTORY("default", Api, IceTray::ServiceFactory); - } + NAMEDFACTORY("default", Api, IceTray::ServiceFactory); } diff --git a/gentoobrowse-api/service/maintenance/abstractFileProcessor.cpp b/gentoobrowse-api/service/maintenance/abstractFileProcessor.cpp index 6c74ecb..fa0f457 100644 --- a/gentoobrowse-api/service/maintenance/abstractFileProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/abstractFileProcessor.cpp @@ -3,28 +3,24 @@ INSTANTIATEVOIDFACTORY(Gentoo::Service::AbstractFileProcessor); -namespace Gentoo { - namespace Service { - AbstractFileProcessor::~AbstractFileProcessor() { } - - void - AbstractFileProcessor::prepare(DB::Connection *) - { - } +namespace Gentoo::Service { + void + AbstractFileProcessor::prepare(DB::Connection *) + { + } - void - AbstractFileProcessor::apply(DB::Connection *, ChangeSet &) - { - } + void + AbstractFileProcessor::apply(DB::Connection *, ChangeSet &) + { + } - void - AbstractFileProcessor::phaseEnd(DB::Connection *, ChangeSet &) - { - } + void + AbstractFileProcessor::phaseEnd(DB::Connection *, ChangeSet &) + { + } - void - AbstractFileProcessor::tidy(DB::Connection *) - { - } + void + AbstractFileProcessor::tidy(DB::Connection *) + { } } diff --git a/gentoobrowse-api/service/maintenance/abstractFileProcessor.h b/gentoobrowse-api/service/maintenance/abstractFileProcessor.h index 0ffdcce..8cf1fb0 100644 --- a/gentoobrowse-api/service/maintenance/abstractFileProcessor.h +++ b/gentoobrowse-api/service/maintenance/abstractFileProcessor.h @@ -1,40 +1,38 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_ABSTRACTPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_ABSTRACTPROC_H +#pragma once #include "changeSet.h" +#include <c++11Helpers.h> #include <connection.h> #include <factory.h> #include <filesystem> #include <maintenance.h> -namespace Gentoo { - namespace Service { - typedef std::vector<std::string> PathParts; +namespace Gentoo::Service { + using PathParts = std::vector<std::string>; - class AbstractFileProcessor { - public: - virtual ~AbstractFileProcessor() = 0; + class AbstractFileProcessor { + public: + AbstractFileProcessor() = default; + virtual ~AbstractFileProcessor() = default; + SPECIAL_MEMBERS_DEFAULT(AbstractFileProcessor); - virtual unsigned char phase() const = 0; - virtual unsigned char order() const = 0; - virtual bool match(const PathParts & pp) const = 0; + [[nodiscard]] virtual unsigned char phase() const = 0; + [[nodiscard]] virtual unsigned char order() const = 0; + [[nodiscard]] virtual bool match(const PathParts & pp) const = 0; - virtual void prepare(DB::Connection *); - virtual void apply(DB::Connection *, ChangeSet &); - virtual void phaseEnd(DB::Connection *, ChangeSet &); - virtual void tidy(DB::Connection *); + virtual void prepare(DB::Connection *); + virtual void apply(DB::Connection *, ChangeSet &); + virtual void phaseEnd(DB::Connection *, ChangeSet &); + virtual void tidy(DB::Connection *); - virtual void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) - = 0; - virtual void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) - = 0; - virtual void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) = 0; - }; - typedef std::shared_ptr<AbstractFileProcessor> FileProcessorPtr; - typedef AdHoc::Factory<AbstractFileProcessor> FileProcessorFactory; - } + virtual void created( + DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, const std::filesystem::path & path) + = 0; + virtual void modified( + DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, const std::filesystem::path & path) + = 0; + virtual void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) = 0; + }; + using FileProcessorPtr = std::shared_ptr<AbstractFileProcessor>; + using FileProcessorFactory = AdHoc::Factory<AbstractFileProcessor>; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/categoryMetaProcessor.cpp b/gentoobrowse-api/service/maintenance/categoryMetaProcessor.cpp index f452390..26874ea 100644 --- a/gentoobrowse-api/service/maintenance/categoryMetaProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/categoryMetaProcessor.cpp @@ -10,52 +10,50 @@ namespace U = Gentoo::Utils; using namespace AdHoc; using namespace AdHoc::FileUtils; -namespace Gentoo { - namespace Service { - unsigned char - CategoryMetaProcessor::phase() const - { - return 2; - } - unsigned char - CategoryMetaProcessor::order() const - { - return 2; - } - bool - CategoryMetaProcessor::match(const PathParts & pp) const - { - return (pp.size() == 2 && pp[1] == "metadata.xml"); - } +namespace Gentoo::Service { + unsigned char + CategoryMetaProcessor::phase() const + { + return 2; + } + unsigned char + CategoryMetaProcessor::order() const + { + return 2; + } + bool + CategoryMetaProcessor::match(const PathParts & pp) const + { + return (pp.size() == 2 && pp[1] == "metadata.xml"); + } - void - CategoryMetaProcessor::created( - DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) - { - modified(dbc, r, fn, path); - } + void + CategoryMetaProcessor::created( + DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + { + modified(dbc, r, fn, path); + } - void - CategoryMetaProcessor::modified( - DB::Connection * dbc, int64_t, const StringList & fn, const std::filesystem::path & path) - { - auto m = sql::maintenance::categoryMetaUpdate.modify(dbc); - U::XmlDoc md(path); - m->bindParamS(0, - md.getXPathValue("/catmetadata/longdescription[@lang='en']/text()") - / md.getXPathValue("/catmetadata/longdescription[1]/text()")); - m->bindParamS(1, fn.front()); - m->execute(); - } + void + CategoryMetaProcessor::modified( + DB::Connection * dbc, int64_t, const StringList & fn, const std::filesystem::path & path) + { + auto m = sql::maintenance::categoryMetaUpdate.modify(dbc); + U::XmlDoc md(path); + m->bindParamS(0, + md.getXPathValue("/catmetadata/longdescription[@lang='en']/text()") + / md.getXPathValue("/catmetadata/longdescription[1]/text()")); + m->bindParamS(1, fn.front()); + m->execute(); + } - void - CategoryMetaProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) - { - auto m = sql::maintenance::categoryMetaUpdate.modify(dbc); - m->bindNull(0); - m->bindParamS(1, fn.front()); - m->execute(); - } + void + CategoryMetaProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) + { + auto m = sql::maintenance::categoryMetaUpdate.modify(dbc); + m->bindNull(0); + m->bindParamS(1, fn.front()); + m->execute(); } } FACTORY(Gentoo::Service::CategoryMetaProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/categoryMetaProcessor.h b/gentoobrowse-api/service/maintenance/categoryMetaProcessor.h index 8915611..2dac272 100644 --- a/gentoobrowse-api/service/maintenance/categoryMetaProcessor.h +++ b/gentoobrowse-api/service/maintenance/categoryMetaProcessor.h @@ -1,24 +1,19 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_CATEGORYMETAPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_CATEGORYMETAPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> -namespace Gentoo { - namespace Service { - class CategoryMetaProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class CategoryMetaProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - }; - } + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp index ae241b1..ea37ea5 100644 --- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp @@ -28,272 +28,270 @@ namespace U = Gentoo::Utils; using namespace AdHoc; using namespace AdHoc::FileUtils; -static Glib::RefPtr<Glib::Regex> packageVersion = Glib::Regex::create("^(.+)-([0-9].*)$"); +namespace Gentoo::Service { + static Glib::RefPtr<Glib::Regex> packageVersion = Glib::Regex::create("^(.+)-([0-9].*)$"); -namespace Gentoo { - namespace Service { - EbuildMetaProcessor::EbuildMetaProcessor() : ebuildIds("ebuildId") { } + EbuildMetaProcessor::EbuildMetaProcessor() : ebuildIds("ebuildId") { } - unsigned char - EbuildMetaProcessor::phase() const - { - return 2; - } - unsigned char - EbuildMetaProcessor::order() const - { - return 1; - } - bool - EbuildMetaProcessor::match(const PathParts & pp) const - { - return (pp.size() == 4 && pp[0] == "metadata" && pp[1] == "md5-cache"); - } - - void - EbuildMetaProcessor::created( - DB::Connection * dbc, int64_t repoId, const StringList & fn, const std::filesystem::path & path) - { - Glib::MatchInfo matches; - const Glib::ustring pv = fn[3]; - if (packageVersion->match(pv, matches)) { - U::EbuildCacheParser ecp(path); - const std::string categoryName = fn[2]; - const std::string packageName = matches.fetch(1); - const std::string ebuildVersion = matches.fetch(2); + unsigned char + EbuildMetaProcessor::phase() const + { + return 2; + } + unsigned char + EbuildMetaProcessor::order() const + { + return 1; + } + bool + EbuildMetaProcessor::match(const PathParts & pp) const + { + return (pp.size() == 4 && pp[0] == "metadata" && pp[1] == "md5-cache"); + } - // Maybe create a category - auto ci = sql::maintenance::categoryInsert.modify(dbc); - ci->bindParamS(0, categoryName); - ci->bindParamS(1, categoryName); - ci->execute(); - // Maybe create a package - auto pi = sql::maintenance::packageInsert.modify(dbc); - pi->bindParamS(0, packageName); - pi->bindParamS(1, ecp.get("DESCRIPTION")); - pi->bindParamS(2, packageName); - pi->bindParamS(3, categoryName); - pi->execute(); - // Create an ebuild - auto m = sql::maintenance::ebuildInsert.select(dbc); - m->bindParamS(0, ebuildVersion); - m->bindParamS(1, ebuildVersion); - m->bindParamS(2, ecp.get("SLOT")); - m->bindParamS(3, ecp.get("LICENSE")); - m->bindParamT(4, boost::posix_time::from_time_t(ecp.getStat().st_mtim.tv_sec)); - m->bindParamI(5, repoId); - m->bindParamS(6, categoryName); - m->bindParamS(7, packageName); - m->forEachRow<int64_t, bool, int64_t>([this, dbc, &ecp](auto ebuildId, auto newest, auto packageId) { - this->perEbuildUpdates(dbc, ecp, ebuildId, newest, packageId); - }); - } - } + void + EbuildMetaProcessor::created( + DB::Connection * dbc, int64_t repoId, const StringList & fn, const std::filesystem::path & path) + { + Glib::MatchInfo matches; + const Glib::ustring pv = fn[3]; + if (packageVersion->match(pv, matches)) { + U::EbuildCacheParser ecp(path); + const std::string categoryName = fn[2]; + const std::string packageName = matches.fetch(1); + const std::string ebuildVersion = matches.fetch(2); - void - EbuildMetaProcessor::modified( - DB::Connection * dbc, int64_t repoId, const StringList & fn, const std::filesystem::path & path) - { - Glib::MatchInfo matches; - const Glib::ustring pv = fn[3]; - if (packageVersion->match(pv, matches)) { - auto m = sql::maintenance::ebuildUpdate.select(dbc); - U::EbuildCacheParser ecp(path); - m->bindParamS(0, ecp.get("SLOT")); - m->bindParamS(1, ecp.get("LICENSE")); - m->bindParamT(2, boost::posix_time::from_time_t(ecp.getStat().st_mtim.tv_sec)); - m->bindParamI(3, repoId); - m->bindParamS(4, fn[2]); // category - m->bindParamS(5, matches.fetch(1)); // package - m->bindParamS(6, matches.fetch(2)); // version - m->forEachRow<int64_t, bool, int64_t>([this, dbc, &ecp](auto ebuildId, auto newest, auto packageId) { - this->perEbuildUpdates(dbc, ecp, ebuildId, newest, packageId); - }); - } + // Maybe create a category + auto ci = sql::maintenance::categoryInsert.modify(dbc); + ci->bindParamS(0, categoryName); + ci->bindParamS(1, categoryName); + ci->execute(); + // Maybe create a package + auto pi = sql::maintenance::packageInsert.modify(dbc); + pi->bindParamS(0, packageName); + pi->bindParamS(1, ecp.get("DESCRIPTION")); + pi->bindParamS(2, packageName); + pi->bindParamS(3, categoryName); + pi->execute(); + // Create an ebuild + auto m = sql::maintenance::ebuildInsert.select(dbc); + m->bindParamS(0, ebuildVersion); + m->bindParamS(1, ebuildVersion); + m->bindParamS(2, ecp.get("SLOT")); + m->bindParamS(3, ecp.get("LICENSE")); + m->bindParamT(4, boost::posix_time::from_time_t(ecp.getStat().st_mtim.tv_sec)); + m->bindParamI(5, repoId); + m->bindParamS(6, categoryName); + m->bindParamS(7, packageName); + m->forEachRow<int64_t, bool, int64_t>([this, dbc, &ecp](auto ebuildId, auto newest, auto packageId) { + this->perEbuildUpdates(dbc, ecp, ebuildId, newest, packageId); + }); } + } - void - EbuildMetaProcessor::prepare(DB::Connection * dbc) - { - depInsert = Utils::Database::namedTemp(dbc, "tmpEbuildDeps", - { - {"ebuildId", "int"}, // 1 - {"runtime", "boolean"}, // 5 - {"category", "text"}, // 0 - {"package", "text"}, // 4 - {"version", "text"}, // 7 - {"slot", "text"}, // 6 - {"flags", "text"}, // 2 - {"op", "text"} // 3 - }) - .second; - Utils::Database::namedTemp(dbc, "tmpEbuildUses", - { - {"ebuildId", "int"}, - {"use", "text"}, - {"defaultflag", "boolean"}, - }); - useInsert = sql::maintenance::ebuildUsesInsert.modify(dbc); - Utils::Database::namedTemp(dbc, "tmpEbuildArchs", - { - {"ebuildId", "int"}, - {"arch", "text"}, - }); - archInsert = sql::maintenance::ebuildArchsInsert.modify(dbc); + void + EbuildMetaProcessor::modified( + DB::Connection * dbc, int64_t repoId, const StringList & fn, const std::filesystem::path & path) + { + Glib::MatchInfo matches; + const Glib::ustring pv = fn[3]; + if (packageVersion->match(pv, matches)) { + auto m = sql::maintenance::ebuildUpdate.select(dbc); + U::EbuildCacheParser ecp(path); + m->bindParamS(0, ecp.get("SLOT")); + m->bindParamS(1, ecp.get("LICENSE")); + m->bindParamT(2, boost::posix_time::from_time_t(ecp.getStat().st_mtim.tv_sec)); + m->bindParamI(3, repoId); + m->bindParamS(4, fn[2]); // category + m->bindParamS(5, matches.fetch(1)); // package + m->bindParamS(6, matches.fetch(2)); // version + m->forEachRow<int64_t, bool, int64_t>([this, dbc, &ecp](auto ebuildId, auto newest, auto packageId) { + this->perEbuildUpdates(dbc, ecp, ebuildId, newest, packageId); + }); } + } - void - EbuildMetaProcessor::apply(DB::Connection * dbc, ChangeSet &) - { - if (!ebuildIds.entityIds.empty()) { + void + EbuildMetaProcessor::prepare(DB::Connection * dbc) + { + depInsert = Utils::Database::namedTemp(dbc, "tmpEbuildDeps", { - dbc->execute("CREATE INDEX idxTmpEbuildDeps ON tmpEbuildDeps(ebuildId, runtime)"); - DB::TablePatch t; - t.pk = {"ebuildid", "packageid", "versionspec", "flags", "slot", "op"}; - t.cols = {"ebuildid", "packageid", "versionspec", "flags", "slot", "op"}; - t.where = &ebuildIds; - - DB::StaticSqlWriter sb(sql::maintenance::ebuildDeps.getSql()); - t.srcExpr = &sb; - t.dest = "gentoobrowse.ebuild_deps"; - dbc->patchTable(&t); - - DB::StaticSqlWriter sr(sql::maintenance::ebuildRDeps.getSql()); - t.srcExpr = &sr; - t.dest = "gentoobrowse.ebuild_rdeps"; - dbc->patchTable(&t); - } + {"ebuildId", "int"}, // 1 + {"runtime", "boolean"}, // 5 + {"category", "text"}, // 0 + {"package", "text"}, // 4 + {"version", "text"}, // 7 + {"slot", "text"}, // 6 + {"flags", "text"}, // 2 + {"op", "text"} // 3 + }) + .second; + Utils::Database::namedTemp(dbc, "tmpEbuildUses", { - dbc->execute("CREATE UNIQUE INDEX idxTmpEbuildUses ON tmpEbuildUses(ebuildId, use)"); - DB::TablePatch t; - t.src = "tmpEbuildUses"; - t.dest = "gentoobrowse.ebuild_uses"; - t.pk = {"ebuildid", "use"}; - t.cols = {"ebuildid", "use", "defaultflag"}; - t.where = &ebuildIds; - dbc->patchTable(&t); - } + {"ebuildId", "int"}, + {"use", "text"}, + {"defaultflag", "boolean"}, + }); + useInsert = sql::maintenance::ebuildUsesInsert.modify(dbc); + Utils::Database::namedTemp(dbc, "tmpEbuildArchs", { - dbc->execute("CREATE UNIQUE INDEX idxTmpEbuildArchs ON tmpEbuildArchs(ebuildId, arch)"); - DB::TablePatch t; - t.src = "tmpEbuildArchs"; - t.dest = "gentoobrowse.ebuild_archs"; - t.pk = {"ebuildid", "arch"}; - t.cols = {"ebuildid", "arch"}; - t.where = &ebuildIds; - dbc->patchTable(&t); - } - } - if (!packagesToPrune.empty()) { - bool any = false; - for (const auto & catPkg : packagesToPrune) { - // Prune packages - auto pp = sql::maintenance::packagePrune.modify(dbc); - pp->bindParamS(0, catPkg.first); - pp->bindParamS(1, catPkg.second); - any |= pp->execute(); - } - if (any) { - // Prune categories - sql::maintenance::categoryPrune.modify(dbc)->execute(); - } - } - } + {"ebuildId", "int"}, + {"arch", "text"}, + }); + archInsert = sql::maintenance::ebuildArchsInsert.modify(dbc); + } - void - EbuildMetaProcessor::tidy(DB::Connection * dbc) - { - Utils::Database::drop(dbc, "tmpEbuildDeps"); - Utils::Database::drop(dbc, "tmpEbuildUses"); - Utils::Database::drop(dbc, "tmpEbuildArchs"); - } + void + EbuildMetaProcessor::apply(DB::Connection * dbc, ChangeSet &) + { + if (!ebuildIds.entityIds.empty()) { + { + dbc->execute("CREATE INDEX idxTmpEbuildDeps ON tmpEbuildDeps(ebuildId, runtime)"); + DB::TablePatch t; + t.pk = {"ebuildid", "packageid", "versionspec", "flags", "slot", "op"}; + t.cols = {"ebuildid", "packageid", "versionspec", "flags", "slot", "op"}; + t.where = &ebuildIds; - void - EbuildMetaProcessor::perEbuildUpdates(DB::Connection * dbc, const U::EbuildCacheParser & ecp, int64_t ebuildId, - bool newest, int64_t packageId) - { - ebuildIds.entityIds.insert(ebuildId); - // IUSE - if (auto uses = ecp.get("IUSE")) { - useInsert->bindParamI(0, ebuildId); - useInsert->bindParamS(1, *uses); - useInsert->execute(); - } - // KEYWORDS - if (auto keywords = ecp.get("KEYWORDS")) { - archInsert->bindParamI(0, ebuildId); - archInsert->bindParamS(1, *keywords); - archInsert->execute(); - } - // Dependencies - depInsert->bindParamI(1, ebuildId); - if (auto depend = ecp.getRange("DEPEND")) { - depInsert->bindParamB(5, false); - insertDeps(Portage::Utils::Depend::parse(*depend)); + DB::StaticSqlWriter sb(sql::maintenance::ebuildDeps.getSql()); + t.srcExpr = &sb; + t.dest = "gentoobrowse.ebuild_deps"; + dbc->patchTable(&t); + + DB::StaticSqlWriter sr(sql::maintenance::ebuildRDeps.getSql()); + t.srcExpr = &sr; + t.dest = "gentoobrowse.ebuild_rdeps"; + dbc->patchTable(&t); } - if (auto rdepend = ecp.getRange("RDEPEND")) { - depInsert->bindParamB(5, true); - insertDeps(Portage::Utils::Depend::parse(*rdepend)); + { + dbc->execute("CREATE UNIQUE INDEX idxTmpEbuildUses ON tmpEbuildUses(ebuildId, use)"); + DB::TablePatch t; + t.src = "tmpEbuildUses"; + t.dest = "gentoobrowse.ebuild_uses"; + t.pk = {"ebuildid", "use"}; + t.cols = {"ebuildid", "use", "defaultflag"}; + t.where = &ebuildIds; + dbc->patchTable(&t); } - if (newest) { + { + dbc->execute("CREATE UNIQUE INDEX idxTmpEbuildArchs ON tmpEbuildArchs(ebuildId, arch)"); DB::TablePatch t; - // HOMEPAGE - U::EntityWhereFilter<int64_t> pwf("packageId", packageId); - U::SplitEbuildProps sep_homepage("packageId", packageId, "url", ecp.get("HOMEPAGE")); - t.dest = "gentoobrowse.package_urls"; - t.srcExpr = &sep_homepage; - t.pk = {"packageId", "url"}; - t.cols = {"packageId", "url"}; - t.where = &pwf; + t.src = "tmpEbuildArchs"; + t.dest = "gentoobrowse.ebuild_archs"; + t.pk = {"ebuildid", "arch"}; + t.cols = {"ebuildid", "arch"}; + t.where = &ebuildIds; dbc->patchTable(&t); - // Description - auto u = sql::maintenance::packageDescUpdate.modify(dbc); - u->bindParamS(0, ecp.get("DESCRIPTION")); - u->bindParamI(1, packageId); - u->execute(); } } + if (!packagesToPrune.empty()) { + bool any = false; + for (const auto & catPkg : packagesToPrune) { + // Prune packages + auto pp = sql::maintenance::packagePrune.modify(dbc); + pp->bindParamS(0, catPkg.first); + pp->bindParamS(1, catPkg.second); + any |= pp->execute(); + } + if (any) { + // Prune categories + sql::maintenance::categoryPrune.modify(dbc)->execute(); + } + } + } - template<typename T> - const T & - operator|=(const IceUtil::Optional<T> & a, const T & b) - { - return a ? *a : b; + void + EbuildMetaProcessor::tidy(DB::Connection * dbc) + { + Utils::Database::drop(dbc, "tmpEbuildDeps"); + Utils::Database::drop(dbc, "tmpEbuildUses"); + Utils::Database::drop(dbc, "tmpEbuildArchs"); + } + + void + EbuildMetaProcessor::perEbuildUpdates( + DB::Connection * dbc, const U::EbuildCacheParser & ecp, int64_t ebuildId, bool newest, int64_t packageId) + { + ebuildIds.entityIds.insert(ebuildId); + // IUSE + if (auto uses = ecp.get("IUSE")) { + useInsert->bindParamI(0, ebuildId); + useInsert->bindParamS(1, *uses); + useInsert->execute(); + } + // KEYWORDS + if (auto keywords = ecp.get("KEYWORDS")) { + archInsert->bindParamI(0, ebuildId); + archInsert->bindParamS(1, *keywords); + archInsert->execute(); + } + // Dependencies + depInsert->bindParamI(1, ebuildId); + if (auto depend = ecp.getRange("DEPEND")) { + depInsert->bindParamB(5, false); + insertDeps(Portage::Utils::Depend::parse(*depend)); } + if (auto rdepend = ecp.getRange("RDEPEND")) { + depInsert->bindParamB(5, true); + insertDeps(Portage::Utils::Depend::parse(*rdepend)); + } + if (newest) { + DB::TablePatch t; + // HOMEPAGE + U::EntityWhereFilter<int64_t> pwf("packageId", packageId); + U::SplitEbuildProps sep_homepage("packageId", packageId, "url", ecp.get("HOMEPAGE")); + t.dest = "gentoobrowse.package_urls"; + t.srcExpr = &sep_homepage; + t.pk = {"packageId", "url"}; + t.cols = {"packageId", "url"}; + t.where = &pwf; + dbc->patchTable(&t); + // Description + auto u = sql::maintenance::packageDescUpdate.modify(dbc); + u->bindParamS(0, ecp.get("DESCRIPTION")); + u->bindParamI(1, packageId); + u->execute(); + } + } - void - EbuildMetaProcessor::insertDeps(const std::vector<Gentoo::DependencyPtr> & deps) - { - for (const auto & d : deps) { - depInsert->bindParamS(0, d->category); - depInsert->bindParamS(2, boost::algorithm::join(d->use, ",")); - depInsert->bindParamS(3, d->op |= std::string()); - depInsert->bindParamS(4, d->package); - depInsert->bindParamS(6, d->slot |= std::string()); - depInsert->bindParamS(7, d->version |= std::string()); - depInsert->execute(); - } + template<typename T> + const T & + operator|=(const IceUtil::Optional<T> & a, const T & b) + { + return a ? *a : b; + } + + void + EbuildMetaProcessor::insertDeps(const std::vector<Gentoo::DependencyPtr> & deps) + { + for (const auto & d : deps) { + depInsert->bindParamS(0, d->category); + depInsert->bindParamS(2, boost::algorithm::join(d->use, ",")); + depInsert->bindParamS(3, d->op |= std::string()); + depInsert->bindParamS(4, d->package); + depInsert->bindParamS(6, d->slot |= std::string()); + depInsert->bindParamS(7, d->version |= std::string()); + depInsert->execute(); } + } - void - EbuildMetaProcessor::deleted(DB::Connection * dbc, int64_t repoId, const StringList & fn) - { - Glib::MatchInfo matches; - const Glib::ustring pv = fn[3]; - if (packageVersion->match(pv, matches)) { - const std::string categoryName = fn[2]; - const std::string packageName = matches.fetch(1); - const std::string ebuildVersion = matches.fetch(2); + void + EbuildMetaProcessor::deleted(DB::Connection * dbc, int64_t repoId, const StringList & fn) + { + Glib::MatchInfo matches; + const Glib::ustring pv = fn[3]; + if (packageVersion->match(pv, matches)) { + const std::string categoryName = fn[2]; + const std::string packageName = matches.fetch(1); + const std::string ebuildVersion = matches.fetch(2); - // Delete ebuild - auto m = sql::maintenance::ebuildDelete.modify(dbc); - m->bindParamI(0, repoId); - m->bindParamS(1, categoryName); - m->bindParamS(2, packageName); - m->bindParamS(3, ebuildVersion); - m->execute(false); - packagesToPrune.insert({categoryName, packageName}); - } + // Delete ebuild + auto m = sql::maintenance::ebuildDelete.modify(dbc); + m->bindParamI(0, repoId); + m->bindParamS(1, categoryName); + m->bindParamS(2, packageName); + m->bindParamS(3, ebuildVersion); + m->execute(false); + packagesToPrune.insert({categoryName, packageName}); } } } diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h index c198262..5d143b3 100644 --- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h +++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h @@ -1,5 +1,4 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_EBUILDMETAPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_EBUILDMETAPROC_H +#pragma once #include "abstractFileProcessor.h" #include "utils/ebuildCacheParser.h" @@ -9,40 +8,36 @@ #include <modifycommand.h> #include <portage-models.h> -namespace Gentoo { - namespace Service { - class EbuildMetaProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; - - EbuildMetaProcessor(); - - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - - private: - void prepare(DB::Connection * dbc) override; - void apply(DB::Connection * dbc, ChangeSet &) override; - void tidy(DB::Connection * dbc) override; - - void perEbuildUpdates(DB::Connection * dbc, const Utils::EbuildCacheParser & ecp, int64_t ebuildId, - bool newest, int64_t packageId); - void insertDeps(const std::vector<Gentoo::DependencyPtr> &); - - DB::ModifyCommandPtr depInsert; - DB::ModifyCommandPtr useInsert; - DB::ModifyCommandPtr archInsert; - Utils::EntityWhereFilter<int64_t> ebuildIds; - typedef std::pair<std::string, std::string> CategoryPackage; - typedef std::set<CategoryPackage> PackagesToPrune; - PackagesToPrune packagesToPrune; - }; - } +namespace Gentoo::Service { + class EbuildMetaProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; + + EbuildMetaProcessor(); + + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + + private: + void prepare(DB::Connection * dbc) override; + void apply(DB::Connection * dbc, ChangeSet &) override; + void tidy(DB::Connection * dbc) override; + + void perEbuildUpdates(DB::Connection * dbc, const Utils::EbuildCacheParser & ecp, int64_t ebuildId, bool newest, + int64_t packageId); + void insertDeps(const std::vector<Gentoo::DependencyPtr> &); + + DB::ModifyCommandPtr depInsert; + DB::ModifyCommandPtr useInsert; + DB::ModifyCommandPtr archInsert; + Utils::EntityWhereFilter<int64_t> ebuildIds; + typedef std::pair<std::string, std::string> CategoryPackage; + typedef std::set<CategoryPackage> PackagesToPrune; + PackagesToPrune packagesToPrune; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/masksProcessor.cpp b/gentoobrowse-api/service/maintenance/masksProcessor.cpp index 242f3ac..573345b 100644 --- a/gentoobrowse-api/service/maintenance/masksProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/masksProcessor.cpp @@ -12,98 +12,99 @@ #include <sqlWriter.h> #include <tablepatch.h> -namespace Gentoo { - namespace Service { - unsigned char - MasksProcessor::phase() const - { - return 2; - } - unsigned char - MasksProcessor::order() const - { - return 10; - } - bool - MasksProcessor::match(const PathParts & pp) const - { - return (pp.size() == 2 && pp[0] == "profiles" && pp[1] == "package.mask"); - } +namespace Gentoo::Service { + unsigned char + MasksProcessor::phase() const + { + return 2; + } + unsigned char + MasksProcessor::order() const + { + return 10; + } + bool + MasksProcessor::match(const PathParts & pp) const + { + return (pp.size() == 2 && pp[0] == "profiles" && pp[1] == "package.mask"); + } + + void + MasksProcessor::created(DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + { + modified(dbc, r, fn, path); + } - void - MasksProcessor::created( - DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) - { - modified(dbc, r, fn, path); - } + void + MasksProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + auto tempTable = Utils::Database::namedTemp(dbc, "tmp_masks", + {{"n", "int"}, {"dateAdded", "date"}, {"person", "text"}, {"email", "text"}, {"message", "text"}, + {"atomSpec", "text[]"}}); - void - MasksProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - auto tempTable = Utils::Database::namedTemp(dbc, "tmp_masks", - {{"n", "int"}, {"dateAdded", "date"}, {"person", "text"}, {"email", "text"}, {"message", "text"}, - {"atomSpec", "text[]"}}); + auto i = tempTable.second; + AdHoc::FileUtils::MemMap f(path); - auto i = tempTable.second; - AdHoc::FileUtils::MemMap f(path); - class MaskInserter : public Portage::Utils::Masks { - public: - MaskInserter(DB::ModifyCommand * i) : i(i) { } + class MaskInserter : public Portage::Utils::Masks { + public: + explicit MaskInserter(DB::ModifyCommand * i) : i(i) { } - protected: - void - consume() const override - { - i->bindParamS(0, "{" + boost::algorithm::join(atoms, ",") + "}"); - i->bindParamS(1, date); - if (email) - i->bindParamS(2, *email); - else - i->bindNull(2); - i->bindParamS(3, boost::algorithm::join(message, " ")); - i->bindParamI(4, n); - if (person) - i->bindParamS(5, *person); - else - i->bindNull(5); - i->execute(); + protected: + void + consume() const override + { + i->bindParamS(0, "{" + boost::algorithm::join(atoms, ",") + "}"); + i->bindParamS(1, date); + if (email) { + i->bindParamS(2, *email); } - DB::ModifyCommand * i; - }; - MaskInserter(tempTable.second.get()).extract(f.sv<gchar>().data(), f.sv<gchar>().length()); - // Dates are hand-typed and sometimes typos occur... ensure they're at - // least within the range of Boost ptimes. - while (sql::maintenance::masksFixDates.modify(dbc)->execute()) - ; + else { + i->bindNull(2); + } + i->bindParamS(3, boost::algorithm::join(message, " ")); + i->bindParamI(4, n); + if (person) { + i->bindParamS(5, *person); + } + else { + i->bindNull(5); + } + i->execute(); + } + DB::ModifyCommand * i; + }; + MaskInserter(tempTable.second.get()).extract(f.sv<gchar>().data(), f.sv<gchar>().length()); + // Dates are hand-typed and sometimes typos occur... ensure they're at + // least within the range of Boost ptimes. + while (sql::maintenance::masksFixDates.modify(dbc)->execute()) { } - DB::TablePatch p; - p.dest = "gentoobrowse.masksets"; - DB::StaticSqlWriter srcExpr(sql::maintenance::masksSets.getSql()); - p.srcExpr = &srcExpr; - p.pk = {"dateAdded", "n"}; - p.cols = {"dateAdded", "n", "person", "email", "message", "atomSpec"}; - dbc->patchTable(&p); + DB::TablePatch p; + p.dest = "gentoobrowse.masksets"; + DB::StaticSqlWriter srcExpr(sql::maintenance::masksSets.getSql()); + p.srcExpr = &srcExpr; + p.pk = {"dateAdded", "n"}; + p.cols = {"dateAdded", "n", "person", "email", "message", "atomSpec"}; + dbc->patchTable(&p); - Utils::Database::drop(dbc, tempTable.first); - } + Utils::Database::drop(dbc, tempTable.first); + } - void - MasksProcessor::phaseEnd(DB::Connection * dbc, ChangeSet &) - { - DB::TablePatch e; - e.dest = "gentoobrowse.ebuild_masks"; - DB::StaticSqlWriter srcExprE(sql::maintenance::masksEbuilds.getSql()); - e.srcExpr = &srcExprE; - e.pk = {"ebuildId", "setNo"}; - e.cols = e.pk; - dbc->patchTable(&e); - } + void + MasksProcessor::phaseEnd(DB::Connection * dbc, ChangeSet &) + { + DB::TablePatch e; + e.dest = "gentoobrowse.ebuild_masks"; + DB::StaticSqlWriter srcExprE(sql::maintenance::masksEbuilds.getSql()); + e.srcExpr = &srcExprE; + e.pk = {"ebuildId", "setNo"}; + e.cols = e.pk; + dbc->patchTable(&e); + } - void - MasksProcessor::deleted(DB::Connection * dbc, int64_t, const StringList &) - { - dbc->modify("DELETE FROM gentoobrowse.masksets")->execute(); - } + void + MasksProcessor::deleted(DB::Connection * dbc, int64_t, const StringList &) + { + dbc->modify("DELETE FROM gentoobrowse.masksets")->execute(); } } FACTORY(Gentoo::Service::MasksProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/masksProcessor.h b/gentoobrowse-api/service/maintenance/masksProcessor.h index fca6ec8..ca3c828 100644 --- a/gentoobrowse-api/service/maintenance/masksProcessor.h +++ b/gentoobrowse-api/service/maintenance/masksProcessor.h @@ -1,28 +1,23 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_MASKSPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_MASKSPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> #include <modifycommand.h> -namespace Gentoo { - namespace Service { - class MasksProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class MasksProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - void phaseEnd(DB::Connection *, ChangeSet &) override; - }; - } + void phaseEnd(DB::Connection *, ChangeSet &) override; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/newsProcessor.cpp b/gentoobrowse-api/service/maintenance/newsProcessor.cpp index 8a67c3e..b175ba2 100644 --- a/gentoobrowse-api/service/maintenance/newsProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/newsProcessor.cpp @@ -8,54 +8,52 @@ #include <slicer/slicer.h> #include <sql/maintenance/newsDelete.sql.h> -namespace Gentoo { - namespace Service { - unsigned char - NewsProcessor::phase() const - { - return 2; - } - unsigned char - NewsProcessor::order() const - { - return 10; - } - bool - NewsProcessor::match(const PathParts & pp) const - { - return (pp.size() == 4 && pp[0] == "metadata" && pp[1] == "news" - && boost::algorithm::ends_with(pp[3], ".en.txt")); - } +namespace Gentoo::Service { + unsigned char + NewsProcessor::phase() const + { + return 2; + } + unsigned char + NewsProcessor::order() const + { + return 10; + } + bool + NewsProcessor::match(const PathParts & pp) const + { + return (pp.size() == 4 && pp[0] == "metadata" && pp[1] == "news" + && boost::algorithm::ends_with(pp[3], ".en.txt")); + } - void - NewsProcessor::created(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - importNews<Slicer::SqlInsertSerializer>(dbc, path); - } + void + NewsProcessor::created(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + importNews<Slicer::SqlInsertSerializer>(dbc, path); + } - void - NewsProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - importNews<Slicer::SqlUpdateSerializer>(dbc, path); - } + void + NewsProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + importNews<Slicer::SqlUpdateSerializer>(dbc, path); + } - template<typename Serializer> - void - NewsProcessor::importNews(DB::Connection * dbc, const std::filesystem::path & path) - { - AdHoc::FileUtils::MemMap m(path); - auto news = Portage::Utils::News::parse(m.sv<gchar>()); - news->newsid = path.parent_path().filename(); - Slicer::SerializeAny<Serializer>(news, dbc, "gentoobrowse.news"); - } + template<typename Serializer> + void + NewsProcessor::importNews(DB::Connection * dbc, const std::filesystem::path & path) + { + AdHoc::FileUtils::MemMap m(path); + auto news = Portage::Utils::News::parse(m.sv<gchar>()); + news->newsid = path.parent_path().filename(); + Slicer::SerializeAny<Serializer>(news, dbc, "gentoobrowse.news"); + } - void - NewsProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) - { - auto del = sql::maintenance::newsDelete.modify(dbc); - del->bindParamS(0, *++fn.rbegin()); - del->execute(); - } + void + NewsProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) + { + auto del = sql::maintenance::newsDelete.modify(dbc); + del->bindParamS(0, *++fn.rbegin()); + del->execute(); } } FACTORY(Gentoo::Service::NewsProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/newsProcessor.h b/gentoobrowse-api/service/maintenance/newsProcessor.h index c51e1f8..b067613 100644 --- a/gentoobrowse-api/service/maintenance/newsProcessor.h +++ b/gentoobrowse-api/service/maintenance/newsProcessor.h @@ -1,30 +1,24 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_NEWSPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_NEWSPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> #include <portage-models.h> -namespace Gentoo { - namespace Service { - class NewsProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class NewsProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - private: - template<typename Serializer> - static void importNews(DB::Connection * dbc, const std::filesystem::path & path); - }; - } + private: + template<typename Serializer> static void importNews(DB::Connection * dbc, const std::filesystem::path & path); + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/packageMetaProcessor.cpp b/gentoobrowse-api/service/maintenance/packageMetaProcessor.cpp index df3e2da..e27c2d7 100644 --- a/gentoobrowse-api/service/maintenance/packageMetaProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/packageMetaProcessor.cpp @@ -10,56 +10,54 @@ namespace U = Gentoo::Utils; using namespace AdHoc; using namespace AdHoc::FileUtils; -namespace Gentoo { - namespace Service { - unsigned char - PackageMetaProcessor::phase() const - { - return 2; - } - unsigned char - PackageMetaProcessor::order() const - { - return 3; - } - bool - PackageMetaProcessor::match(const PathParts & pp) const - { - return (pp.size() == 3 && pp[2] == "metadata.xml"); - } +namespace Gentoo::Service { + unsigned char + PackageMetaProcessor::phase() const + { + return 2; + } + unsigned char + PackageMetaProcessor::order() const + { + return 3; + } + bool + PackageMetaProcessor::match(const PathParts & pp) const + { + return (pp.size() == 3 && pp[2] == "metadata.xml"); + } - void - PackageMetaProcessor::created( - DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) - { - modified(dbc, r, fn, path); - } + void + PackageMetaProcessor::created( + DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + { + modified(dbc, r, fn, path); + } - void - PackageMetaProcessor::modified( - DB::Connection * dbc, int64_t, const StringList & fn, const std::filesystem::path & path) - { - auto m = sql::maintenance::packageMetaUpdate.modify(dbc); - U::XmlDoc md(path); - m->bindParamS(0, - md.getXPathValue("/pkgmetadata/longdescription[@lang='en']/text()") - / md.getXPathValue("/pkgmetadata/longdescription[1]/text()")); - m->bindParamS(1, md.getXPathValue("/pkgmetadata/herd/text()")); - m->bindParamS(2, fn[0]); - m->bindParamS(3, fn[1]); - m->execute(); - } + void + PackageMetaProcessor::modified( + DB::Connection * dbc, int64_t, const StringList & fn, const std::filesystem::path & path) + { + auto m = sql::maintenance::packageMetaUpdate.modify(dbc); + U::XmlDoc md(path); + m->bindParamS(0, + md.getXPathValue("/pkgmetadata/longdescription[@lang='en']/text()") + / md.getXPathValue("/pkgmetadata/longdescription[1]/text()")); + m->bindParamS(1, md.getXPathValue("/pkgmetadata/herd/text()")); + m->bindParamS(2, fn[0]); + m->bindParamS(3, fn[1]); + m->execute(); + } - void - PackageMetaProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) - { - auto m = sql::maintenance::packageMetaUpdate.modify(dbc); - m->bindNull(0); - m->bindNull(1); - m->bindParamS(2, fn[0]); - m->bindParamS(3, fn[1]); - m->execute(); - } + void + PackageMetaProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) + { + auto m = sql::maintenance::packageMetaUpdate.modify(dbc); + m->bindNull(0); + m->bindNull(1); + m->bindParamS(2, fn[0]); + m->bindParamS(3, fn[1]); + m->execute(); } } FACTORY(Gentoo::Service::PackageMetaProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/packageMetaProcessor.h b/gentoobrowse-api/service/maintenance/packageMetaProcessor.h index 2dfda96..e5fdfdc 100644 --- a/gentoobrowse-api/service/maintenance/packageMetaProcessor.h +++ b/gentoobrowse-api/service/maintenance/packageMetaProcessor.h @@ -1,25 +1,20 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_PACKAGEMETAPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_PACKAGEMETAPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> -namespace Gentoo { - namespace Service { - class PackageMetaProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class PackageMetaProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - }; - } + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/updatesProcessor.cpp b/gentoobrowse-api/service/maintenance/updatesProcessor.cpp index c56bc55..a12e5f9 100644 --- a/gentoobrowse-api/service/maintenance/updatesProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/updatesProcessor.cpp @@ -5,6 +5,7 @@ #include <boost/algorithm/string/join.hpp> #include <boost/algorithm/string/predicate.hpp> #include <buffer.h> +#include <c++11Helpers.h> #include <fileUtils.h> #include <fstream> #include <modifycommand.h> @@ -17,159 +18,159 @@ using namespace AdHoc::FileUtils; -static Glib::RefPtr<Glib::Regex> move - = Glib::Regex::create(R"R(^move ([^/]+)/([^ ]+) ([^/]+)/(.+)$)R", Glib::RegexCompileFlags::REGEX_MULTILINE); +namespace Gentoo::Service { + static Glib::RefPtr<Glib::Regex> move + = Glib::Regex::create(R"R(^move ([^/]+)/([^ ]+) ([^/]+)/(.+)$)R", Glib::RegexCompileFlags::REGEX_MULTILINE); -namespace Gentoo { - namespace Service { - unsigned char - UpdatesProcessor::phase() const - { - return 1; - } - unsigned char - UpdatesProcessor::order() const - { - return 1; - } - bool - UpdatesProcessor::match(const PathParts & pp) const - { - return (pp.size() == 3 && pp[0] == "profiles" && pp[1] == "updates" && pp[2].substr(1, 4) == "Q-20"); - } - - class UpdatesPatch : public DB::TablePatch, public DB::SqlWriter { - public: - UpdatesPatch(DB::Connection * db) : - categoryInsert(sql::maintenance::categoryInsert.modify(db)), - packageInsert(sql::maintenance::packageInsert.modify(db)), - findPackage(sql::portage::findPackage.select(db)), - updatesMoveUserPackages(sql::maintenance::updatesMoveUserPackages.modify(db)), changes(nullptr), - updatePacks("updatePack") - { - this->src = Utils::Database::emptyClone(db, "gentoobrowse.updates"); - this->dest = "gentoobrowse.updates"; - this->pk = {"updatePack", "catfrom", "namefrom"}; - this->cols = {"updatePack", "catfrom", "namefrom", "catto", "nameto"}; - this->where = &updatePacks; - this->order = this; - this->beforeInsert = std::bind(&UpdatesPatch::move, this, std::placeholders::_1); - drop = db->modify("DROP TABLE " + this->src); - } - - ~UpdatesPatch() - { - if (!std::uncaught_exceptions()) { - drop->execute(); - } - } - - void - writeSql(AdHoc::Buffer & sql) override - { - sql.append("SPLIT_PART(b.updatePack, '-', 2)::INT, SUBSTR(b.updatePack, 1, 1)::INT"); - } - - DB::ModifyCommandPtr drop; - DB::ModifyCommandPtr categoryInsert; - DB::ModifyCommandPtr packageInsert; - DB::SelectCommandPtr findPackage; - DB::ModifyCommandPtr updatesMoveUserPackages; - ChangeSet * changes; - Utils::EntityWhereFilter<std::string> updatePacks; - - void - move(DB::SelectCommandPtr s) - { - s->forEachRow<std::string, std::string, std::string, std::string, std::string>( - [this](auto catfrom, auto catto, auto namefrom, auto nameto, auto) { - if (this->exists(catfrom, namefrom) - && !this->exists(catto, nameto)) { // Does target already exist? - // Create category - categoryInsert->bindParamS(0, catto); - categoryInsert->bindParamS(1, catto); - categoryInsert->execute(); - // Create package - packageInsert->bindParamS(0, nameto); - packageInsert->bindParamS(1, "Created by package move"); - packageInsert->bindParamS(2, nameto); - packageInsert->bindParamS(3, catto); - packageInsert->execute(); - } - updatesMoveUserPackages->bindParamS(0, catfrom); - updatesMoveUserPackages->bindParamS(1, namefrom); - updatesMoveUserPackages->bindParamS(2, catto); - updatesMoveUserPackages->bindParamS(3, nameto); - updatesMoveUserPackages->execute(); - }); - } - - bool - exists(const std::string & cat, const std::string & pkg) - { - bool found = false; - findPackage->bindParamS(0, cat); - findPackage->bindParamS(1, pkg); - while (findPackage->fetch()) { - found = true; - } - return found; - } - }; + unsigned char + UpdatesProcessor::phase() const + { + return 1; + } + unsigned char + UpdatesProcessor::order() const + { + return 1; + } + bool + UpdatesProcessor::match(const PathParts & pp) const + { + return (pp.size() == 3 && pp[0] == "profiles" && pp[1] == "updates" && pp[2].substr(1, 4) == "Q-20"); + } - void - UpdatesProcessor::prepare(DB::Connection * dbc) + class UpdatesPatch : public DB::TablePatch, public DB::SqlWriter { + public: + explicit UpdatesPatch(DB::Connection * db) : + categoryInsert(sql::maintenance::categoryInsert.modify(db)), + packageInsert(sql::maintenance::packageInsert.modify(db)), + findPackage(sql::portage::findPackage.select(db)), + updatesMoveUserPackages(sql::maintenance::updatesMoveUserPackages.modify(db)), changes(nullptr), + updatePacks("updatePack") { - up = new UpdatesPatch(dbc); + this->src = Utils::Database::emptyClone(db, "gentoobrowse.updates"); + this->dest = "gentoobrowse.updates"; + this->pk = {"updatePack", "catfrom", "namefrom"}; + this->cols = {"updatePack", "catfrom", "namefrom", "catto", "nameto"}; + this->where = &updatePacks; + this->order = this; + this->beforeInsert = [this](auto && PH1) { + move(std::forward<decltype(PH1)>(PH1)); + }; + drop = db->modify("DROP TABLE " + this->src); } - void - UpdatesProcessor::apply(DB::Connection * dbc, ChangeSet & changes) + ~UpdatesPatch() override { - if (!up->updatePacks.entityIds.empty()) { - up->changes = &changes; - dbc->patchTable(up); + if (!std::uncaught_exceptions()) { + drop->execute(); } } + SPECIAL_MEMBERS_DELETE(UpdatesPatch); void - UpdatesProcessor::tidy(DB::Connection *) + writeSql(AdHoc::Buffer & sql) override { - delete up; + sql.append("SPLIT_PART(b.updatePack, '-', 2)::INT, SUBSTR(b.updatePack, 1, 1)::INT"); } + DB::ModifyCommandPtr drop; + DB::ModifyCommandPtr categoryInsert; + DB::ModifyCommandPtr packageInsert; + DB::SelectCommandPtr findPackage; + DB::ModifyCommandPtr updatesMoveUserPackages; + ChangeSet * changes; + Utils::EntityWhereFilter<std::string> updatePacks; + void - UpdatesProcessor::created( - DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + move(const DB::SelectCommandPtr & s) { - modified(dbc, r, fn, path); + s->forEachRow<std::string, std::string, std::string, std::string, std::string>( + [this](auto catfrom, auto catto, auto namefrom, auto nameto, auto) { + if (this->exists(catfrom, namefrom) + && !this->exists(catto, nameto)) { // Does target already exist? + // Create category + categoryInsert->bindParamS(0, catto); + categoryInsert->bindParamS(1, catto); + categoryInsert->execute(); + // Create package + packageInsert->bindParamS(0, nameto); + packageInsert->bindParamS(1, "Created by package move"); + packageInsert->bindParamS(2, nameto); + packageInsert->bindParamS(3, catto); + packageInsert->execute(); + } + updatesMoveUserPackages->bindParamS(0, catfrom); + updatesMoveUserPackages->bindParamS(1, namefrom); + updatesMoveUserPackages->bindParamS(2, catto); + updatesMoveUserPackages->bindParamS(3, nameto); + updatesMoveUserPackages->execute(); + }); } - void - UpdatesProcessor::modified( - DB::Connection * dbc, int64_t, const StringList & fn, const std::filesystem::path & path) + bool + exists(const std::string & cat, const std::string & pkg) { - AdHoc::FileUtils::MemMap u(path); - Glib::ustring d(std::string(u.sv())); - Glib::MatchInfo matches; - auto i = Utils::Database::tablePatchInserter(dbc, *up); - i->bindParamS(4, fn.back().c_str()); - up->updatePacks.entityIds.insert(fn.back()); - for (move->match(d, matches); matches.get_match_count() == 5; matches.next()) { - i->bindParamS(0, matches.fetch(1)); - i->bindParamS(1, matches.fetch(3)); - i->bindParamS(2, matches.fetch(2)); - i->bindParamS(3, matches.fetch(4)); - i->execute(); + bool found = false; + findPackage->bindParamS(0, cat); + findPackage->bindParamS(1, pkg); + while (findPackage->fetch()) { + found = true; } + return found; } + }; - void - UpdatesProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & p) - { - auto del = dbc->modify("DELETE FROM gentoobrowse.updates WHERE updatePack = ?"); - del->bindParamS(0, p.back()); + void + UpdatesProcessor::prepare(DB::Connection * dbc) + { + up = new UpdatesPatch(dbc); + } + + void + UpdatesProcessor::apply(DB::Connection * dbc, ChangeSet & changes) + { + if (!up->updatePacks.entityIds.empty()) { + up->changes = &changes; + dbc->patchTable(up); } } + + void + UpdatesProcessor::tidy(DB::Connection *) + { + delete up; + } + + void + UpdatesProcessor::created( + DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + { + modified(dbc, r, fn, path); + } + + void + UpdatesProcessor::modified(DB::Connection * dbc, int64_t, const StringList & fn, const std::filesystem::path & path) + { + AdHoc::FileUtils::MemMap u(path); + Glib::ustring d(std::string(u.sv())); + Glib::MatchInfo matches; + auto i = Utils::Database::tablePatchInserter(dbc, *up); + i->bindParamS(4, fn.back().c_str()); + up->updatePacks.entityIds.insert(fn.back()); + for (move->match(d, matches); matches.get_match_count() == 5; matches.next()) { + i->bindParamS(0, matches.fetch(1)); + i->bindParamS(1, matches.fetch(3)); + i->bindParamS(2, matches.fetch(2)); + i->bindParamS(3, matches.fetch(4)); + i->execute(); + } + } + + void + UpdatesProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & p) + { + auto del = dbc->modify("DELETE FROM gentoobrowse.updates WHERE updatePack = ?"); + del->bindParamS(0, p.back()); + } } FACTORY(Gentoo::Service::UpdatesProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/updatesProcessor.h b/gentoobrowse-api/service/maintenance/updatesProcessor.h index fa7a390..0063db7 100644 --- a/gentoobrowse-api/service/maintenance/updatesProcessor.h +++ b/gentoobrowse-api/service/maintenance/updatesProcessor.h @@ -1,34 +1,29 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_UPDATESPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_UPDATESPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> #include <modifycommand.h> -namespace Gentoo { - namespace Service { - class UpdatesPatch; - class UpdatesProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class UpdatesPatch; + class UpdatesProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - void prepare(DB::Connection * dbc) override; - void apply(DB::Connection * dbc, ChangeSet &) override; - void tidy(DB::Connection * dbc) override; + void prepare(DB::Connection * dbc) override; + void apply(DB::Connection * dbc, ChangeSet &) override; + void tidy(DB::Connection * dbc) override; - private: - UpdatesPatch * up; - }; - } + private: + UpdatesPatch * up; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/useGlobalProcessor.cpp b/gentoobrowse-api/service/maintenance/useGlobalProcessor.cpp index 6f0775b..04408ab 100644 --- a/gentoobrowse-api/service/maintenance/useGlobalProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/useGlobalProcessor.cpp @@ -7,63 +7,60 @@ using namespace AdHoc::FileUtils; -static Glib::RefPtr<Glib::Regex> useDesc - = Glib::Regex::create("^([^#\\s][^ ]*)\\s+-\\s+(.*)$", Glib::RegexCompileFlags::REGEX_MULTILINE); +namespace Gentoo::Service { + static Glib::RefPtr<Glib::Regex> useDesc + = Glib::Regex::create(R"(^([^#\s][^ ]*)\s+-\s+(.*)$)", Glib::RegexCompileFlags::REGEX_MULTILINE); -namespace Gentoo { - namespace Service { - unsigned char - UseGlobalProcessor::phase() const - { - return 2; - } - unsigned char - UseGlobalProcessor::order() const - { - return 10; - } - bool - UseGlobalProcessor::match(const PathParts & pp) const - { - return (pp.size() == 2 && pp[0] == "profiles" && pp[1] == "use.desc"); - } - - void - UseGlobalProcessor::created( - DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) - { - modified(dbc, r, fn, path); - } + unsigned char + UseGlobalProcessor::phase() const + { + return 2; + } + unsigned char + UseGlobalProcessor::order() const + { + return 10; + } + bool + UseGlobalProcessor::match(const PathParts & pp) const + { + return (pp.size() == 2 && pp[0] == "profiles" && pp[1] == "use.desc"); + } - void - UseGlobalProcessor::modified( - DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - DB::TablePatch p; - p.dest = "gentoobrowse.use_global"; - p.src = Utils::Database::emptyClone(dbc, p.dest); - p.pk = {"use"}; - p.cols = {"use", "description"}; + void + UseGlobalProcessor::created( + DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + { + modified(dbc, r, fn, path); + } - AdHoc::FileUtils::MemMap u(path); - Glib::ustring d(std::string(u.sv())); - Glib::MatchInfo matches; - auto i = Utils::Database::tablePatchInserter(dbc, p); - for (useDesc->match(d, matches); matches.get_match_count() == 3; matches.next()) { - i->bindParamS(0, matches.fetch(2)); - i->bindParamS(1, matches.fetch(1)); - i->execute(); - } - dbc->patchTable(&p); + void + UseGlobalProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + DB::TablePatch p; + p.dest = "gentoobrowse.use_global"; + p.src = Utils::Database::emptyClone(dbc, p.dest); + p.pk = {"use"}; + p.cols = {"use", "description"}; - Utils::Database::drop(dbc, p.src); + AdHoc::FileUtils::MemMap u(path); + Glib::ustring d(std::string(u.sv())); + Glib::MatchInfo matches; + auto i = Utils::Database::tablePatchInserter(dbc, p); + for (useDesc->match(d, matches); matches.get_match_count() == 3; matches.next()) { + i->bindParamS(0, matches.fetch(2)); + i->bindParamS(1, matches.fetch(1)); + i->execute(); } + dbc->patchTable(&p); - void - UseGlobalProcessor::deleted(DB::Connection * dbc, int64_t, const StringList &) - { - dbc->modify("DELETE FROM gentoobrowse.use_global")->execute(); - } + Utils::Database::drop(dbc, p.src); + } + + void + UseGlobalProcessor::deleted(DB::Connection * dbc, int64_t, const StringList &) + { + dbc->modify("DELETE FROM gentoobrowse.use_global")->execute(); } } FACTORY(Gentoo::Service::UseGlobalProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/useGlobalProcessor.h b/gentoobrowse-api/service/maintenance/useGlobalProcessor.h index a7fdc78..4577ac2 100644 --- a/gentoobrowse-api/service/maintenance/useGlobalProcessor.h +++ b/gentoobrowse-api/service/maintenance/useGlobalProcessor.h @@ -1,26 +1,21 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_USEGLOBALPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_USEGLOBALPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> #include <modifycommand.h> -namespace Gentoo { - namespace Service { - class UseGlobalProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class UseGlobalProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - }; - } + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/useGroupProcessor.cpp b/gentoobrowse-api/service/maintenance/useGroupProcessor.cpp index d42f740..205788a 100644 --- a/gentoobrowse-api/service/maintenance/useGroupProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/useGroupProcessor.cpp @@ -13,88 +13,84 @@ namespace U = Gentoo::Utils; -static Glib::RefPtr<Glib::Regex> useDesc - = Glib::Regex::create("^([^#\\s][^ ]*)\\s+-\\s+(.*)$", Glib::RegexCompileFlags::REGEX_MULTILINE); +namespace Gentoo::Service { + static Glib::RefPtr<Glib::Regex> useDesc + = Glib::Regex::create(R"(^([^#\s][^ ]*)\s+-\s+(.*)$)", Glib::RegexCompileFlags::REGEX_MULTILINE); -namespace Gentoo { - namespace Service { - unsigned char - UseGroupProcessor::phase() const - { - return 2; - } - unsigned char - UseGroupProcessor::order() const - { - return 10; - } - bool - UseGroupProcessor::match(const PathParts & pp) const - { - return (pp.size() == 3 && pp[0] == "profiles" && pp[1] == "desc" - && boost::algorithm::ends_with(pp[2], ".desc")); - } + unsigned char + UseGroupProcessor::phase() const + { + return 2; + } + unsigned char + UseGroupProcessor::order() const + { + return 10; + } + bool + UseGroupProcessor::match(const PathParts & pp) const + { + return (pp.size() == 3 && pp[0] == "profiles" && pp[1] == "desc" + && boost::algorithm::ends_with(pp[2], ".desc")); + } - void - UseGroupProcessor::created( - DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - auto m = sql::maintenance::useGroupsInsert.select(dbc); - m->bindParamS(0, path.stem().string()); - m->forEachRow<int64_t>([this, dbc, &path](auto useGroupId) { - this->mergeContent(dbc, path, useGroupId); - }); - } + void + UseGroupProcessor::created(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + auto m = sql::maintenance::useGroupsInsert.select(dbc); + m->bindParamS(0, path.stem().string()); + m->forEachRow<int64_t>([this, dbc, &path](auto useGroupId) { + this->mergeContent(dbc, path, useGroupId); + }); + } - void - UseGroupProcessor::modified( - DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - auto m = sql::maintenance::useGroupsGetId.select(dbc); - m->bindParamS(0, path.stem().string()); - m->forEachRow<int64_t>([this, dbc, &path](auto useGroupId) { - this->mergeContent(dbc, path, useGroupId); - }); - } + void + UseGroupProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + auto m = sql::maintenance::useGroupsGetId.select(dbc); + m->bindParamS(0, path.stem().string()); + m->forEachRow<int64_t>([this, dbc, &path](auto useGroupId) { + this->mergeContent(dbc, path, useGroupId); + }); + } - void - UseGroupProcessor::mergeContent(DB::Connection * dbc, const std::filesystem::path & path, int64_t useGroupId) - { - DB::TablePatch p; - p.dest = "gentoobrowse.use_group"; - U::EntityWhereFilter<int64_t> gwf("useGroupId", useGroupId); - p.src = Utils::Database::emptyClone(dbc, "gentoobrowse.use_group"); - p.pk = {"useGroupId", "use"}; - p.cols = {"useGroupId", "use", "description"}; - p.where = &gwf; + void + UseGroupProcessor::mergeContent(DB::Connection * dbc, const std::filesystem::path & path, int64_t useGroupId) + { + DB::TablePatch p; + p.dest = "gentoobrowse.use_group"; + U::EntityWhereFilter<int64_t> gwf("useGroupId", useGroupId); + p.src = Utils::Database::emptyClone(dbc, "gentoobrowse.use_group"); + p.pk = {"useGroupId", "use"}; + p.cols = {"useGroupId", "use", "description"}; + p.where = &gwf; - AdHoc::FileUtils::MemMap u(path); - Glib::ustring d(std::string(u.sv())); - Glib::MatchInfo matches; - auto i = Utils::Database::tablePatchInserter(dbc, p); - i->bindParamI(2, useGroupId); - // Dirty, but dupes exist - std::set<std::string> uses; - for (useDesc->match(d, matches); matches.get_match_count() == 3; matches.next()) { - if (uses.find(matches.fetch(1)) == uses.end()) { - i->bindParamS(1, matches.fetch(1)); - i->bindParamS(0, matches.fetch(2)); - i->execute(); - uses.insert(matches.fetch(1)); - } + AdHoc::FileUtils::MemMap u(path); + Glib::ustring d(std::string(u.sv())); + Glib::MatchInfo matches; + auto i = Utils::Database::tablePatchInserter(dbc, p); + i->bindParamI(2, useGroupId); + // Dirty, but dupes exist + std::set<std::string> uses; + for (useDesc->match(d, matches); matches.get_match_count() == 3; matches.next()) { + if (uses.find(matches.fetch(1)) == uses.end()) { + i->bindParamS(1, matches.fetch(1)); + i->bindParamS(0, matches.fetch(2)); + i->execute(); + uses.insert(matches.fetch(1)); } - dbc->patchTable(&p); - - Utils::Database::drop(dbc, p.src); } + dbc->patchTable(&p); - void - UseGroupProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) - { - auto m = sql::maintenance::useGroupsDelete.modify(dbc); - m->bindParamS(0, fn.back().substr(0, fn.back().find('.'))); - m->execute(); - } + Utils::Database::drop(dbc, p.src); + } + + void + UseGroupProcessor::deleted(DB::Connection * dbc, int64_t, const StringList & fn) + { + auto m = sql::maintenance::useGroupsDelete.modify(dbc); + m->bindParamS(0, fn.back().substr(0, fn.back().find('.'))); + m->execute(); } } FACTORY(Gentoo::Service::UseGroupProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/useGroupProcessor.h b/gentoobrowse-api/service/maintenance/useGroupProcessor.h index 29b1bb1..71ec083 100644 --- a/gentoobrowse-api/service/maintenance/useGroupProcessor.h +++ b/gentoobrowse-api/service/maintenance/useGroupProcessor.h @@ -1,29 +1,24 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_USEGROUPPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_USEGROUPPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> #include <modifycommand.h> -namespace Gentoo { - namespace Service { - class UseGroupProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class UseGroupProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - private: - void mergeContent(DB::Connection *, const std::filesystem::path &, int64_t id); - }; - } + private: + void mergeContent(DB::Connection *, const std::filesystem::path &, int64_t id); + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenance/useLocalProcessor.cpp b/gentoobrowse-api/service/maintenance/useLocalProcessor.cpp index 2379410..8ea53c5 100644 --- a/gentoobrowse-api/service/maintenance/useLocalProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/useLocalProcessor.cpp @@ -9,68 +9,65 @@ using namespace AdHoc::FileUtils; -static Glib::RefPtr<Glib::Regex> useDesc = Glib::Regex::create( - "^([^#\\s][^/]*)/([^:]+):([^ ]+)\\s+-\\s+(.*)$", Glib::RegexCompileFlags::REGEX_MULTILINE); +namespace Gentoo::Service { + static Glib::RefPtr<Glib::Regex> useDesc = Glib::Regex::create( + R"(^([^#\s][^/]*)/([^:]+):([^ ]+)\s+-\s+(.*)$)", Glib::RegexCompileFlags::REGEX_MULTILINE); -namespace Gentoo { - namespace Service { - unsigned char - UseLocalProcessor::phase() const - { - return 2; - } - unsigned char - UseLocalProcessor::order() const - { - return 10; - } - bool - UseLocalProcessor::match(const PathParts & pp) const - { - return (pp.size() == 2 && pp[0] == "profiles" && pp[1] == "use.local.desc"); - } - - void - UseLocalProcessor::created( - DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) - { - modified(dbc, r, fn, path); - } + unsigned char + UseLocalProcessor::phase() const + { + return 2; + } + unsigned char + UseLocalProcessor::order() const + { + return 10; + } + bool + UseLocalProcessor::match(const PathParts & pp) const + { + return (pp.size() == 2 && pp[0] == "profiles" && pp[1] == "use.local.desc"); + } - void - UseLocalProcessor::modified( - DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) - { - DB::TablePatch p; - auto tempTable = Utils::Database::namedTemp(dbc, "tmp_uselocalraw", - {{"category", "text"}, {"package", "text"}, {"use", "text"}, {"description", "text"}}); - p.dest = "gentoobrowse.use_local"; - DB::StaticSqlWriter srcExpr(sql::maintenance::useLocalMap.getSql()); - p.srcExpr = &srcExpr; - p.pk = {"packageId", "use"}; - p.cols = {"packageId", "use", "description"}; + void + UseLocalProcessor::created( + DB::Connection * dbc, int64_t r, const StringList & fn, const std::filesystem::path & path) + { + modified(dbc, r, fn, path); + } - AdHoc::FileUtils::MemMap u(path); - Glib::ustring d(std::string(u.sv())); - Glib::MatchInfo matches; - auto i = tempTable.second; - for (useDesc->match(d, matches); matches.get_match_count() == 5; matches.next()) { - i->bindParamS(0, matches.fetch(1)); - i->bindParamS(1, matches.fetch(4)); - i->bindParamS(2, matches.fetch(2)); - i->bindParamS(3, matches.fetch(3)); - i->execute(); - } - dbc->patchTable(&p); + void + UseLocalProcessor::modified(DB::Connection * dbc, int64_t, const StringList &, const std::filesystem::path & path) + { + DB::TablePatch p; + auto tempTable = Utils::Database::namedTemp(dbc, "tmp_uselocalraw", + {{"category", "text"}, {"package", "text"}, {"use", "text"}, {"description", "text"}}); + p.dest = "gentoobrowse.use_local"; + DB::StaticSqlWriter srcExpr(sql::maintenance::useLocalMap.getSql()); + p.srcExpr = &srcExpr; + p.pk = {"packageId", "use"}; + p.cols = {"packageId", "use", "description"}; - Utils::Database::drop(dbc, tempTable.first); + AdHoc::FileUtils::MemMap u(path); + Glib::ustring d(std::string(u.sv())); + Glib::MatchInfo matches; + auto i = tempTable.second; + for (useDesc->match(d, matches); matches.get_match_count() == 5; matches.next()) { + i->bindParamS(0, matches.fetch(1)); + i->bindParamS(1, matches.fetch(4)); + i->bindParamS(2, matches.fetch(2)); + i->bindParamS(3, matches.fetch(3)); + i->execute(); } + dbc->patchTable(&p); - void - UseLocalProcessor::deleted(DB::Connection * dbc, int64_t, const StringList &) - { - dbc->modify("DELETE FROM gentoobrowse.use_local")->execute(); - } + Utils::Database::drop(dbc, tempTable.first); + } + + void + UseLocalProcessor::deleted(DB::Connection * dbc, int64_t, const StringList &) + { + dbc->modify("DELETE FROM gentoobrowse.use_local")->execute(); } } FACTORY(Gentoo::Service::UseLocalProcessor, Gentoo::Service::FileProcessorFactory); diff --git a/gentoobrowse-api/service/maintenance/useLocalProcessor.h b/gentoobrowse-api/service/maintenance/useLocalProcessor.h index b2077bc..9f808da 100644 --- a/gentoobrowse-api/service/maintenance/useLocalProcessor.h +++ b/gentoobrowse-api/service/maintenance/useLocalProcessor.h @@ -1,26 +1,21 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_USELOCALPROC_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_USELOCALPROC_H +#pragma once #include "abstractFileProcessor.h" #include <connection.h> #include <filesystem> #include <modifycommand.h> -namespace Gentoo { - namespace Service { - class UseLocalProcessor : public AbstractFileProcessor { - public: - unsigned char phase() const override; - unsigned char order() const override; - bool match(const PathParts & pp) const override; +namespace Gentoo::Service { + class UseLocalProcessor : public AbstractFileProcessor { + public: + unsigned char phase() const override; + unsigned char order() const override; + bool match(const PathParts & pp) const override; - void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, - const std::filesystem::path & path) override; - void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; - }; - } + void created(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void modified(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn, + const std::filesystem::path & path) override; + void deleted(DB::Connection * dbc, int64_t repoid, const Gentoo::StringList & fn) override; + }; } - -#endif diff --git a/gentoobrowse-api/service/maintenanceBugs.cpp b/gentoobrowse-api/service/maintenanceBugs.cpp index ededc29..5023578 100644 --- a/gentoobrowse-api/service/maintenanceBugs.cpp +++ b/gentoobrowse-api/service/maintenanceBugs.cpp @@ -12,103 +12,100 @@ #include <tablepatch.h> #include <utils/dbUtils.h> -namespace Gentoo { - namespace Service { - AdHoc::Lexer::PatternPtr bugLink = AdHoc::LexerMatchers::regex( - R"R(Bug:(\d+) - "" status:(\w*) resolution:(\w*) severity:(\w*).*)R", G_REGEX_OPTIMIZE); +namespace Gentoo::Service { + AdHoc::Lexer::PatternPtr bugLink = AdHoc::LexerMatchers::regex( + R"R(Bug:(\d+) - "" status:(\w*) resolution:(\w*) severity:(\w*).*)R", G_REGEX_OPTIMIZE); - class BugListParser : public xmlpp::SaxParser, AdHoc::Lexer { - public: - BugListParser(DB::ModifyCommandPtr i) : ins(i) - { - rules.push_back({{InitialState}, bugLink, [this](auto es) { - ins->bindParamI(0, boost::lexical_cast<int64_t>(*es->pattern()->match(1))); - ins->bindParamS(2, *es->pattern()->match(2)); - ins->bindParamS(1, *es->pattern()->match(4)); - }}); - } + class BugListParser : public xmlpp::SaxParser, AdHoc::Lexer { + public: + explicit BugListParser(DB::ModifyCommandPtr i) : ins(std::move(i)) + { + rules.push_back({{InitialState}, bugLink, [this](auto es) { + ins->bindParamI(0, boost::lexical_cast<int64_t>(*es->pattern()->match(1))); + ins->bindParamS(2, *es->pattern()->match(2)); + ins->bindParamS(1, *es->pattern()->match(4)); + }}); + } - protected: - void - on_start_element(const Glib::ustring & e, const xmlpp::SaxParser::AttributeList &) override - { - stk.push(e); - } + protected: + void + on_start_element(const Glib::ustring & e, const xmlpp::SaxParser::AttributeList &) override + { + stk.push(e); + } - void - on_characters(const Glib::ustring & t) override - { - if (stk.top() == "a") { - attributes += t; - } - else if (stk.top() == "em") { - summary += t; - } + void + on_characters(const Glib::ustring & t) override + { + if (stk.top() == "a") { + attributes += t; } + else if (stk.top() == "em") { + summary += t; + } + } - void - on_end_element(const Glib::ustring & e) override - { - stk.pop(); - if (e == "li") { - extract(attributes.c_str(), attributes.length()); - ins->bindParamS(3, summary); - ins->execute(); - attributes.clear(); - summary.clear(); - } + void + on_end_element(const Glib::ustring & e) override + { + stk.pop(); + if (e == "li") { + extract(attributes.c_str(), attributes.length()); + ins->bindParamS(3, summary); + ins->execute(); + attributes.clear(); + summary.clear(); } + } - private: - DB::ModifyCommandPtr ins; - std::stack<Glib::ustring> stk; + private: + DB::ModifyCommandPtr ins; + std::stack<Glib::ustring> stk; - Glib::ustring attributes; - Glib::ustring summary; - }; + Glib::ustring attributes; + Glib::ustring summary; + }; - AdHocFormatter(UpdatingBugs, "Refreshing bug list from %?"); - AdHocFormatter(UpdatingBugUrl, " ... %?"); - AdHocFormatter(UpdatingBugsResult, "Refreshed bug list: %? added, %? updated, %? removed"); - constexpr const std::string_view NagiosServiceName("GB API Bug Updates"); - void - Maintenance::refreshBugs(const Ice::Current & c) - { - try { - auto log = LOGMANAGER()->getLogger(__FUNCTION__); - std::filesystem::path root = properties(c)->getPropertyWithDefault( - "GentooBrowseAPI.BugRoot", "https://bugs.gentoo.org/data/cached"); + AdHocFormatter(UpdatingBugs, "Refreshing bug list from %?"); + AdHocFormatter(UpdatingBugUrl, " ... %?"); + AdHocFormatter(UpdatingBugsResult, "Refreshed bug list: %? added, %? updated, %? removed"); + constexpr const std::string_view NagiosServiceName("GB API Bug Updates"); + void + Maintenance::refreshBugs(const Ice::Current & c) + { + try { + auto log = LOGMANAGER()->getLogger(__FUNCTION__); + std::filesystem::path root = properties(c)->getPropertyWithDefault( + "GentooBrowseAPI.BugRoot", "https://bugs.gentoo.org/data/cached"); - log->messagectf<UpdatingBugs>(IceTray::Logging::LogLevel::INFO, root); - auto dbc = db->get(); - DB::TransactionScope tx(*dbc.get()); - DB::TablePatch tp; - tp.pk = {"bugId"}; - tp.cols = {"bugId", "severity", "status", "summary"}; - tp.dest = "gentoobrowse.bugs"; - tp.src = Utils::Database::emptyClone(dbc.get(), "gentoobrowse.bugs"); - auto ins = Utils::Database::tablePatchInserter(dbc.get(), tp); - BugListParser blp(ins); - for (const auto & bl : - {"buglist-CONFIRMED.html", "buglist-UNCONFIRMED.html", "buglist-IN_PROGRESS.html"}) { - log->messagectf<UpdatingBugUrl>(IceTray::Logging::LogLevel::DEBUG, bl); - AdHoc::Net::CurlStreamSource css(root / bl); - css.setopt(CURLOPT_ENCODING, "deflate, gzip"); - css.setopt(CURLOPT_TIMEOUT, 20L); - AdHoc::Net::CurlStream cs(css); - blp.parse_stream(cs); - } - auto result = dbc->patchTable(&tp); - Utils::Database::drop(dbc.get(), tp.src); - log->messagectf<UpdatingBugsResult>( - IceTray::Logging::LogLevel::INFO, result.inserts, result.updates, result.deletes); - AdHoc::submitNagiosPassiveServiceCheck(NagiosServiceName, AdHoc::NagiosStatusCode::OK, - UpdatingBugsResult::get(result.inserts, result.updates, result.deletes)); - } - catch (const std::exception & ex) { - AdHoc::submitNagiosPassiveServiceCheck(NagiosServiceName, AdHoc::NagiosStatusCode::Warning, ex.what()); - throw; + log->messagectf<UpdatingBugs>(IceTray::Logging::LogLevel::INFO, root); + auto dbc = db->get(); + DB::TransactionScope tx(*dbc.get()); + DB::TablePatch tp; + tp.pk = {"bugId"}; + tp.cols = {"bugId", "severity", "status", "summary"}; + tp.dest = "gentoobrowse.bugs"; + tp.src = Utils::Database::emptyClone(dbc.get(), "gentoobrowse.bugs"); + auto ins = Utils::Database::tablePatchInserter(dbc.get(), tp); + BugListParser blp(ins); + for (const auto & bl : {"buglist-CONFIRMED.html", "buglist-UNCONFIRMED.html", "buglist-IN_PROGRESS.html"}) { + log->messagectf<UpdatingBugUrl>(IceTray::Logging::LogLevel::DEBUG, bl); + AdHoc::Net::CurlStreamSource css(root / bl); + css.setopt(CURLOPT_ENCODING, "deflate, gzip"); + css.setopt(CURLOPT_TIMEOUT, 20L); + AdHoc::Net::CurlStream cs(css); + blp.parse_stream(cs); } + auto result = dbc->patchTable(&tp); + Utils::Database::drop(dbc.get(), tp.src); + log->messagectf<UpdatingBugsResult>( + IceTray::Logging::LogLevel::INFO, result.inserts, result.updates, result.deletes); + AdHoc::submitNagiosPassiveServiceCheck(NagiosServiceName, AdHoc::NagiosStatusCode::OK, + UpdatingBugsResult::get(result.inserts, result.updates, result.deletes)); + } + catch (const std::exception & ex) { + AdHoc::submitNagiosPassiveServiceCheck(NagiosServiceName, AdHoc::NagiosStatusCode::Warning, ex.what()); + throw; } } } diff --git a/gentoobrowse-api/service/maintenanceCommon.cpp b/gentoobrowse-api/service/maintenanceCommon.cpp index 77f77ae..e225848 100644 --- a/gentoobrowse-api/service/maintenanceCommon.cpp +++ b/gentoobrowse-api/service/maintenanceCommon.cpp @@ -8,122 +8,119 @@ #include <safeMapFind.h> #include <users.h> -namespace Gentoo { - namespace Service { - class BaseScheduledTask : public IceUtil::TimerTask { - public: - BaseScheduledTask(Ice::CommunicatorPtr i) : ic(i) { } +namespace Gentoo::Service { + class BaseScheduledTask : public IceUtil::TimerTask { + public: + explicit BaseScheduledTask(Ice::CommunicatorPtr i) : ic(std::move(i)) { } - private: - Ice::CommunicatorPtr ic; - }; + private: + Ice::CommunicatorPtr ic; + }; - class AutoUpdatePackages : public BaseScheduledTask { - public: - AutoUpdatePackages(Ice::CommunicatorPtr i) : BaseScheduledTask(i) { } + class AutoUpdatePackages : public BaseScheduledTask { + public: + explicit AutoUpdatePackages(Ice::CommunicatorPtr i) : BaseScheduledTask(std::move(i)) { } - void - runTimerTask() override - { - auto m = IceTray::Cube::get<Maintenance>(); - auto rb = m->refreshBugsAsync(); - m->updateRepositories(); - m->refreshPackageTree(); - m->sendNotifications(); - rb.get(); - } - }; - - class UserMaintenance : public BaseScheduledTask { - public: - UserMaintenance(Ice::CommunicatorPtr i) : BaseScheduledTask(i) { } + void + runTimerTask() override + { + auto m = IceTray::Cube::get<Maintenance>(); + auto rb = m->refreshBugsAsync(); + m->updateRepositories(); + m->refreshPackageTree(); + m->sendNotifications(); + rb.get(); + } + }; - void - runTimerTask() override - { - auto u = IceTray::Cube::get<Users>(); - u->prune(); - } - }; + class UserMaintenance : public BaseScheduledTask { + public: + explicit UserMaintenance(Ice::CommunicatorPtr i) : BaseScheduledTask(std::move(i)) { } - Maintenance::Maintenance( - const DB::ConnectionPoolPtr & d, const Ice::CommunicatorPtr & ic, const Ice::PropertiesPtr & p) : - Maintenance::Maintenance(d) + void + runTimerTask() override { - addTask<AutoUpdatePackages>(ic, p, "SyncTime"); - addTask<UserMaintenance>(ic, p, "UserMaintenanceTime"); + auto u = IceTray::Cube::get<Users>(); + u->prune(); } + }; - Maintenance::Maintenance(const DB::ConnectionPoolPtr & d) : IceTray::AbstractDatabaseClient(d) { } + Maintenance::Maintenance(DB::ConnectionPoolPtr d, const Ice::CommunicatorPtr & ic, const Ice::PropertiesPtr & p) : + Maintenance::Maintenance(std::move(d)) + { + addTask<AutoUpdatePackages>(ic, p, "SyncTime"); + addTask<UserMaintenance>(ic, p, "UserMaintenanceTime"); + } - Maintenance::~Maintenance() - { - if (taskRunner) { - taskRunner->destroy(); - } + Maintenance::Maintenance(DB::ConnectionPoolPtr d) : IceTray::AbstractDatabaseClient(std::move(d)) { } + + Maintenance::~Maintenance() + { + if (taskRunner) { + taskRunner->destroy(); } + } - template<typename Task> - void - Maintenance::addTask(Ice::CommunicatorPtr ic, Ice::PropertiesPtr p, const std::string & whenCfg) - { - if (auto sync = p->getPropertyAsIntWithDefault("GentooBrowseAPI." + whenCfg, 0) * 60) { - if (!taskRunner) { - taskRunner = new IceUtil::Timer(); - } - taskRunner->scheduleRepeated(std::make_shared<Task>(ic), IceUtil::Time::seconds(sync)); + template<typename Task> + void + Maintenance::addTask(const Ice::CommunicatorPtr & ic, const Ice::PropertiesPtr & p, const std::string & whenCfg) + { + if (auto sync = p->getPropertyAsIntWithDefault("GentooBrowseAPI." + whenCfg, 0) * 60) { + if (!taskRunner) { + taskRunner = new IceUtil::Timer(); } + taskRunner->scheduleRepeated(std::make_shared<Task>(ic), IceUtil::Time::seconds(sync)); } + } - Ice::PropertiesPtr - Maintenance::properties(const Ice::Current & c) - { - return c.adapter->getCommunicator()->getProperties(); - } + Ice::PropertiesPtr + Maintenance::properties(const Ice::Current & c) + { + return c.adapter->getCommunicator()->getProperties(); + } - Gentoo::UserNews - Maintenance::getUserNews(const Ice::Current &) - { - auto portage = IceTray::Cube::get<Portage>(); - portage->ice_ping(); - auto categories = portage->getAllCategories(); + Gentoo::UserNews + Maintenance::getUserNews(const Ice::Current &) + { + auto portage = IceTray::Cube::get<Portage>(); + portage->ice_ping(); + auto categories = portage->getAllCategories(); - UserNews un; - auto t = fetch<NewsContentTriggers>(sql::maintenance::getNotificationEbuildLists); - std::transform(t.begin(), t.end(), std::inserter(un, un.end()), - [&categories, &portage](const NewsContentTriggers::value_type & t) { - NewsContent nc; - std::copy_if(categories.begin(), categories.end(), std::back_inserter(nc.categories), - [&t](const Gentoo::CategoryPtr & c) { - return AdHoc::containerContains(t.categoryids, c->categoryid); + UserNews un; + auto t = fetch<NewsContentTriggers>(sql::maintenance::getNotificationEbuildLists); + std::transform(t.begin(), t.end(), std::inserter(un, un.end()), + [&categories, &portage](const NewsContentTriggers::value_type & t) { + NewsContent nc; + std::copy_if(categories.begin(), categories.end(), std::back_inserter(nc.categories), + [&t](const Gentoo::CategoryPtr & c) { + return AdHoc::containerContains(t.categoryids, c->categoryid); + }); + for (auto pid : t.packageids) { + nc.packages.emplace_back(portage->getPackage(pid)); + auto vs = portage->getPackageVersions(pid); + std::copy_if(vs.begin(), vs.end(), std::back_inserter(nc.ebuilds), + [&t](const Gentoo::EbuildPtr & v) { + return AdHoc::containerContains(t.ebuildids, v->ebuildid); }); - for (auto pid : t.packageids) { - nc.packages.emplace_back(portage->getPackage(pid)); - auto vs = portage->getPackageVersions(pid); - std::copy_if(vs.begin(), vs.end(), std::back_inserter(nc.ebuilds), - [&t](const Gentoo::EbuildPtr & v) { - return AdHoc::containerContains(t.ebuildids, v->ebuildid); - }); - } - return UserNews::value_type(t.userid, nc); - }); - return un; - } + } + return UserNews::value_type(t.userid, nc); + }); + return un; + } - void - Maintenance::sendNotifications(const Ice::Current & current) - { - auto notifications = IceTray::Cube::get<Notifications>(); - auto mailServer = IceTray::Cube::get<IceTray::Mail::MailServer>(); - auto users = IceTray::Cube::get<Users>(); - users->ice_ping(); + void + Maintenance::sendNotifications(const Ice::Current & current) + { + auto notifications = IceTray::Cube::get<Notifications>(); + auto mailServer = IceTray::Cube::get<IceTray::Mail::MailServer>(); + auto users = IceTray::Cube::get<Users>(); + users->ice_ping(); - for (const auto & trigger : getUserNews(current)) { - auto user = users->get(trigger.first); - auto email = notifications->getNews(user, trigger.second); - mailServer->sendEmail(email); - users->mailshotsent(user->userid); - } + for (const auto & trigger : getUserNews(current)) { + auto user = users->get(trigger.first); + auto email = notifications->getNews(user, trigger.second); + mailServer->sendEmail(email); + users->mailshotsent(user->userid); } } } diff --git a/gentoobrowse-api/service/maintenanceGitOperations.cpp b/gentoobrowse-api/service/maintenanceGitOperations.cpp index 28940da..ade5c9a 100644 --- a/gentoobrowse-api/service/maintenanceGitOperations.cpp +++ b/gentoobrowse-api/service/maintenanceGitOperations.cpp @@ -17,235 +17,236 @@ #include <systemd/sd-daemon.h> #include <utils/dbUtils.h> -namespace Gentoo { - namespace Service { - using namespace Utils::Git; - namespace pl = std::placeholders; - - typedef std::set<std::string> StringSet; - - static int - onFile(const git_diff_delta * delta, void * fileset) - { - static_cast<StringSet *>(fileset)->insert(delta->old_file.path); - static_cast<StringSet *>(fileset)->insert(delta->new_file.path); - return 0; - } +namespace Gentoo::Service { + using namespace Utils::Git; + using StringSet = std::set<std::string>; + + static int + onFile(const git_diff_delta * delta, void * fileset) + { + static_cast<StringSet *>(fileset)->insert(delta->old_file.path); + static_cast<StringSet *>(fileset)->insert(delta->new_file.path); + return 0; + } - template<typename T> - static int - onFile(const git_diff_delta * delta, T, void * fileset) - { - return onFile(delta, fileset); - } + template<typename T> + static int + onFile(const git_diff_delta * delta, T, void * fileset) + { + return onFile(delta, fileset); + } - AdHocFormatter(UpdatingChangeLog, "Updating change log for repository %? with range %?...%?"); - AdHocFormatter(UpdatedChangeLog, "Updated change log for repository %?, added %? new entries"); - static void - writeChangeLog(DB::Connection * db, int64_t repoId, git_repository * repo, const git_oid & lastCommitOid, - const git_oid & headCommitOid) - { - auto log = LOGMANAGER()->getLogger(__FUNCTION__); - log->messagectf<UpdatingChangeLog>(IceTray::Logging::LogLevel::INFO, repoId, lastCommitOid, headCommitOid); - auto cli = sql::maintenance::changeLogInsert.modify(db); - cli->bindParamI(0, repoId); - // Set up walker - auto walker = gitSafeGet(git_revwalk_new, git_revwalk_free, repo); - gitSafe(git_revwalk_push, walker.get(), &headCommitOid); - gitSafe(git_revwalk_hide, walker.get(), &lastCommitOid); - - git_oid oid; - unsigned int count = 0; - // Walk through revisions - while (!git_revwalk_next(&oid, walker.get())) { - // Get commit - auto commit = gitSafeGet(git_commit_lookup, git_commit_free, repo, &oid); - - // Get commit's tree - auto currentTree = gitSafeGet(git_commit_tree, git_tree_free, commit.get()); - - // Collect all files change in commit from all parents - std::unique_ptr<git_tree, void (*)(git_tree *)> parentTree(nullptr, git_tree_free); - if (git_commit_parentcount(commit.get()) > 0) { - auto parentCommit = gitSafeGet(git_commit_parent, git_commit_free, commit.get(), 0U); - // Get parent tree - parentTree = gitSafeGet(git_commit_tree, git_tree_free, parentCommit.get()); - } - // Get tree to tree diff - auto diff = gitSafeGet( - git_diff_tree_to_tree, git_diff_free, repo, currentTree.get(), parentTree.get(), nullptr); - // Compare trees - StringSet fs; - gitSafe(git_diff_foreach, diff.get(), onFile<float>, onFile<const git_diff_binary *>, nullptr, nullptr, - &fs); - - // Insert commit into DB - auto sig = git_commit_author(commit.get()); - cli->bindParamS(1, *oid); - cli->bindParamT(2, boost::posix_time::from_time_t(sig->when.time)); - cli->bindParamS(3, git_commit_summary(commit.get())); - cli->bindParamS(4, git_commit_body(commit.get())); - cli->bindParamS(5, sig->name); - cli->bindParamS(6, sig->email); - cli->bindParamS(7, Slicer::packPqArray(fs)); - count += cli->execute(); + AdHocFormatter(UpdatingChangeLog, "Updating change log for repository %? with range %?...%?"); + AdHocFormatter(UpdatedChangeLog, "Updated change log for repository %?, added %? new entries"); + static void + writeChangeLog(DB::Connection * db, int64_t repoId, git_repository * repo, const git_oid & lastCommitOid, + const git_oid & headCommitOid) + { + auto log = LOGMANAGER()->getLogger(__FUNCTION__); + log->messagectf<UpdatingChangeLog>(IceTray::Logging::LogLevel::INFO, repoId, lastCommitOid, headCommitOid); + auto cli = sql::maintenance::changeLogInsert.modify(db); + cli->bindParamI(0, repoId); + // Set up walker + auto walker = gitSafeGet(git_revwalk_new, git_revwalk_free, repo); + gitSafe(git_revwalk_push, walker.get(), &headCommitOid); + gitSafe(git_revwalk_hide, walker.get(), &lastCommitOid); + + git_oid oid; + unsigned int count = 0; + // Walk through revisions + while (!git_revwalk_next(&oid, walker.get())) { + // Get commit + auto commit = gitSafeGet(git_commit_lookup, git_commit_free, repo, &oid); + + // Get commit's tree + auto currentTree = gitSafeGet(git_commit_tree, git_tree_free, commit.get()); + + // Collect all files change in commit from all parents + std::unique_ptr<git_tree, void (*)(git_tree *)> parentTree(nullptr, git_tree_free); + if (git_commit_parentcount(commit.get()) > 0) { + auto parentCommit = gitSafeGet(git_commit_parent, git_commit_free, commit.get(), 0U); + // Get parent tree + parentTree = gitSafeGet(git_commit_tree, git_tree_free, parentCommit.get()); } - log->messagectf<UpdatedChangeLog>(IceTray::Logging::LogLevel::INFO, repoId, count); + // Get tree to tree diff + auto diff = gitSafeGet( + git_diff_tree_to_tree, git_diff_free, repo, currentTree.get(), parentTree.get(), nullptr); + // Compare trees + StringSet fs; + gitSafe(git_diff_foreach, diff.get(), onFile<float>, onFile<const git_diff_binary *>, nullptr, nullptr, + &fs); + + // Insert commit into DB + auto sig = git_commit_author(commit.get()); + cli->bindParamS(1, *oid); + cli->bindParamT(2, boost::posix_time::from_time_t(sig->when.time)); + cli->bindParamS(3, git_commit_summary(commit.get())); + cli->bindParamS(4, git_commit_body(commit.get())); + cli->bindParamS(5, sig->name); + cli->bindParamS(6, sig->email); + cli->bindParamS(7, Slicer::packPqArray(fs)); + count += cli->execute(); } + log->messagectf<UpdatedChangeLog>(IceTray::Logging::LogLevel::INFO, repoId, count); + } - void - Maintenance::updateRepositories(const Ice::Current &) - { - for (auto & repo : fetch<Gentoo::Repositories>(sql::maintenance::reposToUpdate)) { - updateRepository(repo.path, repo.upstream, repo.branch); - } + void + Maintenance::updateRepositories(const Ice::Current &) + { + for (auto & repo : fetch<Gentoo::Repositories>(sql::maintenance::reposToUpdate)) { + updateRepository(repo.path, repo.upstream, repo.branch); } + } - static int - insertFileChange(const git_diff_delta * delta, void * ptr) - { - auto cs = static_cast<ChangeSet *>(ptr); - switch (delta->status) { - case GIT_DELTA_ADDED: - case GIT_DELTA_MODIFIED: - case GIT_DELTA_DELETED: { - std::filesystem::path path(delta->new_file.path); - cs->insert({path, {{path.begin(), path.end()}, delta->status}}); - } break; - default: - throw GitError("Insert Git file changes", 0, 0, "Unexpected change status."); - } - return 0; + static int + insertFileChange(const git_diff_delta * delta, void * ptr) + { + auto cs = static_cast<ChangeSet *>(ptr); + switch (delta->status) { + case GIT_DELTA_ADDED: + case GIT_DELTA_MODIFIED: + case GIT_DELTA_DELETED: { + std::filesystem::path path(delta->new_file.path); + cs->insert({path, {{path.begin(), path.end()}, delta->status}}); + } break; + default: + throw GitError("Insert Git file changes", 0, 0, "Unexpected change status."); } + return 0; + } - template<typename T> - static int - insertFileChangeT(const git_diff_delta * delta, T, void * ptr) - { - return insertFileChange(delta, ptr); - } + template<typename T> + static int + insertFileChangeT(const git_diff_delta * delta, T, void * ptr) + { + return insertFileChange(delta, ptr); + } - static ChangeSet writeChangesToFileList( - int64_t repoId, git_repository * repo, const git_oid & last, const git_oid & head); - - ChangeSet - refreshRepository(DB::Connection * db, Ice::PropertiesPtr properties, const Repository & repository) - { - auto targetRef = properties->getProperty("GentooBrowseAPI.RefreshTarget." + repository.name); - auto repo = gitSafeGet(git_repository_open, git_repository_free, repository.path.c_str()); - auto lastCommitOid = gitSafeGet(git_oid_fromstr, repository.lastcommit.c_str()); - auto headCommitOid = targetRef.empty() ? gitSafeGet(git_reference_name_to_id, repo.get(), "HEAD") - : gitSafeGet(git_oid_fromstr, targetRef.c_str()); - auto updateLastCommit = sql::maintenance::repoSetLastCommit.modify(db); - updateLastCommit->bindParamS(0, *headCommitOid); - updateLastCommit->bindParamI(1, repository.repoid); - updateLastCommit->execute(); - - writeChangeLog(db, repository.repoid, repo.get(), lastCommitOid, headCommitOid); - return writeChangesToFileList(repository.repoid, repo.get(), lastCommitOid, headCommitOid); - } + static ChangeSet writeChangesToFileList( + int64_t repoId, git_repository * repo, const git_oid & last, const git_oid & head); + + ChangeSet + refreshRepository(DB::Connection * db, const Ice::PropertiesPtr & properties, const Repository & repository) + { + auto targetRef = properties->getProperty("GentooBrowseAPI.RefreshTarget." + repository.name); + auto repo = gitSafeGet(git_repository_open, git_repository_free, repository.path.c_str()); + auto lastCommitOid = gitSafeGet(git_oid_fromstr, repository.lastcommit.c_str()); + auto headCommitOid = targetRef.empty() ? gitSafeGet(git_reference_name_to_id, repo.get(), "HEAD") + : gitSafeGet(git_oid_fromstr, targetRef.c_str()); + auto updateLastCommit = sql::maintenance::repoSetLastCommit.modify(db); + updateLastCommit->bindParamS(0, *headCommitOid); + updateLastCommit->bindParamI(1, repository.repoid); + updateLastCommit->execute(); + + writeChangeLog(db, repository.repoid, repo.get(), lastCommitOid, headCommitOid); + return writeChangesToFileList(repository.repoid, repo.get(), lastCommitOid, headCommitOid); + } - AdHocFormatter(FindingChanges, "Finding changes for repository %? with range %?...%?"); - ChangeSet - writeChangesToFileList( - int64_t repoId, git_repository * repo, const git_oid & lastCommitOid, const git_oid & headCommitOid) - { - auto log = LOGMANAGER()->getLogger(__FUNCTION__); - log->messagectf<FindingChanges>(IceTray::Logging::LogLevel::DEBUG, repoId, lastCommitOid, headCommitOid); - auto lastCommit = gitSafeGet(git_commit_lookup, git_commit_free, repo, &lastCommitOid); - auto headCommit = gitSafeGet(git_commit_lookup, git_commit_free, repo, &headCommitOid); - auto lastTree = gitSafeGet(git_commit_tree, git_tree_free, lastCommit.get()); - auto headTree = gitSafeGet(git_commit_tree, git_tree_free, headCommit.get()); - auto diff = gitSafeGet(git_diff_tree_to_tree, git_diff_free, repo, lastTree.get(), headTree.get(), nullptr); - ChangeSet changes; - gitSafe(git_diff_foreach, diff.get(), insertFileChangeT<float>, insertFileChangeT<const git_diff_binary *>, - nullptr, nullptr, &changes); - return changes; - } + AdHocFormatter(FindingChanges, "Finding changes for repository %? with range %?...%?"); + ChangeSet + writeChangesToFileList( + int64_t repoId, git_repository * repo, const git_oid & lastCommitOid, const git_oid & headCommitOid) + { + auto log = LOGMANAGER()->getLogger(__FUNCTION__); + log->messagectf<FindingChanges>(IceTray::Logging::LogLevel::DEBUG, repoId, lastCommitOid, headCommitOid); + auto lastCommit = gitSafeGet(git_commit_lookup, git_commit_free, repo, &lastCommitOid); + auto headCommit = gitSafeGet(git_commit_lookup, git_commit_free, repo, &headCommitOid); + auto lastTree = gitSafeGet(git_commit_tree, git_tree_free, lastCommit.get()); + auto headTree = gitSafeGet(git_commit_tree, git_tree_free, headCommit.get()); + auto diff = gitSafeGet(git_diff_tree_to_tree, git_diff_free, repo, lastTree.get(), headTree.get(), nullptr); + ChangeSet changes; + gitSafe(git_diff_foreach, diff.get(), insertFileChangeT<float>, insertFileChangeT<const git_diff_binary *>, + nullptr, nullptr, &changes); + return changes; + } - constexpr const std::string_view NagiosServiceName("GB API Package Updates"); - void - Maintenance::refreshPackageTree(const Ice::Current & c) - { - try { - auto properties = c.adapter->getCommunicator()->getProperties(); - auto repoRoot - = std::filesystem::path(properties->getPropertyWithDefault("GentooBrowseAPI.RepoRoot", "/")); - auto dbc = db->get(); - DB::TransactionScope tx(*dbc.get()); - for (const auto & repo : fetch<Gentoo::Repositories>(dbc.get(), sql::maintenance::reposToGitRefresh)) { - auto changes = refreshRepository(dbc.get(), properties, repo); - this->applyFileChanges(dbc.get(), repoRoot, repo, changes); - } - time_t now = time(nullptr); - sd_notifyf(0, "STATUS=Last update %s", ctime(&now)); - AdHoc::submitNagiosPassiveServiceCheck( - NagiosServiceName, AdHoc::NagiosStatusCode::OK, "Package tree(s) updated"); - } - catch (const std::exception & ex) { - AdHoc::submitNagiosPassiveServiceCheck(NagiosServiceName, AdHoc::NagiosStatusCode::Warning, ex.what()); - throw; + constexpr const std::string_view NagiosServiceName("GB API Package Updates"); + void + Maintenance::refreshPackageTree(const Ice::Current & c) + { + try { + auto properties = c.adapter->getCommunicator()->getProperties(); + auto repoRoot = std::filesystem::path(properties->getPropertyWithDefault("GentooBrowseAPI.RepoRoot", "/")); + auto dbc = db->get(); + DB::TransactionScope tx(*dbc.get()); + for (const auto & repo : fetch<Gentoo::Repositories>(dbc.get(), sql::maintenance::reposToGitRefresh)) { + auto changes = refreshRepository(dbc.get(), properties, repo); + this->applyFileChanges(dbc.get(), repoRoot, repo, changes); } + time_t now = time(nullptr); + sd_notifyf(0, "STATUS=Last update %s", ctime(&now)); + AdHoc::submitNagiosPassiveServiceCheck( + NagiosServiceName, AdHoc::NagiosStatusCode::OK, "Package tree(s) updated"); } + catch (const std::exception & ex) { + AdHoc::submitNagiosPassiveServiceCheck(NagiosServiceName, AdHoc::NagiosStatusCode::Warning, ex.what()); + throw; + } + } - AdHocFormatter(UpdatingFileContent, "Updating file content"); - AdHocFormatter(UpdatedFileContent, "Updated file content"); - void - Maintenance::applyFileChanges(DB::Connection * dbc, const std::filesystem::path & repoRoot, - const Repository & repo, ChangeSet & changes) const - { - auto log = LOGMANAGER()->getLogger(__FUNCTION__); - log->messagectf<UpdatingFileContent>(IceTray::Logging::LogLevel::DEBUG); - // Map of phase, to order, to processor - std::map<unsigned char, std::multimap<unsigned char, FileProcessorPtr>> fps; - for (const auto & fpf : AdHoc::PluginManager::getDefault()->getAll<FileProcessorFactory>()) { - FileProcessorPtr processor(fpf->implementation()->create()); - fps[processor->phase()].insert({processor->order(), processor})->second->prepare(dbc); - } - // Processor -> repoId, PathParts, Path - typedef std::function<void( - FileProcessorPtr, int64_t, const Gentoo::StringList &, const std::filesystem::path &)> - FileHandleFunc; - std::map<git_delta_t, FileHandleFunc> funcs; - funcs[GIT_DELTA_DELETED] = std::bind(&AbstractFileProcessor::deleted, pl::_1, dbc, pl::_2, pl::_3); - funcs[GIT_DELTA_MODIFIED] - = std::bind(&AbstractFileProcessor::modified, pl::_1, dbc, pl::_2, pl::_3, pl::_4); - funcs[GIT_DELTA_ADDED] = std::bind(&AbstractFileProcessor::created, pl::_1, dbc, pl::_2, pl::_3, pl::_4); - - const auto repoPath = repoRoot / std::filesystem::path(repo.path).lexically_relative("/"); - // Phases - for (const auto & phase : fps) { - std::set<FileProcessorPtr> usedProcessors; - // Processors - for (const auto & processorOrder : phase.second) { - auto processor = processorOrder.second; - // Changes - for (auto change = changes.begin(); change != changes.end();) { - if (processor->match(change->second.pathParts)) { - funcs[change->second.changeType]( - processor, repo.repoid, change->second.pathParts, repoPath / change->first); - usedProcessors.insert(processor); - change = changes.erase(change); - } - else { - change++; - } + AdHocFormatter(UpdatingFileContent, "Updating file content"); + AdHocFormatter(UpdatedFileContent, "Updated file content"); + void + Maintenance::applyFileChanges(DB::Connection * dbc, const std::filesystem::path & repoRoot, const Repository & repo, + ChangeSet & changes) const + { + auto log = LOGMANAGER()->getLogger(__FUNCTION__); + log->messagectf<UpdatingFileContent>(IceTray::Logging::LogLevel::DEBUG); + // Map of phase, to order, to processor + std::map<unsigned char, std::multimap<unsigned char, FileProcessorPtr>> fps; + for (const auto & fpf : AdHoc::PluginManager::getDefault()->getAll<FileProcessorFactory>()) { + FileProcessorPtr processor(fpf->implementation()->create()); + fps[processor->phase()].insert({processor->order(), processor})->second->prepare(dbc); + } + // Processor -> repoId, PathParts, Path + using FileHandleFunc = std::function<void( + FileProcessorPtr, int64_t, const Gentoo::StringList &, const std::filesystem::path &)>; + std::map<git_delta_t, FileHandleFunc> funcs; + funcs[GIT_DELTA_DELETED] = [dbc](auto && fp, auto && repo, auto && pathParts, auto &&) { + fp->deleted(dbc, std::forward<decltype(repo)>(repo), std::forward<decltype(pathParts)>(pathParts)); + }; + funcs[GIT_DELTA_MODIFIED] = [dbc](auto && fp, auto && repo, auto && pathParts, auto && path) { + fp->modified(dbc, std::forward<decltype(repo)>(repo), std::forward<decltype(pathParts)>(pathParts), + std::forward<decltype(path)>(path)); + }; + funcs[GIT_DELTA_ADDED] = [dbc](auto && fp, auto && repo, auto && pathParts, auto && path) { + fp->created(dbc, std::forward<decltype(repo)>(repo), std::forward<decltype(pathParts)>(pathParts), + std::forward<decltype(path)>(path)); + }; + + const auto repoPath = repoRoot / std::filesystem::path(repo.path).lexically_relative("/"); + // Phases + for (const auto & phase : fps) { + std::set<FileProcessorPtr> usedProcessors; + // Processors + for (const auto & processorOrder : phase.second) { + auto processor = processorOrder.second; + // Changes + for (auto change = changes.begin(); change != changes.end();) { + if (processor->match(change->second.pathParts)) { + funcs[change->second.changeType]( + processor, repo.repoid, change->second.pathParts, repoPath / change->first); + usedProcessors.insert(processor); + change = changes.erase(change); + } + else { + change++; } - } - for (const auto & processor : usedProcessors) { - processor->apply(dbc, changes); - } - for (const auto & processor : phase.second) { - processor.second->phaseEnd(dbc, changes); } } - for (const auto & phase : fps) { - for (const auto & processor : phase.second) { - processor.second->tidy(dbc); - } + for (const auto & processor : usedProcessors) { + processor->apply(dbc, changes); + } + for (const auto & processor : phase.second) { + processor.second->phaseEnd(dbc, changes); } - log->messagectf<UpdatedFileContent>(IceTray::Logging::LogLevel::DEBUG); } - + for (const auto & phase : fps) { + for (const auto & processor : phase.second) { + processor.second->tidy(dbc); + } + } + log->messagectf<UpdatedFileContent>(IceTray::Logging::LogLevel::DEBUG); } + } diff --git a/gentoobrowse-api/service/maintenanceimpl.h b/gentoobrowse-api/service/maintenanceimpl.h index bad2a76..7b04921 100644 --- a/gentoobrowse-api/service/maintenanceimpl.h +++ b/gentoobrowse-api/service/maintenanceimpl.h @@ -6,39 +6,38 @@ #include <Ice/Properties.h> #include <IceUtil/Timer.h> #include <abstractDatabaseClient.h> +#include <c++11Helpers.h> #include <converters.h> #include <maintenance.h> #include <map> #include <visibility.h> -namespace Gentoo { - namespace Service { - class DLL_PUBLIC Maintenance : public Gentoo::Maintenance, public IceTray::AbstractDatabaseClient { - public: - Maintenance(const DB::ConnectionPoolPtr & d, const Ice::CommunicatorPtr & ic, const Ice::PropertiesPtr & p); - virtual ~Maintenance(); - - void refreshPackageTree(const Ice::Current &) override; - void refreshBugs(const Ice::Current &) override; - void updateRepositories(const Ice::Current &) override; - Gentoo::UserNews getUserNews(const Ice::Current &) override; - void sendNotifications(const Ice::Current &) override; - - protected: - Maintenance(const DB::ConnectionPoolPtr & d); - void applyFileChanges( - DB::Connection *, const std::filesystem::path &, const Repository &, ChangeSet &) const; - - private: - template<typename Task> - void addTask(Ice::CommunicatorPtr ic, Ice::PropertiesPtr p, const std::string & whenCfg); - - static Ice::PropertiesPtr properties(const Ice::Current &); - - template<typename T> static FileProcessorPtr createFileProessor(); - IceUtil::TimerPtr taskRunner; - }; - } +namespace Gentoo::Service { + class DLL_PUBLIC Maintenance : public Gentoo::Maintenance, public IceTray::AbstractDatabaseClient { + public: + explicit Maintenance(DB::ConnectionPoolPtr d, const Ice::CommunicatorPtr & ic, const Ice::PropertiesPtr & p); + ~Maintenance() override; + SPECIAL_MEMBERS_DELETE(Maintenance); + + void refreshPackageTree(const Ice::Current &) override; + void refreshBugs(const Ice::Current &) override; + void updateRepositories(const Ice::Current &) override; + Gentoo::UserNews getUserNews(const Ice::Current &) override; + void sendNotifications(const Ice::Current &) override; + + protected: + explicit Maintenance(DB::ConnectionPoolPtr d); + void applyFileChanges(DB::Connection *, const std::filesystem::path &, const Repository &, ChangeSet &) const; + + private: + template<typename Task> + void addTask(const Ice::CommunicatorPtr & ic, const Ice::PropertiesPtr & p, const std::string & whenCfg); + + static Ice::PropertiesPtr properties(const Ice::Current &); + + template<typename T> static FileProcessorPtr createFileProessor(); + IceUtil::TimerPtr taskRunner; + }; } #endif diff --git a/gentoobrowse-api/service/mask.cpp b/gentoobrowse-api/service/mask.cpp index 6f4d1ac..6dabb41 100644 --- a/gentoobrowse-api/service/mask.cpp +++ b/gentoobrowse-api/service/mask.cpp @@ -1,44 +1,41 @@ #include <lexer-regex.h> #include <mask.h> -namespace Portage { - namespace Utils { - static AdHoc::Lexer::PatternPtr maskHead - = AdHoc::LexerMatchers::regex("^# ([^<\n]+)? ?(<(.+?@[^\n>]+)>?)? \\((\\d{4}-\\d{2}-\\d{1,2})\\)$\n", - static_cast<GRegexCompileFlags>( - G_REGEX_OPTIMIZE | G_REGEX_CASELESS | G_REGEX_UNGREEDY | G_REGEX_MULTILINE)); - static AdHoc::Lexer::PatternPtr maskDesc = AdHoc::LexerMatchers::regex("^# *([^\n]*)$\n", G_REGEX_MULTILINE); - static AdHoc::Lexer::PatternPtr atom = AdHoc::LexerMatchers::regex("^([^\n/]+/[^\n]*)$\n?", G_REGEX_MULTILINE); - static AdHoc::Lexer::PatternPtr end = AdHoc::LexerMatchers::regex("^\\s*$\n", G_REGEX_MULTILINE); - static AdHoc::Lexer::PatternPtr discard = AdHoc::LexerMatchers::regex("^([^\n]*)$\n?", G_REGEX_MULTILINE); +namespace Portage::Utils { + static AdHoc::Lexer::PatternPtr maskHead + = AdHoc::LexerMatchers::regex("^# ([^<\n]+)? ?(<(.+?@[^\n>]+)>?)? \\((\\d{4}-\\d{2}-\\d{1,2})\\)$\n", + static_cast<GRegexCompileFlags>( + G_REGEX_OPTIMIZE | G_REGEX_CASELESS | G_REGEX_UNGREEDY | G_REGEX_MULTILINE)); + static AdHoc::Lexer::PatternPtr maskDesc = AdHoc::LexerMatchers::regex("^# *([^\n]*)$\n", G_REGEX_MULTILINE); + static AdHoc::Lexer::PatternPtr atom = AdHoc::LexerMatchers::regex("^([^\n/]+/[^\n]*)$\n?", G_REGEX_MULTILINE); + static AdHoc::Lexer::PatternPtr end = AdHoc::LexerMatchers::regex("^\\s*$\n", G_REGEX_MULTILINE); + static AdHoc::Lexer::PatternPtr discard = AdHoc::LexerMatchers::regex("^([^\n]*)$\n?", G_REGEX_MULTILINE); - Masks::Masks() : - AdHoc::Lexer({{{AdHoc::Lexer::InitialState}, maskHead, - [&](auto e) { - person = e->pattern()->match(1); - email = e->pattern()->match(3); - date = *e->pattern()->match(4); - e->pushState("mask"); - }}, - {{"mask"}, maskDesc, - [&](auto e) { - message.push_back(*e->pattern()->match(1)); - }}, - {{"mask"}, atom, - [&](auto e) { - atoms.insert(*e->pattern()->match(1)); - }}, - {{"mask"}, end, - [&](auto e) { - ++n; - consume(); - atoms.clear(); - message.clear(); - e->popState(); - }}, - {{AdHoc::Lexer::InitialState}, discard, [&](auto) {}}}), - n(0) - { - } + Masks::Masks() : + AdHoc::Lexer({{{AdHoc::Lexer::InitialState}, maskHead, + [&](auto e) { + person = e->pattern()->match(1); + email = e->pattern()->match(3); + date = *e->pattern()->match(4); + e->pushState("mask"); + }}, + {{"mask"}, maskDesc, + [&](auto e) { + message.push_back(*e->pattern()->match(1)); + }}, + {{"mask"}, atom, + [&](auto e) { + atoms.insert(*e->pattern()->match(1)); + }}, + {{"mask"}, end, + [&](auto e) { + ++n; + consume(); + atoms.clear(); + message.clear(); + e->popState(); + }}, + {{AdHoc::Lexer::InitialState}, discard, [&](auto) {}}}) + { } } diff --git a/gentoobrowse-api/service/mask.h b/gentoobrowse-api/service/mask.h index abdf6b0..08f534b 100644 --- a/gentoobrowse-api/service/mask.h +++ b/gentoobrowse-api/service/mask.h @@ -1,27 +1,24 @@ -#ifndef GENTOOBROWSE_SERVICE_MASK_H -#define GENTOOBROWSE_SERVICE_MASK_H +#pragma once #include "wrap/ustring.h" +#include <c++11Helpers.h> #include <lexer.h> #include <list> #include <optional> -namespace Portage { - namespace Utils { - class Masks : public AdHoc::Lexer { - protected: - Masks(); - virtual ~Masks() = default; +namespace Portage::Utils { + class Masks : public AdHoc::Lexer { + protected: + Masks(); + virtual ~Masks() = default; + SPECIAL_MEMBERS_DEFAULT(Masks); - virtual void consume() const = 0; + virtual void consume() const = 0; - Glib::ustring date; - std::optional<Glib::ustring> person, email; - std::set<std::string> atoms; - std::list<std::string> message; - int n; - }; - } + Glib::ustring date; + std::optional<Glib::ustring> person, email; + std::set<std::string> atoms; + std::list<std::string> message; + int n {0}; + }; } - -#endif diff --git a/gentoobrowse-api/service/news.cpp b/gentoobrowse-api/service/news.cpp index 62e33ef..1690959 100644 --- a/gentoobrowse-api/service/news.cpp +++ b/gentoobrowse-api/service/news.cpp @@ -2,114 +2,112 @@ #include <boost/algorithm/string/split.hpp> #include <lexer-regex.h> -AdHoc::Lexer::PatternPtr Title(AdHoc::LexerMatchers::regex( - "^Title: (.+)$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr DisplayIfInstalled(AdHoc::LexerMatchers::regex( - "^Display-If-Installed: (.+)$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr Author(AdHoc::LexerMatchers::regex( - "^Author: (.+) <([^>]+)>$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr Posted(AdHoc::LexerMatchers::regex("^Posted: ([0-9]{4}-[0-9]{2}-[0-9]{2})$\\s", - static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr IgnoredHeader(AdHoc::LexerMatchers::regex( - "^[^ :]+: .+$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr BlankLine( - AdHoc::LexerMatchers::regex("^$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr BodyText(AdHoc::LexerMatchers::regex( - "^(.*)$\\s?", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -AdHoc::Lexer::PatternPtr Link(AdHoc::LexerMatchers::regex("^\\[[[:digit:]]+\\] ([[:alpha:]]+://.*)$\\s?", - static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); +namespace Portage::Utils { + AdHoc::Lexer::PatternPtr Title(AdHoc::LexerMatchers::regex( + "^Title: (.+)$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr DisplayIfInstalled(AdHoc::LexerMatchers::regex( + "^Display-If-Installed: (.+)$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr Author(AdHoc::LexerMatchers::regex( + "^Author: (.+) <([^>]+)>$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr Posted(AdHoc::LexerMatchers::regex("^Posted: ([0-9]{4}-[0-9]{2}-[0-9]{2})$\\s", + static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr IgnoredHeader(AdHoc::LexerMatchers::regex( + "^[^ :]+: .+$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr BlankLine(AdHoc::LexerMatchers::regex( + "^$\\s", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr BodyText(AdHoc::LexerMatchers::regex( + "^(.*)$\\s?", static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); + AdHoc::Lexer::PatternPtr Link(AdHoc::LexerMatchers::regex(R"(^\[[[:digit:]]+\] ([[:alpha:]]+://.*)$\s?)", + static_cast<GRegexCompileFlags>(G_REGEX_OPTIMIZE | G_REGEX_MULTILINE))); -const std::string Body("Body"); + const std::string Body("Body"); -namespace Portage { - namespace Utils { - template<typename T, typename Y> - Ice::optional<T> - iuo(const std::optional<Y> & x) - { - if (x) { - return Ice::optional<T>(*x); - } - return Ice::optional<T>(); + template<typename T, typename Y> + Ice::optional<T> + iuo(const std::optional<Y> & x) + { + if (x) { + return Ice::optional<T>(*x); } + return Ice::optional<T>(); + } - template<typename T, typename Y> - std::vector<T> - split(const std::optional<Y> & x) - { - std::vector<T> rtn; - if (x) { - boost::algorithm::split(rtn, *x, [](auto c) { - return c == ','; - }); - std::sort(rtn.begin(), rtn.end()); - } - return rtn; + template<typename T, typename Y> + std::vector<T> + split(const std::optional<Y> & x) + { + std::vector<T> rtn; + if (x) { + boost::algorithm::split(rtn, *x, [](auto c) { + return c == ','; + }); + std::sort(rtn.begin(), rtn.end()); } + return rtn; + } - News::News() : - AdHoc::Lexer({// title: words - {{InitialState}, Title, - [this](auto es) { - news->title = *es->pattern()->match(1); - }}, - // posted: date - {{InitialState}, Posted, - [this](auto es) { - news->posted = *es->pattern()->match(1); - }}, - // display-if-installed: atomspec - {{InitialState}, DisplayIfInstalled, - [this](auto es) { - news->atomspec.push_back(*es->pattern()->match(1)); - }}, - // author: name <email> - {{InitialState}, Author, - [this](auto es) { - news->authorname = es->pattern()->match(1)->raw(); - news->authoremail = es->pattern()->match(2)->raw(); - }}, - // other headers - {{InitialState}, IgnoredHeader, [](auto) {}}, - // blank - {{InitialState}, BlankLine, - [this](auto es) { - es->setState(Body); - news->body.push_back(std::string()); - }}, - // body blank - {{Body}, BlankLine, - [this](auto) { - news->body.push_back(std::string()); - }}, - // link - {{Body}, Link, - [this](auto es) { - news->urls.push_back(*es->pattern()->match(1)); - }}, - // body text - {{Body}, BodyText, - [this](auto es) { - if (!news->body.back().empty()) { - news->body.back().append(" "); - } - news->body.back().append(*es->pattern()->match(1)); - }}}), - news(std::make_shared<Gentoo::NewsItem>()) - { - } + News::News() : + AdHoc::Lexer({// title: words + {{InitialState}, Title, + [this](auto es) { + news->title = *es->pattern()->match(1); + }}, + // posted: date + {{InitialState}, Posted, + [this](auto es) { + news->posted = *es->pattern()->match(1); + }}, + // display-if-installed: atomspec + {{InitialState}, DisplayIfInstalled, + [this](auto es) { + news->atomspec.push_back(*es->pattern()->match(1)); + }}, + // author: name <email> + {{InitialState}, Author, + [this](auto es) { + news->authorname = es->pattern()->match(1)->raw(); + news->authoremail = es->pattern()->match(2)->raw(); + }}, + // other headers + {{InitialState}, IgnoredHeader, [](auto) {}}, + // blank + {{InitialState}, BlankLine, + [this](auto es) { + es->setState(Body); + news->body.push_back(std::string()); + }}, + // body blank + {{Body}, BlankLine, + [this](auto) { + news->body.push_back(std::string()); + }}, + // link + {{Body}, Link, + [this](auto es) { + news->urls.push_back(*es->pattern()->match(1)); + }}, + // body text + {{Body}, BodyText, + [this](auto es) { + if (!news->body.back().empty()) { + news->body.back().append(" "); + } + news->body.back().append(*es->pattern()->match(1)); + }}}), + news(std::make_shared<Gentoo::NewsItem>()) + { + } - Gentoo::NewsItemPtr - News::parse(const std::basic_string_view<gchar> & str) - { - News d; - d.extract(str.data(), str.length()); - d.news->body.erase(std::remove_if(d.news->body.begin(), d.news->body.end(), - [](const auto & s) { - return s.empty(); - }), - d.news->body.end()); - return d.news; - } + Gentoo::NewsItemPtr + News::parse(const std::basic_string_view<gchar> & str) + { + News d; + d.extract(str.data(), str.length()); + d.news->body.erase(std::remove_if(d.news->body.begin(), d.news->body.end(), + [](const auto & s) { + return s.empty(); + }), + d.news->body.end()); + return d.news; } } diff --git a/gentoobrowse-api/service/news.h b/gentoobrowse-api/service/news.h index 23e3d12..d13263c 100644 --- a/gentoobrowse-api/service/news.h +++ b/gentoobrowse-api/service/news.h @@ -1,22 +1,17 @@ -#ifndef GENTOOBROWSE_SERVICE_NEWS_H -#define GENTOOBROWSE_SERVICE_NEWS_H +#pragma once #include <istream> #include <lexer.h> #include <portage-models.h> #include <vector> -namespace Portage { - namespace Utils { - class News : AdHoc::Lexer { - private: - News(); +namespace Portage::Utils { + class News : AdHoc::Lexer { + private: + News(); - public: - Gentoo::NewsItemPtr news; - static Gentoo::NewsItemPtr parse(const std::basic_string_view<gchar> &); - }; - } + public: + Gentoo::NewsItemPtr news; + static Gentoo::NewsItemPtr parse(const std::basic_string_view<gchar> &); + }; } - -#endif diff --git a/gentoobrowse-api/service/notificationsimpl.cpp b/gentoobrowse-api/service/notificationsimpl.cpp index 76a0bfd..71b2a78 100644 --- a/gentoobrowse-api/service/notificationsimpl.cpp +++ b/gentoobrowse-api/service/notificationsimpl.cpp @@ -1,64 +1,62 @@ #include "notificationsimpl.h" #include "xsltStreamSerializer.h" +#include <cstring> #include <libxml/parser.h> #include <notifications/xslt/base.h> #include <notifications/xslt/news.h> #include <notifications/xslt/signup.h> #include <slicer/slicer.h> -#include <string.h> #define BADCAST(str) reinterpret_cast<const unsigned char *>(str) -namespace Gentoo { - namespace Service { - xmlDocPtr - xsltDocLoaderFunc(const xmlChar * URI, xmlDictPtr, int, void *, xsltLoadType) - { +namespace Gentoo::Service { + xmlDocPtr + xsltDocLoaderFunc(const xmlChar * URI, xmlDictPtr, int, void *, xsltLoadType) + { #define MATCH(name) \ if (xmlStrcmp(URI, BADCAST(#name ".xslt")) == 0) { \ return xmlParseMemory(reinterpret_cast<const char *>(name##_xslt), static_cast<int>(name##_xslt_len)); \ } - MATCH(base) - MATCH(news) - MATCH(signup) - return NULL; + MATCH(base) + MATCH(news) + MATCH(signup) + return nullptr; #undef MATCH - } + } - Notifications::Notifications() - { - xsltSetLoaderFunc(&xsltDocLoaderFunc); - news = xsltSSPtr(xsltParseStylesheetFile(BADCAST("news.xslt")), xsltFreeStylesheet); - signup = xsltSSPtr(xsltParseStylesheetFile(BADCAST("signup.xslt")), xsltFreeStylesheet); - xsltSetLoaderFunc(NULL); - } + Notifications::Notifications() + { + xsltSetLoaderFunc(&xsltDocLoaderFunc); + news = xsltSSPtr(xsltParseStylesheetFile(BADCAST("news.xslt")), xsltFreeStylesheet); + signup = xsltSSPtr(xsltParseStylesheetFile(BADCAST("signup.xslt")), xsltFreeStylesheet); + xsltSetLoaderFunc(nullptr); + } - IceTray::Mail::EmailPtr - Notifications::getSignup(const Gentoo::NewUserPtr & u) - { - auto e = basicMail("Welcome", u); - Slicer::SerializeAny<XsltStreamSerializer>(u, e, signup.get()); - return e; - } + IceTray::Mail::EmailPtr + Notifications::getSignup(const Gentoo::NewUserPtr & u) + { + auto e = basicMail("Welcome", u); + Slicer::SerializeAny<XsltStreamSerializer>(u, e, signup.get()); + return e; + } - IceTray::Mail::EmailPtr - Notifications::getNews(const Gentoo::UserPtr & u, const Gentoo::NewsContent & c) - { - auto e = basicMail("Latest updates", u); - Slicer::SerializeAny<XsltStreamSerializer>(c, e, news.get()); - return e; - } + IceTray::Mail::EmailPtr + Notifications::getNews(const Gentoo::UserPtr & u, const Gentoo::NewsContent & c) + { + auto e = basicMail("Latest updates", u); + Slicer::SerializeAny<XsltStreamSerializer>(c, e, news.get()); + return e; + } - IceTray::Mail::EmailPtr - Notifications::basicMail(const std::string & subject, const Gentoo::UserPtr & u) - { - auto e = std::make_shared<IceTray::Mail::Email>(); - e->subject = "Gentoo Browse: " + subject; - e->from.name = "Gentoo Browse"; - e->from.address = "noreply@gentoobrowse.randomdan.homeip.net"; - e->to.name = u->userrealname; - e->to.address = u->useremail; - return e; - } + IceTray::Mail::EmailPtr + Notifications::basicMail(const std::string & subject, const Gentoo::UserPtr & u) + { + auto e = std::make_shared<IceTray::Mail::Email>(); + e->subject = "Gentoo Browse: " + subject; + e->from.name = "Gentoo Browse"; + e->from.address = "noreply@gentoobrowse.randomdan.homeip.net"; + e->to.name = u->userrealname; + e->to.address = u->useremail; + return e; } } diff --git a/gentoobrowse-api/service/notificationsimpl.h b/gentoobrowse-api/service/notificationsimpl.h index 4ce0f26..afad26e 100644 --- a/gentoobrowse-api/service/notificationsimpl.h +++ b/gentoobrowse-api/service/notificationsimpl.h @@ -6,23 +6,21 @@ #include <notifications.h> #include <visibility.h> -namespace Gentoo { - namespace Service { - class DLL_PUBLIC Notifications : public Gentoo::Notifications { - public: - Notifications(); +namespace Gentoo::Service { + class DLL_PUBLIC Notifications : public Gentoo::Notifications { + public: + Notifications(); - IceTray::Mail::EmailPtr getSignup(const Gentoo::NewUserPtr &) override; - IceTray::Mail::EmailPtr getNews(const Gentoo::UserPtr &, const Gentoo::NewsContent &) override; + IceTray::Mail::EmailPtr getSignup(const Gentoo::NewUserPtr &) override; + IceTray::Mail::EmailPtr getNews(const Gentoo::UserPtr &, const Gentoo::NewsContent &) override; - private: - IceTray::Mail::EmailPtr basicMail(const std::string &, const Gentoo::UserPtr & u); + private: + IceTray::Mail::EmailPtr basicMail(const std::string &, const Gentoo::UserPtr & u); - typedef std::shared_ptr<xsltStylesheet> xsltSSPtr; - xsltSSPtr news; - xsltSSPtr signup; - }; - } + using xsltSSPtr = std::shared_ptr<xsltStylesheet>; + xsltSSPtr news; + xsltSSPtr signup; + }; } #endif diff --git a/gentoobrowse-api/service/portageimpl.cpp b/gentoobrowse-api/service/portageimpl.cpp index 5bceb6b..452de86 100644 --- a/gentoobrowse-api/service/portageimpl.cpp +++ b/gentoobrowse-api/service/portageimpl.cpp @@ -42,266 +42,264 @@ #include <sql/portage/getUserTrackedRecentVersions.sql.h> #include <sql/portage/getUsesSearch.sql.h> -namespace Gentoo { - namespace Service { - Portage::Portage(const DB::ConnectionPoolPtr & d) : IceTray::AbstractCachingDatabaseClient(d) { } - - Gentoo::CategoryPtr - Portage::getCategory(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::CategoryPtr>(sql::portage::getCategory, 30, id); - } +namespace Gentoo::Service { + Portage::Portage(const DB::ConnectionPoolPtr & d) : IceTray::AbstractCachingDatabaseClient(d) { } - Gentoo::CategoryPtr - Portage::findCategory(const std::string_view name, const Ice::Current &) - { - return fetchCache<Gentoo::CategoryPtr>(sql::portage::findCategory, 30, name); - } + Gentoo::CategoryPtr + Portage::getCategory(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::CategoryPtr>(sql::portage::getCategory, 30, id); + } - Gentoo::Categories - Portage::getAllCategories(const Ice::Current &) - { - return fetchCache<Gentoo::Categories>(sql::portage::getAllCategories, 30); - } + Gentoo::CategoryPtr + Portage::findCategory(const std::string_view name, const Ice::Current &) + { + return fetchCache<Gentoo::CategoryPtr>(sql::portage::findCategory, 30, name); + } - Gentoo::Categories - Portage::getCategoriesInSuper(const std::string_view super, const Ice::Current &) - { - return fetchCache<Gentoo::Categories>(sql::portage::getCategoriesInSuper, 30, super); - } + Gentoo::Categories + Portage::getAllCategories(const Ice::Current &) + { + return fetchCache<Gentoo::Categories>(sql::portage::getAllCategories, 30); + } - Gentoo::OverviewCategoriesBySuper - Portage::getAllOverviewCategories(const Ice::Current &) - { - Gentoo::OverviewCategoriesBySuper rtn; - auto cats = fetchCache<Gentoo::OverviewCategories>(sql::portage::getAllOverviewCategories, 30); - for (const auto & c : cats) { - auto hyphen = c->name.find('-'); - rtn[c->name.substr(0, hyphen)].push_back(c); - } - return rtn; - } + Gentoo::Categories + Portage::getCategoriesInSuper(const std::string_view super, const Ice::Current &) + { + return fetchCache<Gentoo::Categories>(sql::portage::getCategoriesInSuper, 30, super); + } - Gentoo::OverviewCategories - Portage::getOverviewCategoriesInSuper(const std::string_view super, const Ice::Current &) - { - return fetchCache<Gentoo::OverviewCategories>(sql::portage::getOverviewCategoriesInSuper, 30, super); + Gentoo::OverviewCategoriesBySuper + Portage::getAllOverviewCategories(const Ice::Current &) + { + Gentoo::OverviewCategoriesBySuper rtn; + auto cats = fetchCache<Gentoo::OverviewCategories>(sql::portage::getAllOverviewCategories, 30); + for (const auto & c : cats) { + auto hyphen = c->name.find('-'); + rtn[c->name.substr(0, hyphen)].push_back(c); } + return rtn; + } - Gentoo::PackagePtr - Portage::getPackage(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::PackagePtr>(sql::portage::getPackage, 30, id); - } + Gentoo::OverviewCategories + Portage::getOverviewCategoriesInSuper(const std::string_view super, const Ice::Current &) + { + return fetchCache<Gentoo::OverviewCategories>(sql::portage::getOverviewCategoriesInSuper, 30, super); + } - Gentoo::PackagePtr - Portage::findPackage(const std::string_view cat, const std::string_view pkg, const Ice::Current &) - { - return fetchCache<Gentoo::PackagePtr>(sql::portage::findPackage, 30, cat, pkg); - } + Gentoo::PackagePtr + Portage::getPackage(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::PackagePtr>(sql::portage::getPackage, 30, id); + } - Gentoo::Packages - Portage::getAllPackages(const Ice::Current &) - { - return fetchCache<Gentoo::Packages>(sql::portage::getAllPackages, 30); - } + Gentoo::PackagePtr + Portage::findPackage(const std::string_view cat, const std::string_view pkg, const Ice::Current &) + { + return fetchCache<Gentoo::PackagePtr>(sql::portage::findPackage, 30, cat, pkg); + } - Gentoo::Packages - Portage::getPackagesInCategory(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::Packages>(sql::portage::getPackagesInCategory, 30, id); - } + Gentoo::Packages + Portage::getAllPackages(const Ice::Current &) + { + return fetchCache<Gentoo::Packages>(sql::portage::getAllPackages, 30); + } - Gentoo::SearchResultPackages - Portage::getPackagesSearch(const std::string_view query, const Ice::Current &) - { - return fetchCache<Gentoo::SearchResultPackages>(sql::portage::getPackagesSearch, 30, query, query); - } + Gentoo::Packages + Portage::getPackagesInCategory(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::Packages>(sql::portage::getPackagesInCategory, 30, id); + } - Gentoo::Ebuilds - Portage::getPackageVersions(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::Ebuilds>(sql::portage::getPackageVersions, 30, id); - } + Gentoo::SearchResultPackages + Portage::getPackagesSearch(const std::string_view query, const Ice::Current &) + { + return fetchCache<Gentoo::SearchResultPackages>(sql::portage::getPackagesSearch, 30, query, query); + } - Gentoo::EbuildDetails - Portage::getPackageVersionDetails(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::EbuildDetails>(sql::portage::getPackageVersionDetails, 30, id); - } + Gentoo::Ebuilds + Portage::getPackageVersions(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::Ebuilds>(sql::portage::getPackageVersions, 30, id); + } - Gentoo::ChangeLog - Portage::getPackageChangeLog(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::ChangeLog>(sql::portage::getPackageChangeLog, 30, id); - } + Gentoo::EbuildDetails + Portage::getPackageVersionDetails(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::EbuildDetails>(sql::portage::getPackageVersionDetails, 30, id); + } - Gentoo::Ebuilds - Portage::getRecentAdditions(Ice::Int syncDays, const Ice::Current &) - { - return fetchCache<Gentoo::Ebuilds>(sql::portage::getRecentAdditions, 30, syncDays); - } + Gentoo::ChangeLog + Portage::getPackageChangeLog(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::ChangeLog>(sql::portage::getPackageChangeLog, 30, id); + } - Gentoo::Packages - Portage::getPackagesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) - { - return fetchCache<Gentoo::Packages>(sql::portage::getPackagesWithRecentAdditions, 30, syncDays); - } + Gentoo::Ebuilds + Portage::getRecentAdditions(Ice::Int syncDays, const Ice::Current &) + { + return fetchCache<Gentoo::Ebuilds>(sql::portage::getRecentAdditions, 30, syncDays); + } - Gentoo::Packages - Portage::getTopTrackedPackages(Ice::Int n, const Ice::Current &) - { - return fetchCache<Gentoo::Packages>(sql::portage::getTopTrackedPackages, 30, n); - } + Gentoo::Packages + Portage::getPackagesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) + { + return fetchCache<Gentoo::Packages>(sql::portage::getPackagesWithRecentAdditions, 30, syncDays); + } - Gentoo::Packages - Portage::getUserTrackedPackages(Ice::Int userid, const Ice::Current &) - { - return fetchCache<Gentoo::Packages>(sql::portage::getUserTrackedPackages, 30, userid); - } + Gentoo::Packages + Portage::getTopTrackedPackages(Ice::Int n, const Ice::Current &) + { + return fetchCache<Gentoo::Packages>(sql::portage::getTopTrackedPackages, 30, n); + } - Gentoo::Ebuilds - Portage::getUserTrackedRecentVersions(Ice::Int userid, Ice::Int limit, const Ice::Current &) - { - return fetchCache<Gentoo::Ebuilds>(sql::portage::getUserTrackedRecentVersions, 30, userid, limit); - } + Gentoo::Packages + Portage::getUserTrackedPackages(Ice::Int userid, const Ice::Current &) + { + return fetchCache<Gentoo::Packages>(sql::portage::getUserTrackedPackages, 30, userid); + } - Gentoo::StringList - Portage::getPackageUrls(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::StringList>(sql::portage::getPackageUrls, 30, id); - } + Gentoo::Ebuilds + Portage::getUserTrackedRecentVersions(Ice::Int userid, Ice::Int limit, const Ice::Current &) + { + return fetchCache<Gentoo::Ebuilds>(sql::portage::getUserTrackedRecentVersions, 30, userid, limit); + } - Gentoo::Ebuilds - Portage::getEbuildsByFilter(const std::string_view filter, const Ice::Current &) - { - return fetchCache<Gentoo::Ebuilds>(sql::portage::getEbuildsByFilter, 30, filter); - } + Gentoo::StringList + Portage::getPackageUrls(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::StringList>(sql::portage::getPackageUrls, 30, id); + } - Gentoo::Categories - Portage::getCategoriesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) - { - return fetchCache<Gentoo::Categories>(sql::portage::getCategoriesWithRecentAdditions, 30, syncDays); - } + Gentoo::Ebuilds + Portage::getEbuildsByFilter(const std::string_view filter, const Ice::Current &) + { + return fetchCache<Gentoo::Ebuilds>(sql::portage::getEbuildsByFilter, 30, filter); + } - Gentoo::PackageDependencyPackages - Portage::getPackageDependencies(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::PackageDependencyPackages>(sql::portage::getPackageDependencies, 30, id); - } + Gentoo::Categories + Portage::getCategoriesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) + { + return fetchCache<Gentoo::Categories>(sql::portage::getCategoriesWithRecentAdditions, 30, syncDays); + } - Gentoo::PackageDependencyPackages - Portage::getPackageRuntimeDependencies(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::PackageDependencyPackages>(sql::portage::getPackageRuntimeDependencies, 30, id); - } + Gentoo::PackageDependencyPackages + Portage::getPackageDependencies(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::PackageDependencyPackages>(sql::portage::getPackageDependencies, 30, id); + } - Gentoo::PackageDependencyPackages - Portage::getPackagesDepending(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::PackageDependencyPackages>(sql::portage::getPackagesDepending, 30, id); - } + Gentoo::PackageDependencyPackages + Portage::getPackageRuntimeDependencies(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::PackageDependencyPackages>(sql::portage::getPackageRuntimeDependencies, 30, id); + } - Gentoo::PackageMasks - Portage::getPackageMasks(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::PackageMasks>(sql::portage::getPackageMasks, 30, id); - } + Gentoo::PackageDependencyPackages + Portage::getPackagesDepending(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::PackageDependencyPackages>(sql::portage::getPackagesDepending, 30, id); + } - Gentoo::Uses - Portage::getPackageUses(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::Uses>(sql::portage::getPackageUses, 30, id); - } + Gentoo::PackageMasks + Portage::getPackageMasks(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::PackageMasks>(sql::portage::getPackageMasks, 30, id); + } - Gentoo::UsePtr - Portage::getUse(const std::string_view use, const Ice::Current &) - { - return fetchCache<Gentoo::UsePtr>(sql::portage::getUse, 30, use, use); - } + Gentoo::Uses + Portage::getPackageUses(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::Uses>(sql::portage::getPackageUses, 30, id); + } - Gentoo::Uses - Portage::getGlobalUses(const Ice::Current &) - { - return fetchCache<Gentoo::Uses>(sql::portage::getGlobalUses, 30); - } + Gentoo::UsePtr + Portage::getUse(const std::string_view use, const Ice::Current &) + { + return fetchCache<Gentoo::UsePtr>(sql::portage::getUse, 30, use, use); + } - Gentoo::Uses - Portage::getGroupUses(const std::string_view group, const Ice::Current &) - { - return fetchCache<Gentoo::Uses>(sql::portage::getGroupUses, 30, group); - } + Gentoo::Uses + Portage::getGlobalUses(const Ice::Current &) + { + return fetchCache<Gentoo::Uses>(sql::portage::getGlobalUses, 30); + } - Gentoo::StringList - Portage::getUseGroups(const Ice::Current &) - { - return fetchCache<Gentoo::StringList>(sql::portage::getUseGroups, 30); - } + Gentoo::Uses + Portage::getGroupUses(const std::string_view group, const Ice::Current &) + { + return fetchCache<Gentoo::Uses>(sql::portage::getGroupUses, 30, group); + } - Gentoo::Uses - Portage::getUseUsage(const std::string_view use, const Ice::Current &) - { - return fetchCache<Gentoo::Uses>(sql::portage::getUseUsage, 30, use, use, use, use); - } + Gentoo::StringList + Portage::getUseGroups(const Ice::Current &) + { + return fetchCache<Gentoo::StringList>(sql::portage::getUseGroups, 30); + } - Gentoo::Packages - Portage::getUsePackages(const std::string_view use, const Ice::Current &) - { - return fetchCache<Gentoo::Packages>(sql::portage::getUsePackages, 30, use, use); - } + Gentoo::Uses + Portage::getUseUsage(const std::string_view use, const Ice::Current &) + { + return fetchCache<Gentoo::Uses>(sql::portage::getUseUsage, 30, use, use, use, use); + } - Gentoo::Uses - Portage::getUsesSearch(const std::string_view query, const Ice::Current &) - { - return fetchCache<Gentoo::Uses>(sql::portage::getUsesSearch, 30, query); - } + Gentoo::Packages + Portage::getUsePackages(const std::string_view use, const Ice::Current &) + { + return fetchCache<Gentoo::Packages>(sql::portage::getUsePackages, 30, use, use); + } - Gentoo::BugPtr - Portage::getBug(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::BugPtr>(sql::portage::getBug, 30, id); - } + Gentoo::Uses + Portage::getUsesSearch(const std::string_view query, const Ice::Current &) + { + return fetchCache<Gentoo::Uses>(sql::portage::getUsesSearch, 30, query); + } - Gentoo::Bugs - Portage::getPackageBugs(Ice::Int packageId, const Ice::Current &) - { - return fetchCache<Gentoo::Bugs>(sql::portage::getPackageBugs, 30, packageId); - } + Gentoo::BugPtr + Portage::getBug(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::BugPtr>(sql::portage::getBug, 30, id); + } - Gentoo::SearchResultBugs - Portage::getBugsSearch(const std::string_view query, const Ice::Current &) - { - return fetchCache<Gentoo::SearchResultBugs>(sql::portage::getBugsSearch, 30, query, query); - } + Gentoo::Bugs + Portage::getPackageBugs(Ice::Int packageId, const Ice::Current &) + { + return fetchCache<Gentoo::Bugs>(sql::portage::getPackageBugs, 30, packageId); + } - Gentoo::NewsItemPtr - Portage::getNewsItem(const std::string_view id, const Ice::Current &) - { - return fetchCache<Gentoo::NewsItemPtr>(sql::portage::getNewsItem, 30, id); - } + Gentoo::SearchResultBugs + Portage::getBugsSearch(const std::string_view query, const Ice::Current &) + { + return fetchCache<Gentoo::SearchResultBugs>(sql::portage::getBugsSearch, 30, query, query); + } - Gentoo::News - Portage::getNewsSearch(const std::string_view query, const Ice::Current &) - { - return fetchCache<Gentoo::News>(sql::portage::getNewsSearch, 30, query); - } + Gentoo::NewsItemPtr + Portage::getNewsItem(const std::string_view id, const Ice::Current &) + { + return fetchCache<Gentoo::NewsItemPtr>(sql::portage::getNewsItem, 30, id); + } - Gentoo::News - Portage::getNewsRecent(Ice::Int items, const Ice::Current &) - { - return fetchCache<Gentoo::News>(sql::portage::getNewsRecent, 30, items); - } + Gentoo::News + Portage::getNewsSearch(const std::string_view query, const Ice::Current &) + { + return fetchCache<Gentoo::News>(sql::portage::getNewsSearch, 30, query); + } - Gentoo::Repository - Portage::getRepository(Ice::Int id, const Ice::Current &) - { - return fetchCache<Gentoo::Repository>(sql::portage::getRepository, 30, id); - } + Gentoo::News + Portage::getNewsRecent(Ice::Int items, const Ice::Current &) + { + return fetchCache<Gentoo::News>(sql::portage::getNewsRecent, 30, items); + } - Gentoo::Repositories - Portage::getRepositories(const Ice::Current &) - { - return fetchCache<Gentoo::Repositories>(sql::portage::getRepositories, 30); - } + Gentoo::Repository + Portage::getRepository(Ice::Int id, const Ice::Current &) + { + return fetchCache<Gentoo::Repository>(sql::portage::getRepository, 30, id); + } + + Gentoo::Repositories + Portage::getRepositories(const Ice::Current &) + { + return fetchCache<Gentoo::Repositories>(sql::portage::getRepositories, 30); } } diff --git a/gentoobrowse-api/service/portageimpl.h b/gentoobrowse-api/service/portageimpl.h index 77d2e61..b4b2dfe 100644 --- a/gentoobrowse-api/service/portageimpl.h +++ b/gentoobrowse-api/service/portageimpl.h @@ -5,64 +5,59 @@ #include <portage.h> #include <visibility.h> -namespace Gentoo { - namespace Service { - class DLL_PUBLIC Portage : public Gentoo::Portage, IceTray::AbstractCachingDatabaseClient { - public: - Portage(const DB::ConnectionPoolPtr & d); - - Gentoo::CategoryPtr getCategory(Ice::Int id, const Ice::Current &) override; - Gentoo::CategoryPtr findCategory(const std::string_view name, const Ice::Current &) override; - Gentoo::Categories getAllCategories(const Ice::Current &) override; - Gentoo::Categories getCategoriesInSuper(const std::string_view, const Ice::Current &) override; - Gentoo::OverviewCategoriesBySuper getAllOverviewCategories(const Ice::Current &) override; - Gentoo::OverviewCategories getOverviewCategoriesInSuper( - const std::string_view, const Ice::Current &) override; - - Gentoo::PackagePtr getPackage(Ice::Int id, const Ice::Current &) override; - Gentoo::PackagePtr findPackage( - const std::string_view, const std::string_view, const Ice::Current &) override; - Gentoo::Packages getPackagesInCategory(Ice::Int id, const Ice::Current &) override; - Gentoo::Packages getAllPackages(const Ice::Current &) override; - Gentoo::SearchResultPackages getPackagesSearch(const std::string_view query, const Ice::Current &) override; - Gentoo::Ebuilds getPackageVersions(Ice::Int id, const Ice::Current &) override; - Gentoo::EbuildDetails getPackageVersionDetails(Ice::Int id, const Ice::Current &) override; - Gentoo::ChangeLog getPackageChangeLog(Ice::Int id, const Ice::Current &) override; - Gentoo::Ebuilds getRecentAdditions(Ice::Int syncDays, const Ice::Current &) override; - Gentoo::Packages getPackagesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) override; - Gentoo::Categories getCategoriesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) override; - Gentoo::Packages getTopTrackedPackages(Ice::Int n, const Ice::Current &) override; - Gentoo::PackageDependencyPackages getPackageDependencies(Ice::Int id, const Ice::Current &) override; - Gentoo::PackageDependencyPackages getPackageRuntimeDependencies(Ice::Int id, const Ice::Current &) override; - Gentoo::PackageDependencyPackages getPackagesDepending(Ice::Int id, const Ice::Current &) override; - Gentoo::PackageMasks getPackageMasks(Ice::Int id, const Ice::Current &) override; - Gentoo::Uses getPackageUses(Ice::Int id, const Ice::Current &) override; - Gentoo::Packages getUserTrackedPackages(Ice::Int userid, const Ice::Current &) override; - Gentoo::Ebuilds getUserTrackedRecentVersions( - Ice::Int userid, Ice::Int limit, const Ice::Current &) override; - Gentoo::StringList getPackageUrls(Ice::Int id, const Ice::Current &) override; - Gentoo::Ebuilds getEbuildsByFilter(const std::string_view, const Ice::Current &) override; - - Gentoo::UsePtr getUse(const std::string_view, const Ice::Current &) override; - Gentoo::Uses getGlobalUses(const Ice::Current &) override; - Gentoo::Uses getGroupUses(const std::string_view, const Ice::Current &) override; - Gentoo::StringList getUseGroups(const Ice::Current &) override; - Gentoo::Uses getUseUsage(const std::string_view, const Ice::Current &) override; - Gentoo::Packages getUsePackages(const std::string_view, const Ice::Current &) override; - Gentoo::Uses getUsesSearch(const std::string_view, const Ice::Current &) override; - - Gentoo::BugPtr getBug(Ice::Int id, const Ice::Current &) override; - Gentoo::Bugs getPackageBugs(Ice::Int packageId, const Ice::Current &) override; - Gentoo::SearchResultBugs getBugsSearch(const std::string_view query, const Ice::Current &) override; - - Gentoo::NewsItemPtr getNewsItem(const std::string_view, const Ice::Current &) override; - Gentoo::News getNewsSearch(const std::string_view, const Ice::Current &) override; - Gentoo::News getNewsRecent(Ice::Int, const Ice::Current &) override; - - Gentoo::Repository getRepository(Ice::Int, const Ice::Current &) override; - Gentoo::Repositories getRepositories(const Ice::Current &) override; - }; - } +namespace Gentoo::Service { + class DLL_PUBLIC Portage : public Gentoo::Portage, IceTray::AbstractCachingDatabaseClient { + public: + explicit Portage(const DB::ConnectionPoolPtr & d); + + Gentoo::CategoryPtr getCategory(Ice::Int id, const Ice::Current &) override; + Gentoo::CategoryPtr findCategory(const std::string_view name, const Ice::Current &) override; + Gentoo::Categories getAllCategories(const Ice::Current &) override; + Gentoo::Categories getCategoriesInSuper(const std::string_view, const Ice::Current &) override; + Gentoo::OverviewCategoriesBySuper getAllOverviewCategories(const Ice::Current &) override; + Gentoo::OverviewCategories getOverviewCategoriesInSuper(const std::string_view, const Ice::Current &) override; + + Gentoo::PackagePtr getPackage(Ice::Int id, const Ice::Current &) override; + Gentoo::PackagePtr findPackage(const std::string_view, const std::string_view, const Ice::Current &) override; + Gentoo::Packages getPackagesInCategory(Ice::Int id, const Ice::Current &) override; + Gentoo::Packages getAllPackages(const Ice::Current &) override; + Gentoo::SearchResultPackages getPackagesSearch(const std::string_view query, const Ice::Current &) override; + Gentoo::Ebuilds getPackageVersions(Ice::Int id, const Ice::Current &) override; + Gentoo::EbuildDetails getPackageVersionDetails(Ice::Int id, const Ice::Current &) override; + Gentoo::ChangeLog getPackageChangeLog(Ice::Int id, const Ice::Current &) override; + Gentoo::Ebuilds getRecentAdditions(Ice::Int syncDays, const Ice::Current &) override; + Gentoo::Packages getPackagesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) override; + Gentoo::Categories getCategoriesWithRecentAdditions(Ice::Int syncDays, const Ice::Current &) override; + Gentoo::Packages getTopTrackedPackages(Ice::Int n, const Ice::Current &) override; + Gentoo::PackageDependencyPackages getPackageDependencies(Ice::Int id, const Ice::Current &) override; + Gentoo::PackageDependencyPackages getPackageRuntimeDependencies(Ice::Int id, const Ice::Current &) override; + Gentoo::PackageDependencyPackages getPackagesDepending(Ice::Int id, const Ice::Current &) override; + Gentoo::PackageMasks getPackageMasks(Ice::Int id, const Ice::Current &) override; + Gentoo::Uses getPackageUses(Ice::Int id, const Ice::Current &) override; + Gentoo::Packages getUserTrackedPackages(Ice::Int userid, const Ice::Current &) override; + Gentoo::Ebuilds getUserTrackedRecentVersions(Ice::Int userid, Ice::Int limit, const Ice::Current &) override; + Gentoo::StringList getPackageUrls(Ice::Int id, const Ice::Current &) override; + Gentoo::Ebuilds getEbuildsByFilter(const std::string_view, const Ice::Current &) override; + + Gentoo::UsePtr getUse(const std::string_view, const Ice::Current &) override; + Gentoo::Uses getGlobalUses(const Ice::Current &) override; + Gentoo::Uses getGroupUses(const std::string_view, const Ice::Current &) override; + Gentoo::StringList getUseGroups(const Ice::Current &) override; + Gentoo::Uses getUseUsage(const std::string_view, const Ice::Current &) override; + Gentoo::Packages getUsePackages(const std::string_view, const Ice::Current &) override; + Gentoo::Uses getUsesSearch(const std::string_view, const Ice::Current &) override; + + Gentoo::BugPtr getBug(Ice::Int id, const Ice::Current &) override; + Gentoo::Bugs getPackageBugs(Ice::Int packageId, const Ice::Current &) override; + Gentoo::SearchResultBugs getBugsSearch(const std::string_view query, const Ice::Current &) override; + + Gentoo::NewsItemPtr getNewsItem(const std::string_view, const Ice::Current &) override; + Gentoo::News getNewsSearch(const std::string_view, const Ice::Current &) override; + Gentoo::News getNewsRecent(Ice::Int, const Ice::Current &) override; + + Gentoo::Repository getRepository(Ice::Int, const Ice::Current &) override; + Gentoo::Repositories getRepositories(const Ice::Current &) override; + }; } #endif diff --git a/gentoobrowse-api/service/usersimpl.cpp b/gentoobrowse-api/service/usersimpl.cpp index d62bd7e..a95e22b 100644 --- a/gentoobrowse-api/service/usersimpl.cpp +++ b/gentoobrowse-api/service/usersimpl.cpp @@ -17,122 +17,120 @@ #include <sql/users/untrack.sql.h> #include <sql/users/verify.sql.h> -namespace Gentoo { - namespace Service { - Users::Users(const DB::ConnectionPoolPtr & d) : IceTray::AbstractCachingDatabaseClient(d) { } - - Gentoo::UserPtr - Users::authenticate(const std::string_view username, const std::string_view password, const Ice::Current &) - { - return fetchCache<Gentoo::UserPtr>(sql::users::authenticate, 30, username, password); - } +namespace Gentoo::Service { + Users::Users(const DB::ConnectionPoolPtr & d) : IceTray::AbstractCachingDatabaseClient(d) { } - Gentoo::UserPtr - Users::verify(const std::string_view username, const std::string_view verifyguid, const Ice::Current &) - { - return fetch<Gentoo::UserPtr>(sql::users::verify, username, verifyguid); - } + Gentoo::UserPtr + Users::authenticate(const std::string_view username, const std::string_view password, const Ice::Current &) + { + return fetchCache<Gentoo::UserPtr>(sql::users::authenticate, 30, username, password); + } - Gentoo::UserPtr - Users::get(Ice::Int id, const Ice::Current &) - { - return fetch<Gentoo::UserPtr>(sql::users::get, id); - } + Gentoo::UserPtr + Users::verify(const std::string_view username, const std::string_view verifyguid, const Ice::Current &) + { + return fetch<Gentoo::UserPtr>(sql::users::verify, username, verifyguid); + } - Gentoo::NewUserPtr - Users::getNew(const std::string_view username, const std::string_view password, const Ice::Current &) - { - return fetch<Gentoo::NewUserPtr>(sql::users::getNew, username, password); - } + Gentoo::UserPtr + Users::get(Ice::Int id, const Ice::Current &) + { + return fetch<Gentoo::UserPtr>(sql::users::get, id); + } - Gentoo::UserPtr - Users::find(const std::string_view username, const Ice::Current &) - { - return fetch<Gentoo::UserPtr>(sql::users::find, username); - } + Gentoo::NewUserPtr + Users::getNew(const std::string_view username, const std::string_view password, const Ice::Current &) + { + return fetch<Gentoo::NewUserPtr>(sql::users::getNew, username, password); + } + + Gentoo::UserPtr + Users::find(const std::string_view username, const Ice::Current &) + { + return fetch<Gentoo::UserPtr>(sql::users::find, username); + } - Gentoo::NewUserPtr - Users::authOrCreate(const std::string_view & username, const std::string_view & password, - const std::string_view & realname, const std::string_view & email) - { - auto existing = fetch<IceUtil::Optional<Gentoo::NewUserPtr>>(sql::users::getNew, username, password); - if (existing && *existing) { - return *existing; - } - return fetch<Gentoo::NewUserPtr>(sql::users::create, username, password, realname, email); + Gentoo::NewUserPtr + Users::authOrCreate(const std::string_view & username, const std::string_view & password, + const std::string_view & realname, const std::string_view & email) + { + auto existing = fetch<IceUtil::Optional<Gentoo::NewUserPtr>>(sql::users::getNew, username, password); + if (existing && *existing) { + return *existing; } + return fetch<Gentoo::NewUserPtr>(sql::users::create, username, password, realname, email); + } - Gentoo::NewUserPtr - Users::create(const std::string_view username, const std::string_view password, const std::string_view realname, - const std::string_view email, const Ice::Current &) - { - auto notifications = IceTray::Cube::get<Notifications>(); - auto mailServer = IceTray::Cube::get<IceTray::Mail::MailServer>(); + Gentoo::NewUserPtr + Users::create(const std::string_view username, const std::string_view password, const std::string_view realname, + const std::string_view email, const Ice::Current &) + { + auto notifications = IceTray::Cube::get<Notifications>(); + auto mailServer = IceTray::Cube::get<IceTray::Mail::MailServer>(); - auto dbc = db->get(); - DB::TransactionScope tx(*dbc.get()); + auto dbc = db->get(); + DB::TransactionScope tx(*dbc.get()); - auto newUser = authOrCreate(username, password, realname, email); - auto mail = notifications->getSignup(newUser); - mailServer->sendEmail(mail); + auto newUser = authOrCreate(username, password, realname, email); + auto mail = notifications->getSignup(newUser); + mailServer->sendEmail(mail); - return newUser; - } + return newUser; + } - void - Users::mailshotsent(Ice::Int id, const Ice::Current &) - { - auto dbc = db->get(); - auto upd = sql::users::mailshotsent.modify(dbc.get()); - upd->bindParamI(0, id); - upd->execute(); - } + void + Users::mailshotsent(Ice::Int id, const Ice::Current &) + { + auto dbc = db->get(); + auto upd = sql::users::mailshotsent.modify(dbc.get()); + upd->bindParamI(0, id); + upd->execute(); + } - void - Users::remove(Ice::Int id, const std::string_view password, const Ice::Current &) - { - auto dbc = db->get(); - auto del = sql::users::safeDelete.modify(dbc.get()); - del->bindParamI(0, id); - del->bindParamS(1, password); - del->execute(); - } + void + Users::remove(Ice::Int id, const std::string_view password, const Ice::Current &) + { + auto dbc = db->get(); + auto del = sql::users::safeDelete.modify(dbc.get()); + del->bindParamI(0, id); + del->bindParamS(1, password); + del->execute(); + } - void - Users::prune(const Ice::Current & current) - { - auto properties = current.adapter->getCommunicator()->getProperties(); - auto prunePeriod = properties->getPropertyWithDefault("GentooBrowseAPI.Users.PrunePeriod", "8 weeks"); - auto dbc = db->get(); - auto prune = sql::users::prune.modify(dbc.get()); - prune->bindParamS(0, prunePeriod); - prune->execute(); - } + void + Users::prune(const Ice::Current & current) + { + auto properties = current.adapter->getCommunicator()->getProperties(); + auto prunePeriod = properties->getPropertyWithDefault("GentooBrowseAPI.Users.PrunePeriod", "8 weeks"); + auto dbc = db->get(); + auto prune = sql::users::prune.modify(dbc.get()); + prune->bindParamS(0, prunePeriod); + prune->execute(); + } - void - Users::track(Ice::Int userId, Ice::Int packageId, const Ice::Current &) - { - auto dbc = db->get(); - auto track = sql::users::track.modify(dbc.get()); - track->bindParamI(0, userId); - track->bindParamI(1, packageId); - track->execute(); - } + void + Users::track(Ice::Int userId, Ice::Int packageId, const Ice::Current &) + { + auto dbc = db->get(); + auto track = sql::users::track.modify(dbc.get()); + track->bindParamI(0, userId); + track->bindParamI(1, packageId); + track->execute(); + } - void - Users::untrack(Ice::Int userId, Ice::Int packageId, const Ice::Current &) - { - auto dbc = db->get(); - auto untrack = sql::users::untrack.modify(dbc.get()); - untrack->bindParamI(0, userId); - untrack->bindParamI(1, packageId); - untrack->execute(); - } + void + Users::untrack(Ice::Int userId, Ice::Int packageId, const Ice::Current &) + { + auto dbc = db->get(); + auto untrack = sql::users::untrack.modify(dbc.get()); + untrack->bindParamI(0, userId); + untrack->bindParamI(1, packageId); + untrack->execute(); + } - Gentoo::PackageIds - Users::tracked(Ice::Int userId, const Ice::Current &) - { - return fetchCache<Gentoo::PackageIds>(sql::users::tracked, 10, userId); - } + Gentoo::PackageIds + Users::tracked(Ice::Int userId, const Ice::Current &) + { + return fetchCache<Gentoo::PackageIds>(sql::users::tracked, 10, userId); } } diff --git a/gentoobrowse-api/service/usersimpl.h b/gentoobrowse-api/service/usersimpl.h index 79c5623..75d1644 100644 --- a/gentoobrowse-api/service/usersimpl.h +++ b/gentoobrowse-api/service/usersimpl.h @@ -5,33 +5,31 @@ #include <users.h> #include <visibility.h> -namespace Gentoo { - namespace Service { - class DLL_PUBLIC Users : public Gentoo::Users, IceTray::AbstractCachingDatabaseClient { - public: - Users(const DB::ConnectionPoolPtr & d); +namespace Gentoo::Service { + class DLL_PUBLIC Users : public Gentoo::Users, IceTray::AbstractCachingDatabaseClient { + public: + explicit Users(const DB::ConnectionPoolPtr & d); - Gentoo::UserPtr authenticate(const std::string_view, const std::string_view, const Ice::Current &) override; - Gentoo::UserPtr verify(const std::string_view, const std::string_view, const Ice::Current &) override; + Gentoo::UserPtr authenticate(const std::string_view, const std::string_view, const Ice::Current &) override; + Gentoo::UserPtr verify(const std::string_view, const std::string_view, const Ice::Current &) override; - Gentoo::UserPtr get(Ice::Int id, const Ice::Current &) override; - Gentoo::NewUserPtr getNew(const std::string_view, const std::string_view, const Ice::Current &) override; - Gentoo::UserPtr find(const std::string_view username, const Ice::Current &) override; - Gentoo::NewUserPtr create(const std::string_view, const std::string_view, const std::string_view, - const std::string_view, const Ice::Current &) override; - void mailshotsent(Ice::Int id, const Ice::Current &) override; - void remove(Ice::Int id, const std::string_view, const Ice::Current &) override; - void prune(const Ice::Current &) override; + Gentoo::UserPtr get(Ice::Int id, const Ice::Current &) override; + Gentoo::NewUserPtr getNew(const std::string_view, const std::string_view, const Ice::Current &) override; + Gentoo::UserPtr find(const std::string_view username, const Ice::Current &) override; + Gentoo::NewUserPtr create(const std::string_view, const std::string_view, const std::string_view, + const std::string_view, const Ice::Current &) override; + void mailshotsent(Ice::Int id, const Ice::Current &) override; + void remove(Ice::Int id, const std::string_view, const Ice::Current &) override; + void prune(const Ice::Current &) override; - void track(Ice::Int, Ice::Int, const Ice::Current &) override; - void untrack(Ice::Int, Ice::Int, const Ice::Current &) override; - Gentoo::PackageIds tracked(Ice::Int, const Ice::Current &) override; + void track(Ice::Int, Ice::Int, const Ice::Current &) override; + void untrack(Ice::Int, Ice::Int, const Ice::Current &) override; + Gentoo::PackageIds tracked(Ice::Int, const Ice::Current &) override; - private: - DLL_PRIVATE Gentoo::NewUserPtr authOrCreate(const std::string_view &, const std::string_view &, - const std::string_view &, const std::string_view &); - }; - } + private: + DLL_PRIVATE Gentoo::NewUserPtr authOrCreate( + const std::string_view &, const std::string_view &, const std::string_view &, const std::string_view &); + }; } #endif diff --git a/gentoobrowse-api/service/utils/dbUtils.cpp b/gentoobrowse-api/service/utils/dbUtils.cpp index c281265..d0ae626 100644 --- a/gentoobrowse-api/service/utils/dbUtils.cpp +++ b/gentoobrowse-api/service/utils/dbUtils.cpp @@ -5,53 +5,48 @@ #include <buffer.h> #include <tablepatch.h> -namespace Gentoo { - namespace Utils { - namespace Database { - std::string - emptyClone(DB::Connection * db, const std::string & orig) - { - auto tempTable = orig; - auto dot = tempTable.rfind('.'); - if (dot != std::string::npos) { - tempTable = tempTable.substr(dot + 1); - } - tempTable += "_clone_" + boost::lexical_cast<std::string>(db); - db->execute("CREATE TEMPORARY TABLE " + tempTable + " AS SELECT * FROM " + orig + " WHERE false"); - return tempTable; - } +namespace Gentoo::Utils::Database { + std::string + emptyClone(DB::Connection * db, const std::string & orig) + { + auto tempTable = orig; + auto dot = tempTable.rfind('.'); + if (dot != std::string::npos) { + tempTable = tempTable.substr(dot + 1); + } + tempTable += "_clone_" + boost::lexical_cast<std::string>(db); + db->execute("CREATE TEMPORARY TABLE " + tempTable + " AS SELECT * FROM " + orig + " WHERE false"); + return tempTable; + } - std::pair<std::string, DB::ModifyCommandPtr> - namedTemp(DB::Connection * db, const std::string & tempTable, - const std::map<std::string, const std::string> & cols) - { - std::set<std::string> keys; - std::set<std::string> defs; - for (auto c : cols) { - keys.insert(c.first); - defs.insert(c.first + " " + c.second); - } - db->execute("CREATE TEMPORARY TABLE " + tempTable + "(" + boost::join(defs, ",") + ")"); - return {tempTable, tablePatchInserter(db, tempTable, keys)}; - } + std::pair<std::string, DB::ModifyCommandPtr> + namedTemp(DB::Connection * db, const std::string & tempTable, const std::map<std::string, const std::string> & cols) + { + std::set<std::string> keys; + std::set<std::string> defs; + for (const auto & c : cols) { + keys.insert(c.first); + defs.insert(c.first + " " + c.second); + } + db->execute("CREATE TEMPORARY TABLE " + tempTable + "(" + boost::join(defs, ",") + ")"); + return {tempTable, tablePatchInserter(db, tempTable, keys)}; + } - void - drop(DB::Connection * db, const std::string & table) - { - db->execute("DROP TABLE " + table); - } + void + drop(DB::Connection * db, const std::string & table) + { + db->execute("DROP TABLE " + table); + } - DB::ModifyCommandPtr - tablePatchInserter(DB::Connection * dbc, const DB::TablePatch & p) - { - return tablePatchInserter(dbc, p.src, p.cols); - } - DB::ModifyCommandPtr - tablePatchInserter(DB::Connection * dbc, const std::string & t, const std::set<std::string> & c) - { - return dbc->modify("INSERT INTO " + t + "(" + boost::algorithm::join(c, ", ") + ") VALUES(" - + boost::algorithm::join(std::vector<std::string>(c.size(), "?"), ", ") + ")"); - } - } + DB::ModifyCommandPtr + tablePatchInserter(DB::Connection * dbc, const DB::TablePatch & p) + { + return tablePatchInserter(dbc, p.src, p.cols); + } + DB::ModifyCommandPtr + tablePatchInserter(DB::Connection * dbc, const std::string & t, const std::set<std::string> & c) + { + return dbc->modify("INSERT INTO " + t + "(" + boost::algorithm::join(c, ", ") + ") VALUES(" + + boost::algorithm::join(std::vector<std::string>(c.size(), "?"), ", ") + ")"); } } diff --git a/gentoobrowse-api/service/utils/dbUtils.h b/gentoobrowse-api/service/utils/dbUtils.h index cdd9c07..dee1b2d 100644 --- a/gentoobrowse-api/service/utils/dbUtils.h +++ b/gentoobrowse-api/service/utils/dbUtils.h @@ -1,5 +1,4 @@ -#ifndef GENTOOBROWSE_API_SERVICE_DBUTILS_H -#define GENTOOBROWSE_API_SERVICE_DBUTILS_H +#pragma once #include <IceUtil/Exception.h> #include <IceUtil/Optional.h> @@ -7,18 +6,11 @@ #include <connection.h> #include <modifycommand.h> -namespace Gentoo { - namespace Utils { - namespace Database { - std::string emptyClone(DB::Connection *, const std::string &); - std::pair<std::string, DB::ModifyCommandPtr> namedTemp( - DB::Connection *, const std::string &, const std::map<std::string, const std::string> & cols); - void drop(DB::Connection *, const std::string &); - DB::ModifyCommandPtr tablePatchInserter(DB::Connection *, const DB::TablePatch &); - DB::ModifyCommandPtr tablePatchInserter( - DB::Connection *, const std::string &, const std::set<std::string> &); - } - } +namespace Gentoo::Utils::Database { + std::string emptyClone(DB::Connection *, const std::string &); + std::pair<std::string, DB::ModifyCommandPtr> namedTemp( + DB::Connection *, const std::string &, const std::map<std::string, const std::string> & cols); + void drop(DB::Connection *, const std::string &); + DB::ModifyCommandPtr tablePatchInserter(DB::Connection *, const DB::TablePatch &); + DB::ModifyCommandPtr tablePatchInserter(DB::Connection *, const std::string &, const std::set<std::string> &); } - -#endif diff --git a/gentoobrowse-api/service/utils/ebuildCacheParser.cpp b/gentoobrowse-api/service/utils/ebuildCacheParser.cpp index cd50d1a..c3fef41 100644 --- a/gentoobrowse-api/service/utils/ebuildCacheParser.cpp +++ b/gentoobrowse-api/service/utils/ebuildCacheParser.cpp @@ -1,36 +1,34 @@ #include "ebuildCacheParser.h" -namespace Gentoo { - namespace Utils { - EbuildCacheParser::EbuildCacheParser(const std::filesystem::path & p) : AdHoc::FileUtils::MemMap(p) - { - auto chardata = sv(); - for (auto eq = chardata.find('='); eq != std::string_view::npos; eq = chardata.find('=')) { - if (auto nl = chardata.find('\n', eq + 1); nl != std::string_view::npos) { - kvs.insert({chardata.substr(0, eq), chardata.substr(eq + 1, nl - eq - 1)}); - chardata.remove_prefix(nl + 1); - } +namespace Gentoo::Utils { + EbuildCacheParser::EbuildCacheParser(const std::filesystem::path & p) : AdHoc::FileUtils::MemMap(p) + { + auto chardata = sv(); + for (auto eq = chardata.find('='); eq != std::string_view::npos; eq = chardata.find('=')) { + if (auto nl = chardata.find('\n', eq + 1); nl != std::string_view::npos) { + kvs.insert({chardata.substr(0, eq), chardata.substr(eq + 1, nl - eq - 1)}); + chardata.remove_prefix(nl + 1); } } + } - std::optional<Glib::ustring> - EbuildCacheParser::get(const std::string & key) const - { - auto kvi = kvs.find(key); - if (kvi == kvs.end()) { - return {}; - } - return Glib::ustring(kvi->second.data(), kvi->second.length()); + std::optional<Glib::ustring> + EbuildCacheParser::get(const std::string & key) const + { + auto kvi = kvs.find(key); + if (kvi == kvs.end()) { + return {}; } + return Glib::ustring(kvi->second.data(), kvi->second.length()); + } - std::optional<std::string_view> - EbuildCacheParser::getRange(const std::string & key) const - { - auto kvi = kvs.find(key); - if (kvi == kvs.end()) { - return {}; - } - return kvi->second; + std::optional<std::string_view> + EbuildCacheParser::getRange(const std::string & key) const + { + auto kvi = kvs.find(key); + if (kvi == kvs.end()) { + return {}; } + return kvi->second; } } diff --git a/gentoobrowse-api/service/utils/ebuildCacheParser.h b/gentoobrowse-api/service/utils/ebuildCacheParser.h index 4fed766..ee3977f 100644 --- a/gentoobrowse-api/service/utils/ebuildCacheParser.h +++ b/gentoobrowse-api/service/utils/ebuildCacheParser.h @@ -1,5 +1,4 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_EBUILDCACHEPARSER_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_EBUILDCACHEPARSER_H +#pragma once #include "wrap/ustring.h" #include <fileUtils.h> @@ -8,21 +7,17 @@ #include <optional> #include <string_view> -namespace Gentoo { - namespace Utils { - class EbuildCacheParser : public AdHoc::FileUtils::MemMap { - public: - typedef std::map<std::string_view, const std::string_view> KVs; +namespace Gentoo::Utils { + class EbuildCacheParser : public AdHoc::FileUtils::MemMap { + public: + using KVs = std::map<std::string_view, const std::string_view, std::less<>>; - explicit EbuildCacheParser(const std::filesystem::path & p); + explicit EbuildCacheParser(const std::filesystem::path & p); - std::optional<Glib::ustring> get(const std::string & key) const; - std::optional<std::string_view> getRange(const std::string & key) const; + [[nodiscard]] std::optional<Glib::ustring> get(const std::string & key) const; + [[nodiscard]] std::optional<std::string_view> getRange(const std::string & key) const; - private: - KVs kvs; - }; - } + private: + KVs kvs; + }; } - -#endif diff --git a/gentoobrowse-api/service/utils/entityWhereFilter.cpp b/gentoobrowse-api/service/utils/entityWhereFilter.cpp index 1deb6ef..be74f2e 100644 --- a/gentoobrowse-api/service/utils/entityWhereFilter.cpp +++ b/gentoobrowse-api/service/utils/entityWhereFilter.cpp @@ -2,57 +2,55 @@ #include <buffer.h> #include <command.h> -namespace Gentoo { - namespace Utils { - template<typename T> EntityWhereFilter<T>::EntityWhereFilter(const std::string & en) : entityColName(en) { } +namespace Gentoo::Utils { + template<typename T> EntityWhereFilter<T>::EntityWhereFilter(std::string en) : entityColName(std::move(en)) { } - template<typename T> - EntityWhereFilter<T>::EntityWhereFilter(const std::string & en, const T & e) : entityColName(en) - { - entityIds.insert(e); - } + template<typename T> + EntityWhereFilter<T>::EntityWhereFilter(std::string en, T e) : + entityIds {std::move(e)}, entityColName(std::move(en)) + { + } - template<typename T> - EntityWhereFilter<T>::EntityWhereFilter(const std::string & en, const EntityIds & e) : - entityIds(e), entityColName(en) - { - } + template<typename T> + EntityWhereFilter<T>::EntityWhereFilter(std::string en, EntityIds e) : + entityIds(std::move(e)), entityColName(std::move(en)) + { + } - template<typename T> - void - EntityWhereFilter<T>::writeSql(AdHoc::Buffer & sql) - { - sql.appendbf("a.%s IN (", entityColName); - for (auto ei = entityIds.begin(); ei != entityIds.end(); ++ei) { - if (ei != entityIds.begin()) { - sql.append(", ?"); - } - else { - sql.append("?"); - } + template<typename T> + void + EntityWhereFilter<T>::writeSql(AdHoc::Buffer & sql) + { + sql.appendbf("a.%s IN (", entityColName); + for (auto ei = entityIds.begin(); ei != entityIds.end(); ++ei) { + if (ei != entityIds.begin()) { + sql.append(", ?"); } - sql.append(")"); - } - - template<> - void - EntityWhereFilter<int64_t>::bindParams(DB::Command * c, unsigned int & offset) - { - for (const auto & entityId : entityIds) { - c->bindParamI(offset++, entityId); + else { + sql.append("?"); } } + sql.append(")"); + } - template<> - void - EntityWhereFilter<std::string>::bindParams(DB::Command * c, unsigned int & offset) - { - for (const auto & entityId : entityIds) { - c->bindParamS(offset++, entityId); - } + template<> + void + EntityWhereFilter<int64_t>::bindParams(DB::Command * c, unsigned int & offset) + { + for (const auto & entityId : entityIds) { + c->bindParamI(offset++, entityId); } + } - template class EntityWhereFilter<int64_t>; - template class EntityWhereFilter<std::string>; + template<> + void + EntityWhereFilter<std::string>::bindParams(DB::Command * c, unsigned int & offset) + { + for (const auto & entityId : entityIds) { + c->bindParamS(offset++, entityId); + } } + + template class EntityWhereFilter<int64_t>; + template class EntityWhereFilter<std::string>; } diff --git a/gentoobrowse-api/service/utils/entityWhereFilter.h b/gentoobrowse-api/service/utils/entityWhereFilter.h index 0c172dd..ccb92a0 100644 --- a/gentoobrowse-api/service/utils/entityWhereFilter.h +++ b/gentoobrowse-api/service/utils/entityWhereFilter.h @@ -1,26 +1,21 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_ENTITYWHEREFILTER_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_ENTITYWHEREFILTER_H +#pragma once #include <set> #include <sqlWriter.h> -namespace Gentoo { - namespace Utils { - template<typename T> class EntityWhereFilter : public DB::SqlWriter { - public: - typedef std::set<T> EntityIds; +namespace Gentoo::Utils { + template<typename T> class EntityWhereFilter : public DB::SqlWriter { + public: + using EntityIds = std::set<T>; - explicit EntityWhereFilter(const std::string & en); - EntityWhereFilter(const std::string & en, const T & e); - EntityWhereFilter(const std::string & en, const EntityIds & e); + explicit EntityWhereFilter(std::string en); + EntityWhereFilter(std::string en, T e); + EntityWhereFilter(std::string en, EntityIds e); - void writeSql(AdHoc::Buffer & sql) override; - void bindParams(DB::Command * c, unsigned int & offset) override; + void writeSql(AdHoc::Buffer & sql) override; + void bindParams(DB::Command * c, unsigned int & offset) override; - EntityIds entityIds; - const std::string entityColName; - }; - } + EntityIds entityIds; + const std::string entityColName; + }; } - -#endif diff --git a/gentoobrowse-api/service/utils/git.cpp b/gentoobrowse-api/service/utils/git.cpp index b21edf2..c2e94b7 100644 --- a/gentoobrowse-api/service/utils/git.cpp +++ b/gentoobrowse-api/service/utils/git.cpp @@ -4,99 +4,88 @@ #include <logger.h> #include <maintenance.h> -namespace Gentoo { - namespace Utils { - namespace Git { - void - throwError(void * const func, int err) - { -#if LIBGIT2_VER_MINOR >= 28 - const git_error * e = git_error_last(); -#else - const git_error * e = giterr_last(); -#endif - char ** fn = backtrace_symbols(&func, 1); - assert(fn); - assert(*fn); - std::string funcName(*fn); - free(fn); - throw ::Gentoo::GitError(funcName, err, e->klass, e->message); - } +namespace Gentoo::Utils::Git { + void + throwError(void * const func, int err) + { + const git_error * e = git_error_last(); + std::unique_ptr<char *, decltype(&free)> fn {backtrace_symbols(&func, 1), free}; + assert(fn); + assert(*fn); + throw ::Gentoo::GitError(*fn, err, e->klass, e->message); + } - std::string - operator*(const git_oid & oid) - { - std::string str(GIT_OID_HEXSZ, ' '); - git_oid_tostr(&str.front(), GIT_OID_HEXSZ + 1, &oid); - return str; - } + std::string + operator*(const git_oid & oid) + { + std::string str(GIT_OID_HEXSZ, ' '); + git_oid_tostr(&str.front(), GIT_OID_HEXSZ + 1, &oid); + return str; + } - AdHocFormatter(RefSpec, "refs/heads/%?:refs/remotes/%?/%?"); - GitAnnotatedCommitPtr - gitFetch(git_repository * repo, git_remote * remote, const char * remoteBranchName) - { - auto opts = gitSafeGet(git_fetch_init_options, static_cast<unsigned int>(GIT_FETCH_OPTIONS_VERSION)); - opts.prune = GIT_FETCH_PRUNE; - opts.update_fetchhead = 1; - auto localBranch = gitSafeGet(git_repository_head, git_reference_free, repo); - auto localBranchName = gitSafeGet(git_branch_name, localBranch.get()); - auto refspec = RefSpec::get(localBranchName, git_remote_name(remote), remoteBranchName); - char * s[] = {&refspec.front()}; - git_strarray refs = {s, 1}; - gitSafe(git_remote_fetch, remote, &refs, &opts, nullptr); - return gitSafeGet(git_annotated_commit_from_revspec, git_annotated_commit_free, repo, "FETCH_HEAD"); - } + AdHocFormatter(RefSpec, "refs/heads/%?:refs/remotes/%?/%?"); + GitAnnotatedCommitPtr + gitFetch(git_repository * repo, git_remote * remote, const char * remoteBranchName) + { + auto opts = gitSafeGet(git_fetch_init_options, static_cast<unsigned int>(GIT_FETCH_OPTIONS_VERSION)); + opts.prune = GIT_FETCH_PRUNE; + opts.update_fetchhead = 1; + auto localBranch = gitSafeGet(git_repository_head, git_reference_free, repo); + auto localBranchName = gitSafeGet(git_branch_name, localBranch.get()); + auto refspec = RefSpec::get(localBranchName, git_remote_name(remote), remoteBranchName); + std::array<char *, 1> s {refspec.data()}; + git_strarray refs = {s.data(), 1}; + gitSafe(git_remote_fetch, remote, &refs, &opts, nullptr); + return gitSafeGet(git_annotated_commit_from_revspec, git_annotated_commit_free, repo, "FETCH_HEAD"); + } - AdHocFormatter(FastForward, "Performing fast-forward %? -> %?"); - AdHocFormatter(CheckOut, "Checking out %?"); - git_oid - gitFastForward(git_repository * repo, const git_annotated_commit * fetch_head) - { - auto log = LOGMANAGER()->getLogger(__FUNCTION__); - // Test fast-forward is possible - const git_annotated_commit * heads[] = {fetch_head}; - git_merge_analysis_t analysis = GIT_MERGE_ANALYSIS_NONE; - git_merge_preference_t preference = GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY; - gitSafe(git_merge_analysis, &analysis, &preference, repo, heads, 1LU); + AdHocFormatter(FastForward, "Performing fast-forward %? -> %?"); + AdHocFormatter(CheckOut, "Checking out %?"); + git_oid + gitFastForward(git_repository * repo, const git_annotated_commit * fetch_head) + { + auto log = LOGMANAGER()->getLogger(__FUNCTION__); + // Test fast-forward is possible + std::array<const git_annotated_commit *, 1> heads {fetch_head}; + git_merge_analysis_t analysis = GIT_MERGE_ANALYSIS_NONE; + git_merge_preference_t preference = GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY; + gitSafe(git_merge_analysis, &analysis, &preference, repo, heads.data(), 1LU); - auto head = gitSafeGet(git_repository_head, git_reference_free, repo); - if (analysis == GIT_MERGE_ANALYSIS_UP_TO_DATE) { - return *git_reference_target(head.get()); - } - if (!(analysis & (GIT_MERGE_ANALYSIS_NORMAL | GIT_MERGE_ANALYSIS_FASTFORWARD))) { - throw GitError("Merge analysis", 0, 0, "Could not fast-forward branch"); - } + auto head = gitSafeGet(git_repository_head, git_reference_free, repo); + if (analysis == GIT_MERGE_ANALYSIS_UP_TO_DATE) { + return *git_reference_target(head.get()); + } + if (!(analysis & (GIT_MERGE_ANALYSIS_NORMAL | GIT_MERGE_ANALYSIS_FASTFORWARD))) { + throw GitError("Merge analysis", 0, 0, "Could not fast-forward branch"); + } - // Perform fast-forward - auto fetch_head_id = *git_annotated_commit_id(fetch_head); - auto fetch_head_object - = gitSafeGet(git_object_lookup, git_object_free, repo, &fetch_head_id, GIT_OBJ_ANY); - log->messagectf<FastForward>( - IceTray::Logging::LogLevel::INFO, *git_reference_target(head.get()), fetch_head_id); - gitSafeGet(git_reference_set_target, git_reference_free, head.get(), &fetch_head_id, "fast-forward"); + // Perform fast-forward + auto fetch_head_id = *git_annotated_commit_id(fetch_head); + auto fetch_head_object = gitSafeGet(git_object_lookup, git_object_free, repo, &fetch_head_id, GIT_OBJ_ANY); + log->messagectf<FastForward>( + IceTray::Logging::LogLevel::INFO, *git_reference_target(head.get()), fetch_head_id); + gitSafeGet(git_reference_set_target, git_reference_free, head.get(), &fetch_head_id, "fast-forward"); - // Checkout new head - log->messagectf<CheckOut>(IceTray::Logging::LogLevel::INFO, fetch_head_id); - auto checkout_options = gitSafeGet(git_checkout_init_options, 0u + GIT_CHECKOUT_OPTIONS_VERSION); - checkout_options.checkout_strategy = GIT_CHECKOUT_FORCE; - gitSafe(git_checkout_head, repo, &checkout_options); - return fetch_head_id; - } + // Checkout new head + log->messagectf<CheckOut>(IceTray::Logging::LogLevel::INFO, fetch_head_id); + auto checkout_options = gitSafeGet(git_checkout_init_options, 0U + GIT_CHECKOUT_OPTIONS_VERSION); + checkout_options.checkout_strategy = GIT_CHECKOUT_FORCE; + gitSafe(git_checkout_head, repo, &checkout_options); + return fetch_head_id; + } - AdHocFormatter(Updating, "Updating repository in %? from %?/%?"); - AdHocFormatter(UpdateComplete, "Update complete to %?"); - void - updateRepository(const std::string & path, const std::string & upstream, const std::string & branch) - { - auto log = LOGMANAGER()->getLogger(__FUNCTION__); - log->messagectf<Updating>(IceTray::Logging::LogLevel::INFO, path, upstream, branch); - auto repo = gitSafeGet(git_repository_open, git_repository_free, path.c_str()); - auto origin = gitSafeGet(git_remote_lookup, git_remote_free, repo.get(), upstream.c_str()); - auto fetchHead = gitFetch(repo.get(), origin.get(), branch.c_str()); - auto oid = gitFastForward(repo.get(), fetchHead.get()); - log->messagectf<UpdateComplete>(IceTray::Logging::LogLevel::INFO, oid); - } - } + AdHocFormatter(Updating, "Updating repository in %? from %?/%?"); + AdHocFormatter(UpdateComplete, "Update complete to %?"); + void + updateRepository(const std::string & path, const std::string & upstream, const std::string & branch) + { + auto log = LOGMANAGER()->getLogger(__FUNCTION__); + log->messagectf<Updating>(IceTray::Logging::LogLevel::INFO, path, upstream, branch); + auto repo = gitSafeGet(git_repository_open, git_repository_free, path.c_str()); + auto origin = gitSafeGet(git_remote_lookup, git_remote_free, repo.get(), upstream.c_str()); + auto fetchHead = gitFetch(repo.get(), origin.get(), branch.c_str()); + auto oid = gitFastForward(repo.get(), fetchHead.get()); + log->messagectf<UpdateComplete>(IceTray::Logging::LogLevel::INFO, oid); } } @@ -104,9 +93,9 @@ namespace std { std::ostream & operator<<(std::ostream & s, const git_oid & oid) { - char str[GIT_OID_HEXSZ + 1]; - git_oid_tostr(str, sizeof(str), &oid); - s.write(str, GIT_OID_HEXSZ); + std::array<char, GIT_OID_HEXSZ + 1> str {}; + git_oid_tostr(str.data(), str.size(), &oid); + s.write(str.data(), GIT_OID_HEXSZ); return s; } } diff --git a/gentoobrowse-api/service/utils/git.h b/gentoobrowse-api/service/utils/git.h index b9191e1..d240b51 100644 --- a/gentoobrowse-api/service/utils/git.h +++ b/gentoobrowse-api/service/utils/git.h @@ -1,58 +1,51 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_GIT_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_GIT_H +#pragma once #include <git2.h> #include <memory> #include <ostream> -namespace Gentoo { - namespace Utils { - namespace Git { - void throwError(void * const func, int err); - - template<typename... P, typename... A> - void - gitSafe(int (*func)(P...), A... p) - { - if (int giterror_ = func(p...) < 0) { - throwError(reinterpret_cast<void * const>(func), giterror_); - } - } - - template<typename T> using GitTPtr = std::unique_ptr<T, void (*)(T *)>; - - template<typename R, typename... P, typename... A> - GitTPtr<R> - gitSafeGet(int (*get)(R **, P...), void (*release)(R *), A... p) - { - R * r = nullptr; - gitSafe(get, &r, p...); - return GitTPtr<R>(r, release); - } - - template<typename R, typename... P, typename... A> - R - gitSafeGet(int (*get)(R *, P...), A... p) - { - R r; - gitSafe(get, &r, p...); - return r; - } - - std::string operator*(const git_oid &); - - using GitAnnotatedCommitPtr = GitTPtr<git_annotated_commit>; - GitAnnotatedCommitPtr gitFetch(git_repository * repo, git_remote * remote, const char * branch); - - git_oid gitFastForward(git_repository * repo, const git_annotated_commit * fetch_head); - - void updateRepository(const std::string & path, const std::string & upstream, const std::string & branch); +namespace Gentoo::Utils::Git { + void throwError(void * const func, int err); + + template<typename... P, typename... A> + void + gitSafe(int (*func)(P...), A... p) + { + if (int giterror_ = func(p...) < 0) { + throwError(reinterpret_cast<void * const>(func), giterror_); } } + + template<typename T> using GitTPtr = std::unique_ptr<T, void (*)(T *)>; + + template<typename R, typename... P, typename... A> + GitTPtr<R> + gitSafeGet(int (*get)(R **, P...), void (*release)(R *), A... p) + { + R * r = nullptr; + gitSafe(get, &r, p...); + return GitTPtr<R>(r, release); + } + + template<typename R, typename... P, typename... A> + R + gitSafeGet(int (*get)(R *, P...), A... p) + { + R r {}; + gitSafe(get, &r, p...); + return r; + } + + std::string operator*(const git_oid &); + + using GitAnnotatedCommitPtr = GitTPtr<git_annotated_commit>; + GitAnnotatedCommitPtr gitFetch(git_repository * repo, git_remote * remote, const char * branch); + + git_oid gitFastForward(git_repository * repo, const git_annotated_commit * fetch_head); + + void updateRepository(const std::string & path, const std::string & upstream, const std::string & branch); } namespace std { std::ostream & operator<<(std::ostream &, const git_oid &); } - -#endif diff --git a/gentoobrowse-api/service/utils/splitEbuildProps.cpp b/gentoobrowse-api/service/utils/splitEbuildProps.cpp index ec9df6b..f9e1b6e 100644 --- a/gentoobrowse-api/service/utils/splitEbuildProps.cpp +++ b/gentoobrowse-api/service/utils/splitEbuildProps.cpp @@ -3,27 +3,23 @@ #include <buffer.h> #include <command.h> -namespace Gentoo { - namespace Utils { - SplitEbuildProps::SplitEbuildProps( - const std::string & ce, int64_t e, const std::string & cp, const std::optional<Glib::ustring> & p) : - entityId(e), - colEntityName(ce), colPropName(cp), props(p) - { - } +namespace Gentoo::Utils { + SplitEbuildProps::SplitEbuildProps(std::string ce, int64_t e, std::string cp, std::optional<Glib::ustring> p) : + entityId(e), colEntityName(std::move(ce)), colPropName(std::move(cp)), props(std::move(p)) + { + } - void - SplitEbuildProps::writeSql(AdHoc::Buffer & sql) - { - sql.appendbf("(SELECT DISTINCT ?::int %s, trim(regexp_split_to_table(?, '\\s+'), '+') %s)", colEntityName, - colPropName); - } + void + SplitEbuildProps::writeSql(AdHoc::Buffer & sql) + { + sql.appendbf("(SELECT DISTINCT ?::int %s, trim(regexp_split_to_table(?, '\\s+'), '+') %s)", colEntityName, + colPropName); + } - void - SplitEbuildProps::bindParams(DB::Command * c, unsigned int & offset) - { - c->bindParamI(offset++, entityId); - c->bindParamS(offset++, props); - } + void + SplitEbuildProps::bindParams(DB::Command * c, unsigned int & offset) + { + c->bindParamI(offset++, entityId); + c->bindParamS(offset++, props); } } diff --git a/gentoobrowse-api/service/utils/splitEbuildProps.h b/gentoobrowse-api/service/utils/splitEbuildProps.h index 3945b6a..c413a51 100644 --- a/gentoobrowse-api/service/utils/splitEbuildProps.h +++ b/gentoobrowse-api/service/utils/splitEbuildProps.h @@ -1,25 +1,19 @@ -#ifndef GENTOOBROWSE_API_SERVICE_MAINTENANCE_SPLITEBUILDPROPS_H -#define GENTOOBROWSE_API_SERVICE_MAINTENANCE_SPLITEBUILDPROPS_H +#pragma once #include "wrap/ustring.h" #include <optional> #include <sqlWriter.h> -namespace Gentoo { - namespace Utils { - class SplitEbuildProps : public DB::SqlWriter { - public: - SplitEbuildProps( - const std::string & ce, int64_t e, const std::string & cp, const std::optional<Glib::ustring> & p); +namespace Gentoo::Utils { + class SplitEbuildProps : public DB::SqlWriter { + public: + SplitEbuildProps(std::string ce, int64_t e, std::string cp, std::optional<Glib::ustring> p); - void writeSql(AdHoc::Buffer & sql) override; - void bindParams(DB::Command * c, unsigned int & offset) override; + void writeSql(AdHoc::Buffer & sql) override; + void bindParams(DB::Command * c, unsigned int & offset) override; - const int64_t entityId; - const std::string colEntityName, colPropName; - const std::optional<Glib::ustring> props; - }; - } + const int64_t entityId; + const std::string colEntityName, colPropName; + const std::optional<Glib::ustring> props; + }; } - -#endif diff --git a/gentoobrowse-api/service/utils/xmlUtils.cpp b/gentoobrowse-api/service/utils/xmlUtils.cpp index 1ddc16e..195b054 100644 --- a/gentoobrowse-api/service/utils/xmlUtils.cpp +++ b/gentoobrowse-api/service/utils/xmlUtils.cpp @@ -1,22 +1,20 @@ #include "xmlUtils.h" -namespace Gentoo { - namespace Utils { - XmlDoc::XmlDoc(const std::filesystem::path & path) : xmlpp::DomParser(path) { } +namespace Gentoo::Utils { + XmlDoc::XmlDoc(const std::filesystem::path & path) : xmlpp::DomParser(path) { } - std::optional<Glib::ustring> - XmlDoc::getXPathValue(const Glib::ustring & xp) - { - auto ns = get_document()->get_root_node()->find(xp); - if (ns.size() >= 1) { - if (auto cn = dynamic_cast<const xmlpp::ContentNode *>(ns.front())) { - return cn->get_content(); - } + std::optional<Glib::ustring> + XmlDoc::getXPathValue(const Glib::ustring & xp) + { + auto ns = get_document()->get_root_node()->find(xp); + if (ns.size() >= 1) { + if (auto cn = dynamic_cast<const xmlpp::ContentNode *>(ns.front())) { + return cn->get_content(); } - else if (ns.size() > 1) { - throw std::logic_error("Ambiguous xpath " + xp); - } - return {}; } + else if (ns.size() > 1) { + throw std::logic_error("Ambiguous xpath " + xp); + } + return {}; } } diff --git a/gentoobrowse-api/service/utils/xmlUtils.h b/gentoobrowse-api/service/utils/xmlUtils.h index 51da33a..0e44a73 100644 --- a/gentoobrowse-api/service/utils/xmlUtils.h +++ b/gentoobrowse-api/service/utils/xmlUtils.h @@ -1,19 +1,14 @@ -#ifndef GENTOOBROWSE_API_SERVICE_XMLUTILS_H -#define GENTOOBROWSE_API_SERVICE_XMLUTILS_H +#pragma once #include "wrap/domparser.h" #include <filesystem> #include <optional> -namespace Gentoo { - namespace Utils { - class XmlDoc : public xmlpp::DomParser { - public: - explicit XmlDoc(const std::filesystem::path &); +namespace Gentoo::Utils { + class XmlDoc : public xmlpp::DomParser { + public: + explicit XmlDoc(const std::filesystem::path &); - std::optional<Glib::ustring> getXPathValue(const Glib::ustring &); - }; - } + std::optional<Glib::ustring> getXPathValue(const Glib::ustring &); + }; } - -#endif diff --git a/gentoobrowse-api/service/xsltStreamSerializer.cpp b/gentoobrowse-api/service/xsltStreamSerializer.cpp index b7fd624..90dff01 100644 --- a/gentoobrowse-api/service/xsltStreamSerializer.cpp +++ b/gentoobrowse-api/service/xsltStreamSerializer.cpp @@ -26,8 +26,8 @@ namespace Gentoo { return len; } - XsltStreamSerializer::XsltStreamSerializer(const IceTray::Mail::EmailPtr & e, xsltStylesheet * ss) : - Slicer::XmlDocumentSerializer(doc), mail(e), doc(nullptr), stylesheet(ss) + XsltStreamSerializer::XsltStreamSerializer(IceTray::Mail::EmailPtr e, xsltStylesheet * ss) : + Slicer::XmlDocumentSerializer(doc), mail(std::move(e)), doc(nullptr), stylesheet(ss) { } @@ -52,7 +52,7 @@ namespace Gentoo { XsltStreamSerializer::getHtml(xmlDoc * result) { std::stringstream strm; - xmlOutputBufferPtr buf = xmlOutputBufferCreateIO(xmlstrmwritecallback, xmlstrmclosecallback, &strm, NULL); + xmlOutputBufferPtr buf = xmlOutputBufferCreateIO(xmlstrmwritecallback, xmlstrmclosecallback, &strm, nullptr); htmlDocContentDumpFormatOutput(buf, result, "utf-8", 0); xmlOutputBufferClose(buf); return std::make_shared<MultiPart>(Headers {}, "related", @@ -70,21 +70,21 @@ namespace Gentoo { XsltStreamSerializer::getText(xmlDoc * result) { std::stringstream strm; - std::vector<std::string> callLynx; - callLynx.push_back("/usr/bin/lynx"); - callLynx.push_back("-dump"); - callLynx.push_back("-stdin"); - std::string widthArg = "-width=78"; - callLynx.push_back(widthArg); + std::vector<std::string> callLynx { + "/usr/bin/lynx", + "-dump", + "-stdin", + "-width=78", + }; AdHoc::System::ProcessPipes fds(callLynx, true, true, false); FILE * lynxIn = fdopen(fds.fdIn(), "w"); // Fixed encoding as we want the result to go back into a ustring htmlNodeDumpFileFormat(lynxIn, result, xmlDocGetRootElement(result), "utf-8", 0); fclose(lynxIn); - char buf[1024]; + std::array<char, BUFSIZ> buf {}; ssize_t r; - while ((r = read(fds.fdOut(), buf, sizeof(buf))) > 0) { - strm.write(buf, r); + while ((r = read(fds.fdOut(), buf.data(), buf.size())) > 0) { + strm.write(buf.data(), r); } int status; waitpid(fds.pid(), &status, 0); diff --git a/gentoobrowse-api/service/xsltStreamSerializer.h b/gentoobrowse-api/service/xsltStreamSerializer.h index 5e73d59..9076a3f 100644 --- a/gentoobrowse-api/service/xsltStreamSerializer.h +++ b/gentoobrowse-api/service/xsltStreamSerializer.h @@ -1,6 +1,7 @@ #ifndef ICESPIDER_CORE_XSLTSTREAMSERIALIZER_H #define ICESPIDER_CORE_XSLTSTREAMSERIALIZER_H +#include <c++11Helpers.h> #include <libxslt/transform.h> #include <notifications.h> #include <slicer/xml/serializer.h> @@ -9,8 +10,9 @@ namespace Gentoo { class DLL_PUBLIC XsltStreamSerializer : public Slicer::XmlDocumentSerializer { public: - XsltStreamSerializer(const IceTray::Mail::EmailPtr &, xsltStylesheet *); - ~XsltStreamSerializer(); + XsltStreamSerializer(IceTray::Mail::EmailPtr, xsltStylesheet *); + ~XsltStreamSerializer() override; + SPECIAL_MEMBERS_DELETE(XsltStreamSerializer); void Serialize(Slicer::ModelPartForRootPtr mp) override; diff --git a/gentoobrowse-api/unittests/mockDefs.cpp b/gentoobrowse-api/unittests/mockDefs.cpp index 2152220..02ce761 100644 --- a/gentoobrowse-api/unittests/mockDefs.cpp +++ b/gentoobrowse-api/unittests/mockDefs.cpp @@ -54,8 +54,8 @@ TestClient::TestClient() : BOOST_REQUIRE(u); } -std::pair<IceTray::Mime::TextPart *, IceTray::Mime::TextPart *> -TestClient::humanReadableParts(IceTray::Mail::EmailPtr e) +std::array<IceTray::Mime::TextPart *, 2> +TestClient::humanReadableParts(const IceTray::Mail::EmailPtr & e) const { BOOST_REQUIRE(e); @@ -77,7 +77,7 @@ TestClient::humanReadableParts(IceTray::Mail::EmailPtr e) } void -TestClient::lintable_test_files(std::string_view name, IceTray::Mail::EmailPtr e) +TestClient::lintable_test_files(std::string_view name, const IceTray::Mail::EmailPtr & e) const { auto [plainPart, htmlPart] = humanReadableParts(e); diff --git a/gentoobrowse-api/unittests/mockDefs.h b/gentoobrowse-api/unittests/mockDefs.h index 327f293..d965a94 100644 --- a/gentoobrowse-api/unittests/mockDefs.h +++ b/gentoobrowse-api/unittests/mockDefs.h @@ -43,8 +43,8 @@ public: IceTray::Mail::MailServerPtr ms; Gentoo::UsersPrxPtr u; - void lintable_test_files(std::string_view name, IceTray::Mail::EmailPtr e); - std::pair<IceTray::Mime::TextPart *, IceTray::Mime::TextPart *> humanReadableParts(IceTray::Mail::EmailPtr e); + void lintable_test_files(std::string_view name, const IceTray::Mail::EmailPtr & e) const; + std::array<IceTray::Mime::TextPart *, 2> humanReadableParts(const IceTray::Mail::EmailPtr & e) const; }; #define SQL_REQUIRE_EQUAL(sql, type, expected) \ diff --git a/gentoobrowse-api/unittests/testMaintenance.cpp b/gentoobrowse-api/unittests/testMaintenance.cpp index b90c659..0dc09c0 100644 --- a/gentoobrowse-api/unittests/testMaintenance.cpp +++ b/gentoobrowse-api/unittests/testMaintenance.cpp @@ -19,12 +19,12 @@ BOOST_FIXTURE_TEST_SUITE(maintenance, MaintenanceClientCombined) const std::filesystem::path treeDir(binDir / "tree"); const std::filesystem::path fixturesDir(rootDir / "fixtures"); -void dumpDb(DB::ConnectionPtr db); +static void dumpDb(const DB::ConnectionPtr & db); void -doRefreshPackageTree(DB::ConnectionPtr db, int64_t cats, int64_t devvcs, int64_t pkgs, int64_t ebs, int64_t ebus, - int64_t ebas, int64_t pus, int64_t ug, int64_t ul, int64_t ugs, int64_t ugds, int64_t deps, int64_t rdeps, - int64_t news, int64_t masks, int64_t ebuildMasks) +doRefreshPackageTree(const DB::ConnectionPtr & db, int64_t cats, int64_t devvcs, int64_t pkgs, int64_t ebs, + int64_t ebus, int64_t ebas, int64_t pus, int64_t ug, int64_t ul, int64_t ugs, int64_t ugds, int64_t deps, + int64_t rdeps, int64_t news, int64_t masks, int64_t ebuildMasks) { dumpDb(db); @@ -47,9 +47,9 @@ doRefreshPackageTree(DB::ConnectionPtr db, int64_t cats, int64_t devvcs, int64_t } void -dumpDb(DB::ConnectionPtr db) +dumpDb(const DB::ConnectionPtr & db) { -#if DUMBDB +#if DUMPDB db->execute("COPY gentoobrowse.categories TO '/tmp/categories.tsv'"); db->execute("COPY gentoobrowse.packages TO '/tmp/packages.tsv'"); db->execute("COPY gentoobrowse.ebuilds TO '/tmp/ebuilds.tsv'"); @@ -70,9 +70,9 @@ dumpDb(DB::ConnectionPtr db) class M2 : public Gentoo::Service::Maintenance { public: - typedef std::map<std::filesystem::path, size_t> FileMap; + using FileMap = std::map<std::filesystem::path, size_t>; - M2(const DB::ConnectionPoolPtr & d) : Gentoo::Service::Maintenance(d) { } + explicit M2(const DB::ConnectionPoolPtr & d) : Gentoo::Service::Maintenance(d) { } void applyDiffOfFolders(const std::filesystem::path & from, const std::filesystem::path & to) const @@ -146,7 +146,7 @@ public: }; #define BOOST_TEST_CONTEXT_VAR(VAR, EXPR) \ - BOOST_TEST_CONTEXT(#EXPR) for (auto VAR = EXPR, *__context__run = &VAR; __context__run; __context__run = NULL) + BOOST_TEST_CONTEXT(#EXPR) for (auto VAR = EXPR, *__context__run = &VAR; __context__run; __context__run = nullptr) BOOST_AUTO_TEST_CASE(refreshPackageTree) { @@ -228,7 +228,7 @@ create_initial_commit(git_repository * repo) BOOST_REQUIRE_EQUAL(0, git_repository_index(&index, repo)); BOOST_REQUIRE_EQUAL(0, git_index_write_tree(&tree_id, index)); BOOST_REQUIRE_EQUAL(0, git_tree_lookup(&tree, repo, &tree_id)); - BOOST_REQUIRE_EQUAL(0, git_commit_create_v(&commit_id, repo, "HEAD", sig, sig, NULL, "Initial commit", tree, 0)); + BOOST_REQUIRE_EQUAL(0, git_commit_create_v(&commit_id, repo, "HEAD", sig, sig, nullptr, "Initial commit", tree, 0)); git_index_free(index); git_tree_free(tree); @@ -250,8 +250,8 @@ BOOST_AUTO_TEST_CASE(testUpdateGitRepository) BOOST_REQUIRE_EQUAL(0, git_remote_create(&origin, repo, "origin", "http://git.randomdan.homeip.net/git/portage")); git_remote_free(origin); auto commitOid = create_initial_commit(repo); - char commit[GIT_OID_HEXSZ + 1]; - git_oid_tostr(commit, GIT_OID_HEXSZ, &commitOid); + std::array<char, GIT_OID_HEXSZ + 1> commit {}; + git_oid_tostr(commit.data(), commit.size(), &commitOid); git_repository_free(repo); git_libgit2_shutdown(); // Reference it @@ -261,7 +261,7 @@ BOOST_AUTO_TEST_CASE(testUpdateGitRepository) insRepo->bindParamS(1, testRepo.string()); insRepo->bindParamS(2, "origin"); insRepo->bindParamS(3, "master"); - insRepo->bindParamS(4, commit); + insRepo->bindParamS(4, commit.data()); insRepo->execute(); // Update diff --git a/gentoobrowse-api/unittests/testNotifications.cpp b/gentoobrowse-api/unittests/testNotifications.cpp index 1049b58..ff5bbc3 100644 --- a/gentoobrowse-api/unittests/testNotifications.cpp +++ b/gentoobrowse-api/unittests/testNotifications.cpp @@ -16,14 +16,14 @@ BOOST_GLOBAL_FIXTURE(Mail); BOOST_FIXTURE_TEST_SUITE(tp, TestClient); -bool +static bool isHtml(const std::string & body) { return body.find("<html") != std::string::npos; } -void -commonAssert(IceTray::Mail::EmailPtr e) +static void +commonAssert(const IceTray::Mail::EmailPtr & e) { auto body = std::dynamic_pointer_cast<IceTray::Mime::BasicMultiPart>(e->content); BOOST_REQUIRE(body); @@ -76,10 +76,12 @@ BOOST_AUTO_TEST_CASE(testSignup) } } +// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) BOOST_AUTO_TEST_CASE(testNews) { Gentoo::UserPtr u = std::make_shared<Gentoo::User>( 1, "testuser", "Test User", "test@user.com", "2017-10-01T12:34:56", IceUtil::None); + // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) Gentoo::NewsContent nc {{std::make_shared<Gentoo::Category>(1, "app-test", "Test cat1"s), std::make_shared<Gentoo::Category>(2, "sys-test", "Test cat2"s), std::make_shared<Gentoo::Category>(3, "no-show", "Unused cat"s)}, @@ -102,8 +104,7 @@ BOOST_AUTO_TEST_CASE(testNews) auto e = n->getNews(u, nc); commonAssert(e); lintable_test_files("news", e); - auto [plainPart, htmlPart] = humanReadableParts(e); - for (const auto text : {plainPart, htmlPart}) { + for (const auto text : humanReadableParts(e)) { BOOST_REQUIRE(text); BOOST_REQUIRE(text->payload.find("Latest news") != std::string::npos); BOOST_REQUIRE( @@ -112,6 +113,7 @@ BOOST_AUTO_TEST_CASE(testNews) != std::string::npos); BOOST_REQUIRE(text->payload.find("no-show") == std::string::npos); } + // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) } BOOST_AUTO_TEST_SUITE_END() diff --git a/gentoobrowse-api/unittests/testPortage.cpp b/gentoobrowse-api/unittests/testPortage.cpp index a530e34..ada192d 100644 --- a/gentoobrowse-api/unittests/testPortage.cpp +++ b/gentoobrowse-api/unittests/testPortage.cpp @@ -10,11 +10,10 @@ namespace std { ostream & operator<<(ostream & s, const Ice::optional<T> & o) { - if (o) - s << *o; - else - s << "-empty optional-"; - return s; + if (o) { + return s << *o; + } + return s << "-empty optional-"; } } diff --git a/gentoobrowse-api/util/update.cpp b/gentoobrowse-api/util/update.cpp index ab4d2a5..2af64a9 100644 --- a/gentoobrowse-api/util/update.cpp +++ b/gentoobrowse-api/util/update.cpp @@ -9,21 +9,23 @@ main(int c, char ** v) { std::string endpoint; bool background, tree, bugs, sendNotifications, pull; - po::options_description opts("Gentoo Browse Util::Update options"); - opts.add_options()("endpoint", po::value(&endpoint)->default_value("tcp -p 9001"), "Service endpoint")( - "background,b", po::value(&background)->default_value(false)->zero_tokens(), "Background")("bugs", - po::value(&bugs)->default_value(true), - "Update bugs")("tree", po::value(&tree)->default_value(true), "Update tree")( - "pull", po::value(&pull)->default_value(true), "Perform a git pull on repositories")("notifications", - po::value(&sendNotifications)->default_value(true), "Send notification emails")("help,h", "Show help"); - - po::variables_map vm; - po::store(po::command_line_parser(c, v).options(opts).run(), vm); - po::notify(vm); - - if (vm.count("help")) { - std::cerr << opts << std::endl; - exit(1); + { + po::options_description opts("Gentoo Browse Util::Update options"); + opts.add_options()("endpoint", po::value(&endpoint)->default_value("tcp -p 9001"), "Service endpoint")( + "background,b", po::value(&background)->default_value(false)->zero_tokens(), "Background")("bugs", + po::value(&bugs)->default_value(true), + "Update bugs")("tree", po::value(&tree)->default_value(true), "Update tree")( + "pull", po::value(&pull)->default_value(true), "Perform a git pull on repositories")("notifications", + po::value(&sendNotifications)->default_value(true), "Send notification emails")("help,h", "Show help"); + + po::variables_map vm; + po::store(po::command_line_parser(c, v).options(opts).run(), vm); + po::notify(vm); + + if (vm.count("help")) { + std::cerr << opts << std::endl; + exit(1); + } } auto ic = Ice::initialize(c, v); @@ -31,12 +33,15 @@ main(int c, char ** v) m->ice_ping(); std::vector<std::future<void>> jobs; - if (bugs) + if (bugs) { jobs.push_back(m->refreshBugsAsync()); - if (pull) + } + if (pull) { m->updateRepositories(); - if (tree) + } + if (tree) { jobs.push_back(m->refreshPackageTreeAsync()); + } int failures = 0; if (!background) { |