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"); } }