SlHelpers
Loading...
Searching...
No Matches
Stanza.h
1// SPDX-License-Identifier: GPL-2.0-only
2
3#pragma once
4
5#include <filesystem>
6#include <functional>
7#include <iostream>
8#include <numeric>
9#include <set>
10#include <vector>
11
12#include "Pattern.h"
13#include "Person.h"
14
15namespace SlKernCVS {
16
23class Stanza {
24public:
26 using TranslateEmail = std::function<std::string (std::string_view sv)>;
28 using Maintainers = std::vector<Person>;
29
30 Stanza() = default;
35 Stanza(std::string name) : m_name(std::move(name)) {}
42 Stanza(std::string n, std::string name, std::string email)
43 : m_name(std::move(n)), m_maintainers{Person(RoleType::Maintainer, std::move(name),
44 std::move(email))} { }
45
46 Stanza(const Stanza &) = delete;
48 Stanza(Stanza &&) = default;
49
55 unsigned match_path(const std::filesystem::path &path) const {
56 return std::accumulate(m_patterns.cbegin(), m_patterns.cend(), 0u,
57 [&path](unsigned m, const Pattern &p) {
58 return std::max(m, p.match(path));
59 });
60 }
61
68 void add_maintainer_and_store(std::string_view maintainer,
69 std::set<std::string> &suse_users,
70 const TranslateEmail &translateEmail) {
71 if (auto m = Person::parsePerson(maintainer, RoleType::Maintainer)) {
72 suse_users.insert(m->userName());
73 // TODO
74 m->setEmail(translateEmail(m->email()));
75 // END TODO
76 m_maintainers.push_back(std::move(*m));
77 } else
78 std::cerr << "MAINTAINERS: contact " << maintainer <<
79 " cannot be parsed into name and email!\n";
80 }
81
89 void add_backporter(const std::string &name, std::string_view email,
90 unsigned cnt, const TranslateEmail &translateEmail) {
91 m_maintainers.push_back(Person(RoleType::Maintainer, name,
92 /*TODO*/ translateEmail(email), cnt));
93 }
94
101 void add_maintainer_if(std::string_view maintainer,
102 const std::set<std::string> &suse_users,
103 const TranslateEmail &translateEmail) {
104 if (auto m = Person::parsePerson(maintainer, RoleType::Upstream)) {
105 // TODO
106 m->setEmail(translateEmail(m->email()));
107 // END TODO
108 if (suse_users.contains(m->userName()))
109 m_maintainers.push_back(std::move(*m));
110 } else
111 std::cerr << "Upstream MAINTAINERS: contact " << maintainer <<
112 " cannot be parsed into name and email!\n";
113 }
114
120 bool add_pattern(std::string pattern) {
121 auto p = Pattern::create(std::move(pattern));
122 if (!p)
123 return false;
124 m_patterns.push_back(std::move(*p));
125 return true;
126 }
127
129 bool empty() const {
130 return m_name.empty() || m_maintainers.empty() || m_patterns.empty();
131 }
132
137 const Maintainers &maintainers() const { return m_maintainers; }
138
145 void new_entry(std::string n) {
146 m_name = std::move(n);
147 m_maintainers.clear();
148 m_patterns.clear();
149 }
150
152 const std::string &name() const { return m_name; }
153private:
154 std::string m_name;
155 Maintainers m_maintainers;
156 std::vector<Pattern> m_patterns;
157};
158
159} // namespace
Loads and holds information from both Linux and SUSE MAINTAINERS files.
Definition Maintainers.h:19
Information about a person (such as username, e-mail, Role).
Definition Person.h:81
static std::optional< Person > parsePerson(std::string_view src, Role role)
Parse src into a Person.
Stanza (a subsystem) from MAINTAINERS file.
Definition Stanza.h:23
bool add_pattern(std::string pattern)
Add pattern to this Stanza.
Definition Stanza.h:120
std::vector< Person > Maintainers
Maintainers are a list of Person.
Definition Stanza.h:28
Stanza(std::string n, std::string name, std::string email)
Construct new Stanza called n with one Person (having name and email).
Definition Stanza.h:42
Stanza(Stanza &&)=default
Move constructor.
const std::string & name() const
Get name/title of this Stanza.
Definition Stanza.h:152
unsigned match_path(const std::filesystem::path &path) const
Return weight of path in this Stanza.
Definition Stanza.h:55
Stanza(std::string name)
Construct new Stanza called name.
Definition Stanza.h:35
void new_entry(std::string n)
Reset Stanza and start from the beginning.
Definition Stanza.h:145
const Maintainers & maintainers() const
Obtain a list of Person in this Stanza.
Definition Stanza.h:137
std::function< std::string(std::string_view sv)> TranslateEmail
Callback to translate an e-mail.
Definition Stanza.h:26
void add_maintainer_if(std::string_view maintainer, const std::set< std::string > &suse_users, const TranslateEmail &translateEmail)
Add a maintainer (as Upstream) if in suse_users.
Definition Stanza.h:101
bool empty() const
Check if this Stanza has no name, maintainers, and patterns.
Definition Stanza.h:129
void add_maintainer_and_store(std::string_view maintainer, std::set< std::string > &suse_users, const TranslateEmail &translateEmail)
Add a maintainer (as Maintainer) and store them into SUSE users set too.
Definition Stanza.h:68
void add_backporter(const std::string &name, std::string_view email, unsigned cnt, const TranslateEmail &translateEmail)
Creates a Person and adds it as Maintainer.
Definition Stanza.h:89
Holds git patterns and reports weights if matched.
Definition Pattern.h:16
static std::optional< Pattern > create(std::string pattern)
Build a (git) Pattern.