diff --git a/Crafter.Build-Configuration.cpp b/Crafter.Build-Configuration.cpp index 78a72db..b1e436d 100644 --- a/Crafter.Build-Configuration.cpp +++ b/Crafter.Build-Configuration.cpp @@ -80,7 +80,15 @@ Configuration::Configuration(const nlohmann::json& configs, const nlohmann::json outputDir = fullOutputPath.generic_string(); } else if(key == "dependencies") { for (auto it : val) { - dependencies.emplace_back(it["path"].get(), it["configuration"].get()); + std::string commit; + std::string branch; + if(it.contains("commit")){ + commit = it["commit"].get(); + } + if(it.contains("branch")){ + branch = it["branch"].get(); + } + dependencies.emplace_back(it["path"].get(), it["configuration"].get(), commit, branch); } } else if(key != "extends") { additionalProperties.insert({key, val}); diff --git a/Crafter.Build-Dependency.cpp b/Crafter.Build-Dependency.cpp index c697a94..539729f 100644 --- a/Crafter.Build-Dependency.cpp +++ b/Crafter.Build-Dependency.cpp @@ -23,6 +23,6 @@ module; module Crafter.Build; using namespace Crafter::Build; -Dependency::Dependency(std::string path, std::string configuration): path(path), configuration(configuration) { +Dependency::Dependency(std::string path, std::string configuration, std::string commit, std::string branch): path(path), configuration(configuration), commit(commit), branch(branch) { } diff --git a/Crafter.Build-Dependency.cppm b/Crafter.Build-Dependency.cppm index 9c8d381..6c97366 100644 --- a/Crafter.Build-Dependency.cppm +++ b/Crafter.Build-Dependency.cppm @@ -26,6 +26,8 @@ export namespace Crafter::Build { public: std::string path; std::string configuration; - Dependency(std::string path, std::string configuration); + std::string commit; + std::string branch; + Dependency(std::string path, std::string configuration, std::string commit, std::string branch); }; } diff --git a/Crafter.Build-Project.cpp b/Crafter.Build-Project.cpp index ae6512f..de91118 100644 --- a/Crafter.Build-Project.cpp +++ b/Crafter.Build-Project.cpp @@ -112,7 +112,17 @@ void Project::Build(Configuration config, fs::path outputDir, fs::path binDir) c for(std::int_fast32_t i = 0; i < depThreads.size(); i++) { if(config.dependencies[i].path.ends_with(".git")) { - system(std::format("cd {} && git clone {}", config.buildDir, config.dependencies[i].path).c_str()); + std::string branch; + if(!config.dependencies[i].branch.empty()) { + fs::path name = fs::path(config.dependencies[i].path).filename(); + name.replace_extension(); + branch = std::format(" && cd {} && git switch {}", name.generic_string(), config.dependencies[i].branch); + } else if(!config.dependencies[i].commit.empty()){ + fs::path name = fs::path(config.dependencies[i].path).filename(); + name.replace_extension(); + branch = std::format(" && cd {} && git checkout {}", name.generic_string(), config.dependencies[i].commit); + } + system(std::format("cd {} && git clone {}{}", config.buildDir, config.dependencies[i].path, branch).c_str()); config.dependencies[i].path = fs::path(config.dependencies[i].path).filename().replace_extension(); Project project = Project::LoadFromJSON(fs::path(config.buildDir)/config.dependencies[i].path/"project.json"); libs+=std::format(" -l{}", project.name);