SlHelpers
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 <string>
11 #include <vector>
12 
13 #include "Pattern.h"
14 #include "Person.h"
15 
16 namespace SlKernCVS {
17 
24 class Stanza {
25 public:
27  using TranslateEmail = std::function<std::string (std::string_view sv)>;
29  using Maintainers = std::vector<Person>;
30 
31  Stanza() = default;
36  Stanza(std::string name) : m_name(std::move(name)) {}
43  Stanza(std::string n, std::string name, std::string email)
44  : m_name(std::move(n)), m_maintainers{Person(RoleType::Maintainer, std::move(name),
45  std::move(email))} { }
46 
47  Stanza(const Stanza &) = delete;
49  Stanza(Stanza &&) = default;
50 
56  unsigned match_path(const std::filesystem::path &path) const {
57  return std::accumulate(m_patterns.cbegin(), m_patterns.cend(), 0u,
58  [&path](unsigned m, const Pattern &p) {
59  return std::max(m, p.match(path));
60  });
61  }
62 
69  void add_maintainer_and_store(std::string_view maintainer,
70  std::set<std::string> &suse_users,
71  const TranslateEmail &translateEmail) {
72  if (auto m = Person::parsePerson(maintainer, RoleType::Maintainer)) {
73  suse_users.insert(m->userName());
74  // TODO
75  m->setEmail(translateEmail(m->email()));
76  // END TODO
77  m_maintainers.push_back(std::move(*m));
78  } else
79  std::cerr << "MAINTAINERS: contact " << maintainer <<
80  " cannot be parsed into name and email!\n";
81  }
82 
90  void add_backporter(const std::string &name, std::string_view email,
91  unsigned cnt, const TranslateEmail &translateEmail) {
92  m_maintainers.push_back(Person(RoleType::Maintainer, name,
93  /*TODO*/ translateEmail(email), cnt));
94  }
95 
102  void add_maintainer_if(std::string_view maintainer,
103  const std::set<std::string> &suse_users,
104  const TranslateEmail &translateEmail) {
105  if (auto m = Person::parsePerson(maintainer, RoleType::Upstream)) {
106  // TODO
107  m->setEmail(translateEmail(m->email()));
108  // END TODO
109  if (suse_users.contains(m->userName()))
110  m_maintainers.push_back(std::move(*m));
111  } else
112  std::cerr << "Upstream MAINTAINERS: contact " << maintainer <<
113  " cannot be parsed into name and email!\n";
114  }
115 
120  void add_comment(std::string comment) {
121  m_comments.emplace_back(std::move(comment));
122  }
123 
129  bool add_pattern(std::string pattern) {
130  auto p = Pattern::create(std::move(pattern));
131  if (!p)
132  return false;
133  m_patterns.push_back(std::move(*p));
134  return true;
135  }
136 
138  bool empty() const {
139  return m_name.empty() || m_maintainers.empty() || m_patterns.empty();
140  }
141 
146  const Maintainers &maintainers() const { return m_maintainers; }
147 
149  auto &comments() const { return m_comments; }
150 
152  const std::string &name() const { return m_name; }
153 private:
154  std::string m_name;
155  Maintainers m_maintainers;
156  std::vector<std::string> m_comments;
157  std::vector<Pattern> m_patterns;
158 };
159 
160 } // namespace
static std::optional< Pattern > create(std::string pattern)
Build a (git) Pattern.
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:102
bool empty() const
Check if this Stanza has no name, maintainers, and patterns.
Definition: Stanza.h:138
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:24
Holds git patterns and reports weights if matched.
Definition: Pattern.h:16
unsigned match_path(const std::filesystem::path &path) const
Return weight of path in this Stanza.
Definition: Stanza.h:56
std::function< std::string(std::string_view sv)> TranslateEmail
Callback to translate an e-mail.
Definition: Stanza.h:27
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:90
void add_comment(std::string comment)
Add comment to this Stanza.
Definition: Stanza.h:120
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:43
bool add_pattern(std::string pattern)
Add pattern to this Stanza.
Definition: Stanza.h:129
Loads and holds information from both Linux and SUSE MAINTAINERS files.
Definition: Maintainers.h:23
std::vector< Person > Maintainers
Maintainers are a list of Person.
Definition: Stanza.h:29
const std::string & name() const
Get name/title of this Stanza.
Definition: Stanza.h:152
auto & comments() const
Get comment of this Stanza.
Definition: Stanza.h:149
Definition: Branches.h:15
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:69
Information about a person (such as username, e-mail, Role)
Definition: Person.h:81
Stanza(std::string name)
Construct new Stanza called name.
Definition: Stanza.h:36
const Maintainers & maintainers() const
Obtain a list of Person in this Stanza.
Definition: Stanza.h:146