diff --git a/CMakeLists.txt b/CMakeLists.txt index a9a266b..1165dbd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,8 @@ set(GIT2CPP_SRC ${GIT2CPP_SOURCE_DIR}/subcommand/remote_subcommand.hpp ${GIT2CPP_SOURCE_DIR}/subcommand/reset_subcommand.cpp ${GIT2CPP_SOURCE_DIR}/subcommand/reset_subcommand.hpp + ${GIT2CPP_SOURCE_DIR}/subcommand/revparse_subcommand.cpp + ${GIT2CPP_SOURCE_DIR}/subcommand/revparse_subcommand.hpp ${GIT2CPP_SOURCE_DIR}/subcommand/status_subcommand.cpp ${GIT2CPP_SOURCE_DIR}/subcommand/status_subcommand.hpp ${GIT2CPP_SOURCE_DIR}/utils/ansi_code.cpp diff --git a/src/main.cpp b/src/main.cpp index 7b52301..bbdbcef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ #include "subcommand/remote_subcommand.hpp" #include "subcommand/reset_subcommand.hpp" #include "subcommand/status_subcommand.hpp" +#include "subcommand/revparse_subcommand.hpp" int main(int argc, char** argv) { @@ -44,6 +45,7 @@ int main(int argc, char** argv) merge_subcommand merge(lg2_obj, app); push_subcommand push(lg2_obj, app); remote_subcommand remote(lg2_obj, app); + revparse_subcommand rev(lg2_obj, app); app.require_subcommand(/* min */ 0, /* max */ 1); diff --git a/src/subcommand/revparse_subcommand.cpp b/src/subcommand/revparse_subcommand.cpp new file mode 100644 index 0000000..0d58f15 --- /dev/null +++ b/src/subcommand/revparse_subcommand.cpp @@ -0,0 +1,28 @@ +#include "revparse_subcommand.hpp" +#include "../wrapper/repository_wrapper.hpp" +#include +#include + +revparse_subcommand::revparse_subcommand(const libgit2_object&, CLI::App& app) +{ + auto* sub = app.add_subcommand("rev-parse", "Pick out and message parameters"); + + sub->add_flag("--is-bare-repository", m_is_bare_repository_flag); + + sub->callback([this]() { this->run(); }); +} + +void revparse_subcommand::run() +{ + auto directory = get_current_git_path(); + auto repo = repository_wrapper::open(directory); + + if (m_is_bare_repository_flag) + { + std::cout << std::boolalpha << repo.is_bare() << std::endl; + } + else + { + std::cout << "revparse only supports --is-bare-repository for now" << std::endl; + } +} diff --git a/src/subcommand/revparse_subcommand.hpp b/src/subcommand/revparse_subcommand.hpp new file mode 100644 index 0000000..baf430a --- /dev/null +++ b/src/subcommand/revparse_subcommand.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include "../utils/common.hpp" + +class revparse_subcommand +{ +public: + + explicit revparse_subcommand(const libgit2_object&, CLI::App& app); + void run(); + +private: + + bool m_is_bare_repository_flag = false; +}; + diff --git a/src/wrapper/repository_wrapper.cpp b/src/wrapper/repository_wrapper.cpp index 15cdfa8..93aae24 100644 --- a/src/wrapper/repository_wrapper.cpp +++ b/src/wrapper/repository_wrapper.cpp @@ -46,6 +46,11 @@ void repository_wrapper::state_cleanup() throw_if_error(git_repository_state_cleanup(*this)); } +bool repository_wrapper::is_bare() const +{ + return git_repository_is_bare(*this); +} + // References reference_wrapper repository_wrapper::head() const diff --git a/src/wrapper/repository_wrapper.hpp b/src/wrapper/repository_wrapper.hpp index 6b3e55a..5cce074 100644 --- a/src/wrapper/repository_wrapper.hpp +++ b/src/wrapper/repository_wrapper.hpp @@ -33,6 +33,8 @@ class repository_wrapper : public wrapper_base git_repository_state_t state() const; void state_cleanup(); + bool is_bare() const; + // References reference_wrapper head() const; reference_wrapper find_reference(std::string_view ref_name) const; diff --git a/test/test_revparse.py b/test/test_revparse.py new file mode 100644 index 0000000..ea11240 --- /dev/null +++ b/test/test_revparse.py @@ -0,0 +1,16 @@ +import subprocess + +import pytest + +def test_revparse(git2cpp_path, tmp_path, run_in_tmp_path): + # tmp_path exists and is empty. + assert list(tmp_path.iterdir()) == [] + + cmd = [git2cpp_path, 'init', '--bare'] + p = subprocess.run(cmd, cwd = tmp_path) + + cmd2 = [git2cpp_path, 'rev-parse', '--is-bare-repository'] + p2 = subprocess.run(cmd2, capture_output=True, text=True, cwd = tmp_path) + + assert p2.returncode == 0 + assert p2.stdout == 'true\n'