Add command to clone the source repository

This commit is contained in:
Eugen Wissner 2023-04-02 12:46:44 +02:00
parent f46a16b4a0
commit ae0048ef3d
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
4 changed files with 60 additions and 3 deletions

View File

@ -3,11 +3,11 @@ rule cxx
description = CXX $out description = CXX $out
rule link rule link
command = g++ -o $out $in command = g++ -o $out $in -lboost_filesystem -lboost_system
description = LINK $out description = LINK $out
build build/package.o: cxx src/package.cpp | src/package.h build build/package.o: cxx src/package.cpp | src/package.h
build build/command.o: cxx src/command.cpp | src/command.h build/package.o build build/command.o: cxx src/command.cpp | src/command.h build/package.o src/config.h
build build/main.o: cxx src/main.cpp build build/main.o: cxx src/main.cpp

View File

@ -1,5 +1,6 @@
#include "command.h" #include "command.h"
#include <cassert> #include <cassert>
#include "config.h"
namespace katja namespace katja
{ {
@ -17,7 +18,33 @@ namespace katja
void help::execute() const void help::execute() const
{ {
std::cout << "Usage:\n" std::cout << "Usage:\n"
"\tkatja {info|help} [OPTIONS]\n\n"; "\tkatja {list|update|help} [OPTIONS]\n\n";
}
update::update()
: git_binary(boost::process::search_path("git"))
{
}
void update::execute() const
{
std::filesystem::path workdir{ WORKDIR };
std::filesystem::path repository = workdir / "sbo/repository";
std::filesystem::file_status repository_status = std::filesystem::status(repository);
if (std::filesystem::exists(repository_status)
&& !std::filesystem::is_directory(repository_status))
{
throw std::runtime_error("The working directory path \""
+ repository.string() + "\" exists, but it isn't a directory.");
}
else if (!std::filesystem::exists(repository_status))
{
git("clone", std::filesystem::path(),
"git://git.slackbuilds.org/slackbuilds.git", repository.native());
}
git("remote", repository.native(), "update", "--prune");
git("reset", repository.native(), "--hard", "origin/master");
} }
command_exception::command_exception(const command_exception_t exception_type, command_exception::command_exception(const command_exception_t exception_type,
@ -65,6 +92,10 @@ namespace katja
{ {
return std::make_unique<list>(); return std::make_unique<list>();
} }
else if (strcmp(argv[1], "update") == 0)
{
return std::make_unique<update>();
}
else if (strcmp(argv[1], "help") == 0) else if (strcmp(argv[1], "help") == 0)
{ {
return std::make_unique<help>(); return std::make_unique<help>();

View File

@ -3,6 +3,8 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "package.h" #include "package.h"
#include <boost/process.hpp>
#include <filesystem>
namespace katja namespace katja
{ {
@ -24,6 +26,29 @@ namespace katja
void execute() const override; void execute() const override;
}; };
class update final : public command
{
boost::filesystem::path git_binary;
template<typename... Args>
void git(const std::string& command, const std::filesystem::path& cwd, const Args&... args) const
{
if (cwd.empty())
{
boost::process::system(git_binary, command, args...);
}
else
{
boost::process::system(git_binary, "-C", cwd.native(), command, args...);
}
}
public:
explicit update();
void execute() const override;
};
enum class command_exception_t enum class command_exception_t
{ {
no_command, no_command,

1
src/config.h Normal file
View File

@ -0,0 +1 @@
#define WORKDIR "./var"