-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.cpp
91 lines (83 loc) · 1.97 KB
/
filter.cpp
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "filter.h"
#include <mntent.h>
#include <iostream>
#include <boost/algorithm/string/predicate.hpp>
namespace Simplify {
void
Filter::initiailize(FilterOptions & o)
{
if (o.excludeMounts) {
addMountpoints();
}
for(auto & e : o.excludes) {
if (e.is_relative()) {
exclude.insert(std::filesystem::canonical(e));
}
else {
exclude.insert(remove_trailing_separator(e));
}
}
}
void
Filter::addMountpoints()
{
auto fh = setmntent("/proc/mounts", "r");
while (auto ent = getmntent(fh)) {
exclude.insert(ent->mnt_dir);
}
endmntent(fh);
}
void
Filter::filterStream(std::istream & input, std::ostream & output) const
{
std::string pathInput;
while (!std::getline(input, pathInput).eof()) {
Path path(pathInput);
if (accept(remove_trailing_separator(path))) {
output << path.string() << std::endl;
}
}
}
void
Filter::find(const Path & root, std::ostream & output) const
{
if (exclude.find(root) == exclude.end()) {
if (!pathPrefixesExclusion(root)) {
output << root.string() << std::endl;
return;
}
for (std::filesystem::directory_iterator p(root); p != std::filesystem::directory_iterator(); p++) {
auto & ip = *p;
if (std::filesystem::is_directory(ip)) {
find(ip, output);
}
else {
output << ip.path().string() << std::endl;
}
}
}
}
bool
Filter::accept(const Path & path) const
{
if (!pathPrefixesExclusion(path) && !pathPrefixesAccepted(path)) {
accepted.insert(path);
return true;
}
return false;
}
bool
Filter::pathPrefixesExclusion(const Path & path) const
{
return std::find_if(exclude.begin(), exclude.end(), [&path](const auto & entity) {
return boost::algorithm::starts_with(entity, path);
}) != exclude.end();
}
bool
Filter::pathPrefixesAccepted(const Path & path) const
{
return std::find_if(accepted.begin(), accepted.end(), [&path](const auto & entity) {
return boost::algorithm::starts_with(path, entity);
}) != accepted.end();
}
}