Изменение имени проекта

This commit is contained in:
Alexander Zhirov 2025-05-24 03:38:53 +03:00
parent 7714bc498e
commit cc1a81261a
Signed by: alexander
GPG key ID: C8D8BE544A27C511
16 changed files with 70 additions and 70 deletions

14
.gitignore vendored
View file

@ -2,13 +2,13 @@
docs.json docs.json
__dummy.html __dummy.html
docs/ docs/
/snapd /snag
snapd.so snag.so
snapd.dylib snag.dylib
snapd.dll snag.dll
snapd.a snag.a
snapd.lib snag.lib
snapd-test-* snag-test-*
*.exe *.exe
*.pdb *.pdb
*.o *.o

View file

@ -1,3 +1,3 @@
# snapd # snag
Snapshot D - система резервного копирования на основе фиксации состояния файлов с помощью Git. Snapshot Git - система резервного копирования на основе фиксации состояния файлов с помощью Git.

View file

@ -5,7 +5,7 @@
"copyright": "Copyright © 2025, Alexander Zhirov", "copyright": "Copyright © 2025, Alexander Zhirov",
"description": "A backup system based on tracking file states using Git", "description": "A backup system based on tracking file states using Git",
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"name": "snapd", "name": "snag",
"targetPath": "bin", "targetPath": "bin",
"targetType": "executable", "targetType": "executable",
"dependencies": { "dependencies": {

View file

@ -1,13 +1,13 @@
{ {
"git": "/tmp/testgit", "git": "/tmp/testgit",
"project": "/home/alexander/Programming/new/dlang/snapd/source", "project": "/home/alexander/Programming/new/dlang/snag/source",
"email": "user@site.domain", "email": "user@site.domain",
"user": "snapd", "user": "snag",
"presnap": [ "presnag": [
"/usr/bin/ls", "/usr/bin/ls",
"/usr/local/bin/script.sh" "/usr/local/bin/script.sh"
], ],
"postsnap": [ "postsnag": [
"/usr/bin/ls", "/usr/bin/ls",
"/usr/local/bin/script.sh" "/usr/local/bin/script.sh"
] ]

View file

@ -1,14 +1,14 @@
import snapd; import snag;
import commandr; import commandr;
import std.file; import std.file;
import core.stdc.stdlib : EXIT_SUCCESS, EXIT_FAILURE; import core.stdc.stdlib : EXIT_SUCCESS, EXIT_FAILURE;
private string programName = "snapd"; private string programName = "snag";
int main(string[] args) int main(string[] args)
{ {
auto argumets = new Program(programName, snapdVersion) auto argumets = new Program(programName, snagVersion)
.add(new Command("init", "Initializing the repository for storing snapshots")) .add(new Command("init", "Initializing the repository for storing snapshots"))
.add(new Command("status", "Checking the status of tracked files")) .add(new Command("status", "Checking the status of tracked files"))
.add(new Command("create", "Create a new backup")) .add(new Command("create", "Create a new backup"))
@ -21,31 +21,31 @@ int main(string[] args)
) )
.parse(args); .parse(args);
string configFile = argumets.option("config", "snapd.json"); string configFile = argumets.option("config", "snag.json");
SnapdConfig config; SnagConfig config;
try { try {
config = new SnapdConfig(configFile); config = new SnagConfig(configFile);
} catch (SnapdConfigException e) { } catch (SnagConfigException e) {
e.print(); e.print();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
auto snapd = new Snapd(config); auto snag = new Snag(config);
try { try {
argumets argumets
.on("init", (init) { .on("init", (init) {
snapd.initialize(); snag.initialize();
}) })
.on("status", (status) { .on("status", (status) {
snapd.status(); snag.status();
}) })
.on("create", (create) { .on("create", (create) {
snapd.create(); snag.create();
}); });
} catch (SnapdException e) { } catch (SnagException e) {
e.print(); e.print();
return EXIT_FAILURE; return EXIT_FAILURE;
} }

View file

@ -1,4 +1,4 @@
module snapd.config.config; module snag.config.config;
import std.json; import std.json;
import std.file; import std.file;
@ -6,9 +6,9 @@ import std.path;
import std.regex; import std.regex;
import std.string; import std.string;
import snapd.config.exception; import snag.config.exception;
class SnapdConfig { class SnagConfig {
private string _git; private string _git;
private string _project; private string _project;
private string _email; private string _email;
@ -27,75 +27,75 @@ class SnapdConfig {
jsonText = readText(configFile); jsonText = readText(configFile);
jsonData = parseJSON(jsonText); jsonData = parseJSON(jsonText);
} catch (Exception e) { } catch (Exception e) {
throw new SnapdConfigException( throw new SnagConfigException(
"An error occurred while reading the configuration file:\n\t" "An error occurred while reading the configuration file:\n\t"
~ e.msg ~ e.msg
); );
} }
if ("git" !in jsonData) if ("git" !in jsonData)
throw new SnapdConfigException( throw new SnagConfigException(
"The configuration file is missing the \"git\" parameter" "The configuration file is missing the \"git\" parameter"
); );
_git = jsonData["git"].str; _git = jsonData["git"].str;
if (!_git.length) if (!_git.length)
throw new SnapdConfigException( throw new SnagConfigException(
"The \"git\" parameter must contain the path to the directory" "The \"git\" parameter must contain the path to the directory"
); );
if (!_git.isAbsolute) if (!_git.isAbsolute)
throw new SnapdConfigException( throw new SnagConfigException(
"The \"git\" parameter must be an absolute path to the directory:\n\t" "The \"git\" parameter must be an absolute path to the directory:\n\t"
~ _git ~ _git
); );
if ("project" !in jsonData) if ("project" !in jsonData)
throw new SnapdConfigException( throw new SnagConfigException(
"The configuration file is missing the \"project\" parameter" "The configuration file is missing the \"project\" parameter"
); );
_project = jsonData["project"].str; _project = jsonData["project"].str;
if (!_project.length) if (!_project.length)
throw new SnapdConfigException( throw new SnagConfigException(
"The \"project\" parameter must contain the path to the directory" "The \"project\" parameter must contain the path to the directory"
); );
if (!_project.isAbsolute) if (!_project.isAbsolute)
throw new SnapdConfigException( throw new SnagConfigException(
"The \"project\" parameter must be an absolute path to the directory:\n\t" "The \"project\" parameter must be an absolute path to the directory:\n\t"
~ _project ~ _project
); );
if ("email" !in jsonData) if ("email" !in jsonData)
throw new SnapdConfigException( throw new SnagConfigException(
"The configuration file is missing the \"email\" parameter" "The configuration file is missing the \"email\" parameter"
); );
_email = jsonData["email"].str; _email = jsonData["email"].str;
if (!_email.length) if (!_email.length)
throw new SnapdConfigException( throw new SnagConfigException(
"The \"email\" parameter must contain an email address" "The \"email\" parameter must contain an email address"
); );
if (!isValidEmail(_email)) if (!isValidEmail(_email))
throw new SnapdConfigException( throw new SnagConfigException(
"Invalid email address provided in the \"email\" parameter:\n\t" "Invalid email address provided in the \"email\" parameter:\n\t"
~ _email ~ _email
); );
if ("user" !in jsonData) if ("user" !in jsonData)
throw new SnapdConfigException( throw new SnagConfigException(
"The configuration file is missing the \"user\" parameter" "The configuration file is missing the \"user\" parameter"
); );
_user = jsonData["user"].str; _user = jsonData["user"].str;
if (!_user.length) if (!_user.length)
throw new SnapdConfigException( throw new SnagConfigException(
"The \"user\" parameter must contain an user name" "The \"user\" parameter must contain an user name"
); );
} }

View file

@ -1,9 +1,9 @@
module snapd.config.exception; module snag.config.exception;
import std.exception; import std.exception;
import std.stdio : writeln; import std.stdio : writeln;
class SnapdConfigException : Exception { class SnagConfigException : Exception {
this(string msg, string file = __FILE__, size_t line = __LINE__) { this(string msg, string file = __FILE__, size_t line = __LINE__) {
super(msg, file, line); super(msg, file, line);
} }

View file

@ -0,0 +1,4 @@
module snag.config;
public import snag.config.exception;
public import snag.config.config;

View file

@ -1,6 +1,6 @@
module snapd.core.core; module snag.core.core;
import snapd.config; import snag.config;
import std.format; import std.format;
import std.stdio; import std.stdio;
import std.array; import std.array;
@ -9,7 +9,7 @@ import std.process;
import std.algorithm; import std.algorithm;
import std.string; import std.string;
class SnapdException : Exception { class SnagException : Exception {
this(string msg, string file = __FILE__, size_t line = __LINE__) { this(string msg, string file = __FILE__, size_t line = __LINE__) {
super(msg, file, line); super(msg, file, line);
} }
@ -19,11 +19,11 @@ class SnapdException : Exception {
} }
} }
class Snapd { class Snag {
private string[] _baseCommand; private string[] _baseCommand;
private SnapdConfig _config; private SnagConfig _config;
this(SnapdConfig config) { this(SnagConfig config) {
_baseCommand = format( _baseCommand = format(
"git --git-dir=%s --work-tree=%s", "git --git-dir=%s --work-tree=%s",
config.git, config.project config.git, config.project
@ -34,7 +34,7 @@ class Snapd {
void initialize() { void initialize() {
auto result = execute(_baseCommand ~ "init"); auto result = execute(_baseCommand ~ "init");
if (result.status) if (result.status)
throw new SnapdException( throw new SnagException(
"A Git repository initialization error occurred:\n" "A Git repository initialization error occurred:\n"
~ result.output ~ result.output
); );
@ -43,7 +43,7 @@ class Snapd {
_baseCommand ~ ["config", "user.email", _config.email] _baseCommand ~ ["config", "user.email", _config.email]
); );
if (result.status) if (result.status)
throw new SnapdException( throw new SnagException(
"A Git repository initialization error occurred:\n" "A Git repository initialization error occurred:\n"
~ result.output ~ result.output
); );
@ -52,7 +52,7 @@ class Snapd {
_baseCommand ~ ["config", "user.name", _config.user] _baseCommand ~ ["config", "user.name", _config.user]
); );
if (result.status) if (result.status)
throw new SnapdException( throw new SnagException(
"A Git repository initialization error occurred:\n" "A Git repository initialization error occurred:\n"
~ result.output ~ result.output
); );
@ -68,7 +68,7 @@ class Snapd {
_baseCommand ~ ["status", "--porcelain"] _baseCommand ~ ["status", "--porcelain"]
); );
if (result.status) if (result.status)
throw new SnapdException( throw new SnagException(
"An error occurred while checking the file tracking status:\n" "An error occurred while checking the file tracking status:\n"
~ result.output ~ result.output
); );
@ -90,7 +90,7 @@ class Snapd {
_baseCommand ~ ["add", "."] _baseCommand ~ ["add", "."]
); );
if (result.status) if (result.status)
throw new SnapdException( throw new SnagException(
"Failed to prepare files for archiving:\n" "Failed to prepare files for archiving:\n"
~ result.output ~ result.output
); );
@ -99,7 +99,7 @@ class Snapd {
_baseCommand ~ ["commit", "-m", "test"] _baseCommand ~ ["commit", "-m", "test"]
); );
if (result.status) if (result.status)
throw new SnapdException( throw new SnagException(
"Failed to create a backup:\n" "Failed to create a backup:\n"
~ result.output ~ result.output
); );

View file

@ -0,0 +1,3 @@
module snag.core;
public import snag.core.core;

5
source/snag/package.d Normal file
View file

@ -0,0 +1,5 @@
module snag;
public import snag.version_;
public import snag.config;
public import snag.core;

3
source/snag/version_.d Normal file
View file

@ -0,0 +1,3 @@
module snag.version_;
enum snagVersion = "0.0.4";

View file

@ -1,4 +0,0 @@
module snapd.config;
public import snapd.config.exception;
public import snapd.config.config;

View file

@ -1,3 +0,0 @@
module snapd.core;
public import snapd.core.core;

View file

@ -1,5 +0,0 @@
module snapd;
public import snapd.version_;
public import snapd.config;
public import snapd.core;

View file

@ -1,3 +0,0 @@
module snapd.version_;
enum snapdVersion = "0.0.3";