Skip to content

feat: add status subcommand #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@
#include <git2.h> // For version number only
#include <iostream>

#include "git_exception.hpp"
#include "src/utils/git_exception.hpp"
#include "version.hpp"
#include "subcommand/init_subcommand.hpp"
#include "subcommand/status_subcommand.hpp"

int main(int argc, char** argv)
{
int exitCode = 0;
try
{
const libgit2_object lg2_obj;
CLI::App app{"Git using C++ wrapper of libgit2"};

// Top-level command options.
auto version = app.add_flag("-v,--version", "Show version");

// Sub commands
InitSubcommand init(app);
init_subcommand init(lg2_obj, app);

app.parse(argc, argv);

Expand Down
4 changes: 2 additions & 2 deletions src/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
subdir('subcommand')
subdir('utils')
subdir('wrapper')

src_files = files([
'git_exception.cpp',
'main.cpp'
]) + subcommand_files + wrapper_files
]) + subcommand_files + utils_files + wrapper_files
16 changes: 0 additions & 16 deletions src/subcommand/base_subcommand.hpp

This file was deleted.

13 changes: 6 additions & 7 deletions src/subcommand/init_subcommand.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include <filesystem>
// #include <filesystem>
#include "init_subcommand.hpp"
#include "../wrapper/repository_wrapper.hpp"
#include "src/wrapper/repository_wrapper.hpp"

InitSubcommand::InitSubcommand(CLI::App& app)
init_subcommand::init_subcommand(const libgit2_object&, CLI::App& app)
{
auto *sub = app.add_subcommand("init", "Explanation of init here");

Expand All @@ -11,13 +11,12 @@ InitSubcommand::InitSubcommand(CLI::App& app)
// If directory not specified, uses cwd.
sub->add_option("directory", directory, "info about directory arg")
->check(CLI::ExistingDirectory | CLI::NonexistentPath)
->default_val(std::filesystem::current_path());
->default_val(get_current_git_path());

sub->callback([this]() { this->run(); });
}

void InitSubcommand::run()
void init_subcommand::run()
{
RepositoryWrapper repo;
repo.init(directory, bare);
repository_wrapper::init(directory, bare);
}
10 changes: 7 additions & 3 deletions src/subcommand/init_subcommand.hpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
#pragma once

#include <string>
#include "base_subcommand.hpp"

class InitSubcommand : public BaseSubcommand
#include <CLI/CLI.hpp>

#include "../utils/common.hpp"

class init_subcommand
{
public:
InitSubcommand(CLI::App& app);

explicit init_subcommand(const libgit2_object&, CLI::App& app);
void run();

private:
Expand Down
25 changes: 25 additions & 0 deletions src/utils/common.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include <filesystem>

#include <git2.h>

#include "common.hpp"

libgit2_object::libgit2_object()
{
git_libgit2_init();
}

libgit2_object::~libgit2_object()
{
git_libgit2_shutdown();
}

std::string get_current_git_path()
{
return std::filesystem::current_path(); // TODO: make sure that it goes to the root
}

// // If directory not specified, uses cwd.
// sub->add_option("directory", directory, "info about directory arg")
// ->check(CLI::ExistingDirectory | CLI::NonexistentPath)
// ->default_val(std::filesystem::current_path());
59 changes: 59 additions & 0 deletions src/utils/common.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#pragma once

#include <string>
#include <utility>

class noncopiable_nonmovable
{
public:
noncopiable_nonmovable(const noncopiable_nonmovable&) = delete;
noncopiable_nonmovable& operator=(const noncopiable_nonmovable&) = delete;
noncopiable_nonmovable(noncopiable_nonmovable&&) = delete;
noncopiable_nonmovable& operator=(noncopiable_nonmovable&&) = delete;

protected:
noncopiable_nonmovable() = default;
~noncopiable_nonmovable() = default;
};

template <class T>
class wrapper_base
{
public:
using ressource_type = T;

wrapper_base(const wrapper_base&) = delete;
wrapper_base& operator=(const wrapper_base&) = delete;

wrapper_base(wrapper_base&& rhs)
: p_ressource(rhs.p_ressource)
{
rhs.p_ressource = nullptr;
}
wrapper_base& operator=(wrapper_base&& rhs)
{
std::swap(p_ressource, rhs.p_ressource);
return this;
}

operator ressource_type*() const noexcept
{
return p_ressource;
}

protected:
// Allocation and deletion of p_ressource must be handled by inheriting class.
wrapper_base() = default;
~wrapper_base() = default;
ressource_type* p_ressource = nullptr;
};

class libgit2_object : private noncopiable_nonmovable
{
public:

libgit2_object();
~libgit2_object();
};

std::string get_current_git_path();
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions src/utils/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
utils_files = files([
'common.cpp',
'git_exception.cpp',
])
15 changes: 0 additions & 15 deletions src/wrapper/base_wrapper.cpp

This file was deleted.

16 changes: 0 additions & 16 deletions src/wrapper/base_wrapper.hpp

This file was deleted.

1 change: 0 additions & 1 deletion src/wrapper/meson.build
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
wrapper_files = files([
'base_wrapper.cpp',
'repository_wrapper.cpp',
])
29 changes: 15 additions & 14 deletions src/wrapper/repository_wrapper.cpp
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
#include <iostream>
#include <string>

#include "../git_exception.hpp"
#include "../utils/git_exception.hpp"
#include "repository_wrapper.hpp"

RepositoryWrapper::RepositoryWrapper()
: _repo(nullptr)
{}

RepositoryWrapper::~RepositoryWrapper()
repository_wrapper::~repository_wrapper()
{
git_repository_free(p_ressource);
p_ressource=nullptr;
}

repository_wrapper repository_wrapper::open(const std::string& directory)
{
if (_repo != nullptr) {
git_repository_free(_repo); // no return
}
repository_wrapper rw;
throwIfError(git_repository_open(&(rw.p_ressource), directory.c_str()));
return rw;
}

void RepositoryWrapper::init(const std::string& directory, bool bare)
repository_wrapper repository_wrapper::init(const std::string& directory, bool bare)
{
// what if it is already initialised? Throw exception or delete and recreate?
throwIfError(git_repository_init(&_repo, directory.c_str(), bare));
repository_wrapper rw;
throwIfError(git_repository_init(&(rw.p_ressource), directory.c_str(), bare));
return rw;
}
20 changes: 14 additions & 6 deletions src/wrapper/repository_wrapper.hpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
#pragma once

#include "base_wrapper.hpp"
#include <string>

class RepositoryWrapper : public BaseWrapper
#include <git2.h>

#include "../utils/common.hpp"

class repository_wrapper : public wrapper_base<git_repository>
{
public:
RepositoryWrapper();

virtual ~RepositoryWrapper();
~repository_wrapper();

void init(const std::string& directory, bool bare);
repository_wrapper(repository_wrapper&&) = default;
repository_wrapper& operator=(repository_wrapper&&) = default;

static repository_wrapper init(const std::string& directory, bool bare);
static repository_wrapper open(const std::string& directory);

private:
git_repository *_repo;

repository_wrapper() = default;
};
Loading