Skip to content

Commit b6df706

Browse files
committed
recursive repository, works
1 parent 3f3e8d9 commit b6df706

File tree

7 files changed

+44
-13
lines changed

7 files changed

+44
-13
lines changed

CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ add_library(hk_objects OBJECT
5454
"${CMAKE_CURRENT_SOURCE_DIR}/src/error/error_list.hpp"
5555
"${CMAKE_CURRENT_SOURCE_DIR}/src/error/error_location.hpp"
5656
"${CMAKE_CURRENT_SOURCE_DIR}/src/error/errors.hpp"
57-
"${CMAKE_CURRENT_SOURCE_DIR}/src/error/make_error.hpp"
5857
"${CMAKE_CURRENT_SOURCE_DIR}/src/parser/consume.hpp"
5958
"${CMAKE_CURRENT_SOURCE_DIR}/src/parser/parse_fqname.cpp"
6059
"${CMAKE_CURRENT_SOURCE_DIR}/src/parser/parse_import_declaration.cpp"
@@ -100,18 +99,22 @@ add_library(hk_objects OBJECT
10099
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/file.cpp"
101100
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/file.hpp"
102101
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/fixed_fifo.hpp"
102+
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/fixed_string.hpp"
103103
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/fqname.hpp"
104104
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/generator.hpp"
105105
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/git_error.cpp"
106106
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/git_error.hpp"
107107
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/git.cpp"
108108
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/git.hpp"
109+
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/interned.hpp"
110+
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/lazy_vector.hpp"
109111
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/log.cpp"
110112
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/log.hpp"
111113
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/module.cpp"
112114
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/module.hpp"
113115
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/path.cpp"
114116
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/path.hpp"
117+
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/repository_flags.hpp"
115118
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/repository_url.cpp"
116119
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/repository_url.hpp"
117120
"${CMAKE_CURRENT_SOURCE_DIR}/src/utility/semantic_version.cpp"

src/error/errors.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ E(missing_import_mod_declaration_as_name, "E0011: Expected a name after 'as' key
2020
E(missing_import_mod_declaration_name, "E0012: Expected fully qualified name after 'import' keyword in a import-declaration.");
2121
E(missing_import_declaration_semicolon, "E0013: Expected ';' after a import-declaration.");
2222
E(missing_fqname_identifier_after_dot, "E0014: Expected identifier after '.' in fully qualified name.");
23-
E(could_not_clone_repository, "E0015: Could not clone repository '{}' rev '{}': {}.");
23+
E(could_not_clone_repository, "E0015: Could not clone repository '{}' rev '{}' into '{}': {}.");
2424
}
2525

2626
namespace hk::warning {

src/repository/repository.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,14 @@ error_code repository::recursive_scan_prologues(repository_flags flags)
8181
todo.insert(std::move(item));
8282
}
8383

84-
auto hkdeps = _path / "_hkdeps";
84+
auto hkdeps_path = _path / "_hkdeps";
85+
86+
auto ec = std::error_code{};
87+
if (not std::filesystem::create_directory(hkdeps_path, ec) and ec) {
88+
std::println(stderr, "Error: could not create directory '{}': {}.", hkdeps_path.string(), ec.message());
89+
std::terminate();
90+
}
91+
8592
while (not todo.empty()) {
8693
auto child_repo_url_node = todo.extract(todo.begin());
8794
auto [it, inserted, _] = done.insert(std::move(child_repo_url_node));
@@ -90,11 +97,12 @@ error_code repository::recursive_scan_prologues(repository_flags flags)
9097
}
9198

9299
assert(it != done.end());
93-
auto child_repo_path = hkdeps / it->first.directory();
100+
auto child_repo_path = hkdeps_path / it->first.directory();
94101
auto &child_repo = get_child_repository(it->first);
95102
if (not child_repo.repository) {
96103
if (auto r = git_checkout_or_clone(it->first, child_repo_path, flags); r != git_error::ok) {
97-
return xxxxxxxxxxxxxxx needs destination directory in message it->second.add(error::could_not_clone_repository, it->first.url(), it->first.rev(), r).error();
104+
auto short_hkdeps = std::format("_hkdeps/{}", it->first.directory());
105+
return it->second.add(error::could_not_clone_repository, it->first.url(), it->first.rev(), short_hkdeps, r).error();
98106
}
99107

100108
child_repo.repository = std::make_unique<repository>(child_repo_path);
@@ -105,9 +113,12 @@ error_code repository::recursive_scan_prologues(repository_flags flags)
105113
}
106114
}
107115

108-
// Remove internal repositories not in done.
116+
// Remove internal repositories not in 'done'.
117+
std::erase_if(_child_repositories, [&](auto const& item) {
118+
return not done.contains(item.url);
119+
});
109120

110-
return error_code{};
121+
return hk::error_code{};
111122
}
112123

113124
void repository::untouch(bool remove)

src/repository/repository_tests.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
#include "utility/unit_test.hpp"
33
#include <hikotest/hikotest.hpp>
44
#include <ranges>
5+
#include <filesystem>
56

67
TEST_SUITE(repository_suite)
78
{
89

910
TEST_CASE(single_repository_scan)
1011
{
1112
auto test_data_path = hk::test_data_path();
12-
auto repository_path = std::filesystem::canonical(test_data_path / "prologue_scan" / "root");
13+
auto repository_path = std::filesystem::canonical(test_data_path / "single_repository_scan");
1314
auto repository = hk::repository{repository_path};
1415
repository.scan_prologues(hk::repository_flags{});
1516

@@ -19,5 +20,16 @@ TEST_CASE(single_repository_scan)
1920
REQUIRE(urls[0].first.rev() == "main");
2021
}
2122

23+
TEST_CASE(recursive_repository_scan)
24+
{
25+
auto test_data_path = hk::test_data_path();
26+
auto repository_path = std::filesystem::canonical(test_data_path / "recursive_repository_scan");
27+
auto repository = hk::repository{repository_path};
28+
29+
std::filesystem::remove_all(repository_path / "_hkdeps");
30+
auto error = repository.recursive_scan_prologues(hk::repository_flags{});
31+
REQUIRE(error.kind == '\0');
32+
REQUIRE(error.code == 0);
33+
}
2234

2335
};

test_data/prologue_scan/root/main.hkm

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
module nl.hikolang.recursive_repository_scan.main application "psmain"
3+
4+
import git "https://github.com/hikogui/hikolang-test-a.git" "main"
5+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
module nl.hikolang.single_repository_scan.main application "psmain"
3+
4+
import git "https://github.com/hikogui/hikolang-test-a.git" "main"
5+

0 commit comments

Comments
 (0)