diff --git a/source/snapd/core/core.d b/source/snapd/core/core.d new file mode 100644 index 0000000..2d285c4 --- /dev/null +++ b/source/snapd/core/core.d @@ -0,0 +1,109 @@ +module snapd.core.core; + +import snapd.config; +import std.format; +import std.stdio; +import std.array; +import std.exception; +import std.process; +import std.algorithm; +import std.string; + +class SnapdException : Exception { + this(string msg, string file = __FILE__, size_t line = __LINE__) { + super(msg, file, line); + } + + void print() { + writeln(msg); + } +} + +class Snapd { + private string[] _baseCommand; + private SnapdConfig _config; + + this(SnapdConfig config) { + _baseCommand = format( + "git --git-dir=%s --work-tree=%s", + config.git, config.project + ).split(); + _config = config; + } + + void initialize() { + auto result = execute(_baseCommand ~ "init"); + if (result.status) + throw new SnapdException( + "A Git repository initialization error occurred:\n" + ~ result.output + ); + + result = execute( + _baseCommand ~ ["config", "user.email", _config.email] + ); + if (result.status) + throw new SnapdException( + "A Git repository initialization error occurred:\n" + ~ result.output + ); + + result = execute( + _baseCommand ~ ["config", "user.name", _config.user] + ); + if (result.status) + throw new SnapdException( + "A Git repository initialization error occurred:\n" + ~ result.output + ); + + writeln( + "The Git repository has been initialized successfully: " + ~ _config.git + ); + } + + void status() { + auto result = execute( + _baseCommand ~ ["status", "--porcelain"] + ); + if (result.status) + throw new SnapdException( + "An error occurred while checking the file tracking status:\n" + ~ result.output + ); + + writeln("The following list of files requires backup:"); + + /** + Цепочка выполняет разбивку по переводу на новую строку, + отсеивает пустые строки, перебирает в цикле имеющиеся строки, + выводит только вторую часть строки (разделенную по пробелу) + */ + result.output.split('\n').filter!(e => !e.strip.empty).each!((e) { + writefln("\t/%s", e.strip.split[1]); + }); + } + + void create() { + auto result = execute( + _baseCommand ~ ["add", "."] + ); + if (result.status) + throw new SnapdException( + "Failed to prepare files for archiving:\n" + ~ result.output + ); + + result = execute( + _baseCommand ~ ["commit", "-m", "test"] + ); + if (result.status) + throw new SnapdException( + "Failed to create a backup:\n" + ~ result.output + ); + + writeln("Backup was created successfully"); + } +} diff --git a/source/snapd/core/package.d b/source/snapd/core/package.d new file mode 100644 index 0000000..ac6ebaf --- /dev/null +++ b/source/snapd/core/package.d @@ -0,0 +1,3 @@ +module snapd.core; + +public import snapd.core.core; diff --git a/source/snapd/package.d b/source/snapd/package.d index 4f5e10f..4360689 100644 --- a/source/snapd/package.d +++ b/source/snapd/package.d @@ -2,3 +2,4 @@ module snapd; public import snapd.version_; public import snapd.config; +public import snapd.core;