1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include "package.h"
#include <filesystem>
namespace katja
{
package::package(const std::string& name, const std::string& version,
const std::string& architecture, const std::string& tag)
: m_name(name), m_version(version), m_architecture(architecture), m_tag(tag)
{
}
const std::string& package::name() const noexcept
{
return m_name;
}
const std::string& package::version() const noexcept
{
return m_version;
}
const std::string& package::architecture() const noexcept
{
return m_architecture;
}
const std::string& package::tag() const noexcept
{
return m_tag;
}
std::optional<package> package::parse(const std::string& full_name) noexcept
{
std::size_t tag_separator = full_name.find_last_of('-');
if (tag_separator == std::string::npos || tag_separator == 0)
{
return std::nullopt;
}
std::size_t architecture_separator = full_name.find_last_of('-', tag_separator - 1);
if (architecture_separator == std::string::npos || architecture_separator == 0)
{
return std::nullopt;
}
std::size_t version_separator = full_name.find_last_of('-', architecture_separator - 1);
if (version_separator == std::string::npos || version_separator == 0)
{
return std::nullopt;
}
package parsed_package{
full_name.substr(0, version_separator),
full_name.substr(version_separator + 1, architecture_separator - version_separator - 1),
full_name.substr(architecture_separator + 1, tag_separator - architecture_separator - 1),
full_name.substr(tag_separator + 1)
};
return std::make_optional(parsed_package);
}
std::unordered_map<std::string, package> read_package_database()
{
std::unordered_map<std::string, package> packages;
for (const auto& entry : std::filesystem::directory_iterator("/var/lib/pkgtools/packages"))
{
std::optional<package> maybe_package = package::parse(entry.path().filename());
if (maybe_package.has_value())
{
packages.insert_or_assign(maybe_package.value().name(), maybe_package.value());
}
}
return packages;
}
}
|