Skip to content

Commit ed6470e

Browse files
author
basil-shuman
committed
feat userver: refactor ReadRecursiveFilesInfoWithData method
Tests: checked in gtests commit_hash:2177960320dcdda692eb0146f30b532ff6502991
1 parent aa05cad commit ed6470e

File tree

11 files changed

+307
-70
lines changed

11 files changed

+307
-70
lines changed

.mapping.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1701,7 +1701,6 @@
17011701
"core/src/formats/json/stack_overflow_test.cpp":"taxi/uservices/userver/core/src/formats/json/stack_overflow_test.cpp",
17021702
"core/src/fs/fs_cache_client.cpp":"taxi/uservices/userver/core/src/fs/fs_cache_client.cpp",
17031703
"core/src/fs/read.cpp":"taxi/uservices/userver/core/src/fs/read.cpp",
1704-
"core/src/fs/read_test.cpp":"taxi/uservices/userver/core/src/fs/read_test.cpp",
17051704
"core/src/fs/temp_file.cpp":"taxi/uservices/userver/core/src/fs/temp_file.cpp",
17061705
"core/src/fs/temp_file_test.cpp":"taxi/uservices/userver/core/src/fs/temp_file_test.cpp",
17071706
"core/src/fs/write.cpp":"taxi/uservices/userver/core/src/fs/write.cpp",
@@ -5224,6 +5223,9 @@
52245223
"universal/include/userver/fs/blocking/temp_directory.hpp":"taxi/uservices/userver/universal/include/userver/fs/blocking/temp_directory.hpp",
52255224
"universal/include/userver/fs/blocking/temp_file.hpp":"taxi/uservices/userver/universal/include/userver/fs/blocking/temp_file.hpp",
52265225
"universal/include/userver/fs/blocking/write.hpp":"taxi/uservices/userver/universal/include/userver/fs/blocking/write.hpp",
5226+
"universal/include/userver/fs/file_info_with_data.hpp":"taxi/uservices/userver/universal/include/userver/fs/file_info_with_data.hpp",
5227+
"universal/include/userver/fs/path_utils.hpp":"taxi/uservices/userver/universal/include/userver/fs/path_utils.hpp",
5228+
"universal/include/userver/fs/settings_read_file.hpp":"taxi/uservices/userver/universal/include/userver/fs/settings_read_file.hpp",
52275229
"universal/include/userver/hostinfo/blocking/get_hostname.hpp":"taxi/uservices/userver/universal/include/userver/hostinfo/blocking/get_hostname.hpp",
52285230
"universal/include/userver/hostinfo/blocking/read_groups.hpp":"taxi/uservices/userver/universal/include/userver/hostinfo/blocking/read_groups.hpp",
52295231
"universal/include/userver/hostinfo/cpu_limit.hpp":"taxi/uservices/userver/universal/include/userver/hostinfo/cpu_limit.hpp",
@@ -5490,12 +5492,15 @@
54905492
"universal/src/fs/blocking/file_descriptor.cpp":"taxi/uservices/userver/universal/src/fs/blocking/file_descriptor.cpp",
54915493
"universal/src/fs/blocking/file_descriptor_test.cpp":"taxi/uservices/userver/universal/src/fs/blocking/file_descriptor_test.cpp",
54925494
"universal/src/fs/blocking/read.cpp":"taxi/uservices/userver/universal/src/fs/blocking/read.cpp",
5495+
"universal/src/fs/blocking/read_test.cpp":"taxi/uservices/userver/universal/src/fs/blocking/read_test.cpp",
54935496
"universal/src/fs/blocking/temp_directory.cpp":"taxi/uservices/userver/universal/src/fs/blocking/temp_directory.cpp",
54945497
"universal/src/fs/blocking/temp_directory_test.cpp":"taxi/uservices/userver/universal/src/fs/blocking/temp_directory_test.cpp",
54955498
"universal/src/fs/blocking/temp_file.cpp":"taxi/uservices/userver/universal/src/fs/blocking/temp_file.cpp",
54965499
"universal/src/fs/blocking/temp_file_test.cpp":"taxi/uservices/userver/universal/src/fs/blocking/temp_file_test.cpp",
54975500
"universal/src/fs/blocking/write.cpp":"taxi/uservices/userver/universal/src/fs/blocking/write.cpp",
54985501
"universal/src/fs/blocking/write_test.cpp":"taxi/uservices/userver/universal/src/fs/blocking/write_test.cpp",
5502+
"universal/src/fs/path_utils.cpp":"taxi/uservices/userver/universal/src/fs/path_utils.cpp",
5503+
"universal/src/fs/path_utils_test.cpp":"taxi/uservices/userver/universal/src/fs/path_utils_test.cpp",
54995504
"universal/src/hostinfo/blocking/get_hostname.cpp":"taxi/uservices/userver/universal/src/hostinfo/blocking/get_hostname.cpp",
55005505
"universal/src/hostinfo/blocking/get_hostname_test.cpp":"taxi/uservices/userver/universal/src/hostinfo/blocking/get_hostname_test.cpp",
55015506
"universal/src/hostinfo/blocking/read_groups.cpp":"taxi/uservices/userver/universal/src/hostinfo/blocking/read_groups.cpp",

core/include/userver/fs/read.hpp

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,18 @@
33
/// @file userver/fs/read.hpp
44
/// @brief functions for asynchronous file read operations
55

6-
#include <memory>
76
#include <string>
8-
#include <unordered_map>
97

108
#include <userver/engine/task/task_processor_fwd.hpp>
11-
#include <userver/utils/flags.hpp>
9+
#include <userver/fs/file_info_with_data.hpp>
10+
#include <userver/fs/path_utils.hpp>
11+
#include <userver/fs/settings_read_file.hpp>
1212

1313
USERVER_NAMESPACE_BEGIN
1414

1515
/// @brief filesystem support
1616
namespace fs {
1717

18-
/// @brief Struct file with load data
19-
struct FileInfoWithData {
20-
std::string data;
21-
std::string extension;
22-
};
23-
24-
using FileInfoWithDataConstPtr = std::shared_ptr<const FileInfoWithData>;
25-
using FileInfoWithDataMap = std::unordered_map<std::string, FileInfoWithDataConstPtr>;
26-
27-
enum class SettingsReadFile {
28-
kNone = 0,
29-
/// Skip hidden files,
30-
kSkipHidden = 1 << 0,
31-
};
32-
33-
/// @brief Returns relative path from full path
34-
/// @param path full path, must start with `dir`
35-
/// @param dir directory path to get relative path
36-
/// @note it does not access filesystem, the relative path is calculated
37-
/// lexically.
38-
std::string GetLexicallyRelative(std::string_view path, std::string_view dir);
39-
4018
/// @brief Returns files from recursively traversed directory
4119
/// @param async_tp TaskProcessor for synchronous waiting
4220
/// @param path to directory to traverse recursively
@@ -47,7 +25,7 @@ std::string GetLexicallyRelative(std::string_view path, std::string_view dir);
4725
FileInfoWithDataMap ReadRecursiveFilesInfoWithData(
4826
engine::TaskProcessor& async_tp,
4927
const std::string& path,
50-
utils::Flags<SettingsReadFile> flags = {SettingsReadFile::kSkipHidden}
28+
SettingReadFileFlags flags = {SettingsReadFile::kSkipHidden}
5129
);
5230

5331
/// @brief Reads file contents asynchronously

core/src/fs/read.cpp

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,22 @@
11
#include <userver/fs/read.hpp>
22

3-
#include <boost/filesystem.hpp>
4-
53
#include <userver/engine/async.hpp>
64
#include <userver/fs/blocking/read.hpp>
7-
#include <userver/utils/async.hpp>
85

96
USERVER_NAMESPACE_BEGIN
107

118
namespace fs {
129

13-
namespace {
14-
15-
bool IsHiddenFile(const boost::filesystem::path& path) {
16-
auto name = path.filename().native();
17-
UASSERT(!name.empty());
18-
return name != ".." && name != "." && name[0] == '.';
19-
}
20-
21-
} // namespace
22-
23-
std::string GetLexicallyRelative(std::string_view path, std::string_view dir) {
24-
UASSERT(dir.size() < path.size());
25-
UASSERT(path.substr(0, dir.size()) == dir);
26-
auto rel = path.substr(dir.size());
27-
return std::string{rel};
28-
}
29-
3010
std::string ReadFileContents(engine::TaskProcessor& async_tp, const std::string& path) {
3111
return engine::AsyncNoSpan(async_tp, &fs::blocking::ReadFileContents, path).Get();
3212
}
3313

3414
FileInfoWithDataMap ReadRecursiveFilesInfoWithData(
3515
engine::TaskProcessor& async_tp,
3616
const std::string& path,
37-
utils::Flags<SettingsReadFile> flags
17+
SettingReadFileFlags flags
3818
) {
39-
FileInfoWithDataMap data{};
40-
for (auto it =
41-
utils::Async(async_tp, "init", [&path] { return boost::filesystem::recursive_directory_iterator(path); })
42-
.Get();
43-
it != boost::filesystem::recursive_directory_iterator();
44-
utils::Async(async_tp, "next", [&it] { ++it; }).Get())
45-
{
46-
// only files
47-
if (it->status().type() != boost::filesystem::regular_file) {
48-
continue;
49-
}
50-
if ((flags & SettingsReadFile::kSkipHidden) && IsHiddenFile(it->path())) {
51-
continue;
52-
}
53-
FileInfoWithData info{};
54-
info.extension = it->path().extension().string();
55-
info.data = ReadFileContents(async_tp, it->path().string());
56-
data[GetLexicallyRelative(it->path().string(), path)] = std::make_shared<const FileInfoWithData>(std::move(info)
57-
);
58-
}
59-
return data;
19+
return engine::AsyncNoSpan(async_tp, &fs::blocking::ReadRecursiveFilesInfoWithData, std::cref(path), flags).Get();
6020
}
6121

6222
bool FileExists(engine::TaskProcessor& async_tp, const std::string& path) {

universal/include/userver/fs/blocking/read.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include <string>
88

9+
#include <userver/fs/file_info_with_data.hpp>
10+
#include <userver/fs/settings_read_file.hpp>
911
#include <userver/utils/boost_filesystem_file_status.hpp>
1012

1113
USERVER_NAMESPACE_BEGIN
@@ -37,6 +39,14 @@ bool FileExists(const std::string& path);
3739
/// @throws std::runtime_error if something goes wrong
3840
boost::filesystem::file_type GetFileType(const std::string& path);
3941

42+
/// @brief Returns files from recursively traversed directory
43+
/// @param path to directory to traverse recursively
44+
/// @param flags settings read files
45+
/// @returns map with relative to `path` filepaths and file info
46+
/// @throws std::runtime_error if read fails for any reason (e.g. no such file,
47+
/// read error, etc.),
48+
FileInfoWithDataMap ReadRecursiveFilesInfoWithData(const std::string& path, SettingReadFileFlags flags);
49+
4050
} // namespace fs::blocking
4151

4252
USERVER_NAMESPACE_END
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
/// @file userver/fs/file_info_with_data.hpp
4+
/// @brief data structures to store file info with load data
5+
6+
#include <memory>
7+
#include <string>
8+
#include <unordered_map>
9+
10+
USERVER_NAMESPACE_BEGIN
11+
12+
/// @brief filesystem support
13+
namespace fs {
14+
15+
/// @brief Struct file with load data
16+
struct FileInfoWithData {
17+
std::string data;
18+
std::string extension;
19+
};
20+
21+
using FileInfoWithDataConstPtr = std::shared_ptr<const FileInfoWithData>;
22+
using FileInfoWithDataMap = std::unordered_map<std::string, FileInfoWithDataConstPtr>;
23+
24+
} // namespace fs
25+
26+
USERVER_NAMESPACE_END
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
/// @file userver/fs/path_utils.hpp
4+
/// @brief file path operations and utilities
5+
6+
#include <string>
7+
8+
USERVER_NAMESPACE_BEGIN
9+
10+
/// @brief filesystem support
11+
namespace fs {
12+
13+
/// @brief Returns relative path from full path
14+
/// @param path full path, must start with `dir`
15+
/// @param dir directory path to get relative path
16+
/// @note it does not access filesystem, the relative path is calculated
17+
/// lexically.
18+
std::string GetLexicallyRelative(std::string_view path, std::string_view dir);
19+
20+
} // namespace fs
21+
22+
USERVER_NAMESPACE_END
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include <userver/utils/flags.hpp>
4+
5+
/// @file userver/fs/settings_read_file.hpp
6+
/// @brief settings flags for directory recursive read operations
7+
8+
USERVER_NAMESPACE_BEGIN
9+
10+
namespace fs {
11+
12+
/// @brief filesystem support
13+
enum class SettingsReadFile {
14+
kNone = 0,
15+
/// Skip hidden files,
16+
kSkipHidden = 1 << 0,
17+
};
18+
19+
using SettingReadFileFlags = utils::Flags<SettingsReadFile>;
20+
21+
} // namespace fs
22+
23+
USERVER_NAMESPACE_END

universal/src/fs/blocking/read.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
11
#include <userver/fs/blocking/read.hpp>
2+
#include <userver/fs/path_utils.hpp>
3+
#include <userver/utils/assert.hpp>
24

35
#include <fstream>
46
#include <sstream>
57

8+
#include <boost/filesystem/directory.hpp>
69
#include <boost/filesystem/operations.hpp>
710

811
USERVER_NAMESPACE_BEGIN
912

1013
namespace fs::blocking {
1114

15+
namespace {
16+
17+
bool IsHiddenFile(const boost::filesystem::path& path) {
18+
auto name = path.filename().native();
19+
UASSERT(!name.empty());
20+
return name != ".." && name != "." && name[0] == '.';
21+
}
22+
23+
} // namespace
24+
1225
std::string ReadFileContents(const std::string& path) {
1326
const std::ifstream ifs(path);
1427
if (!ifs) {
@@ -24,6 +37,28 @@ bool FileExists(const std::string& path) { return boost::filesystem::exists(path
2437

2538
boost::filesystem::file_type GetFileType(const std::string& path) { return boost::filesystem::status(path).type(); }
2639

40+
FileInfoWithDataMap ReadRecursiveFilesInfoWithData(const std::string& path, utils::Flags<SettingsReadFile> flags) {
41+
FileInfoWithDataMap data{};
42+
for (auto it = boost::filesystem::recursive_directory_iterator(path);
43+
it != boost::filesystem::recursive_directory_iterator();
44+
++it)
45+
{
46+
// only files
47+
if (it->status().type() != boost::filesystem::regular_file) {
48+
continue;
49+
}
50+
if ((flags & SettingsReadFile::kSkipHidden) && IsHiddenFile(it->path())) {
51+
continue;
52+
}
53+
FileInfoWithData info{};
54+
info.extension = it->path().extension().string();
55+
info.data = ReadFileContents(it->path().string());
56+
data[GetLexicallyRelative(it->path().string(), path)] = std::make_shared<const FileInfoWithData>(std::move(info)
57+
);
58+
}
59+
return data;
60+
}
61+
2762
} // namespace fs::blocking
2863

2964
USERVER_NAMESPACE_END

0 commit comments

Comments
 (0)