Добавлена команда export для экспорта в архив tar.gz файлов указанного состояния снимка, по умолчанию экспортируется текущее состояние снимка
This commit is contained in:
parent
4301c27ca9
commit
4590ee5fbc
3 changed files with 72 additions and 11 deletions
20
source/app.d
20
source/app.d
|
@ -12,6 +12,16 @@ int main(string[] args)
|
|||
.add(new Command("init", "Initializing the repository for storing snapshots"))
|
||||
.add(new Command("status", "Checking the status of tracked files"))
|
||||
.add(new Command("diff", "Show changed data"))
|
||||
.add(new Command("export", "Export snapshot to a tar.gz archive")
|
||||
.add(new Argument("path", "Output directory path for the archive").required)
|
||||
.add(new Option("s", "snapshot", "Specify snapshot hash")
|
||||
.optional
|
||||
.validateEachWith(
|
||||
opt => opt.isValidHash,
|
||||
"must contain snapshot hash provided"
|
||||
)
|
||||
)
|
||||
)
|
||||
.add(new Command("create", "Create a new snapshot")
|
||||
.add(new Option("c", "comment", "Specify comment")
|
||||
.optional
|
||||
|
@ -50,7 +60,7 @@ int main(string[] args)
|
|||
)
|
||||
)
|
||||
.add(new Command("restore", "Restore to the specified snapshot state")
|
||||
.add(new Argument("hash", "hash").required)
|
||||
.add(new Argument("snapshot", "Specify snapshot hash").required)
|
||||
)
|
||||
.add(new Option("c", "config", "Сonfiguration file path")
|
||||
.optional
|
||||
|
@ -100,7 +110,13 @@ int main(string[] args)
|
|||
)
|
||||
)
|
||||
.on("restore", restore =>
|
||||
snag.restore(restore.arg("hash"))
|
||||
snag.restore(restore.arg("snapshot"))
|
||||
)
|
||||
.on("export", e =>
|
||||
snag.exportSnapshot(
|
||||
e.arg("path"),
|
||||
e.option("snapshot", ""),
|
||||
)
|
||||
);
|
||||
} catch (SnagException e) {
|
||||
e.print();
|
||||
|
|
|
@ -8,6 +8,8 @@ import std.array;
|
|||
import std.process;
|
||||
import std.algorithm;
|
||||
import std.string;
|
||||
import std.file;
|
||||
import std.path;
|
||||
|
||||
import snag.lib;
|
||||
import snag.core.exception;
|
||||
|
@ -22,10 +24,9 @@ class Snag {
|
|||
"git --git-dir=%s --work-tree=%s",
|
||||
config.git, config.project
|
||||
).split();
|
||||
|
||||
_config = config;
|
||||
|
||||
auto currentTime = Clock.currTime();
|
||||
|
||||
_date = format("%02d%03d%02d%02d%02d",
|
||||
currentTime.year % 100,
|
||||
currentTime.dayOfYear,
|
||||
|
@ -67,12 +68,10 @@ class Snag {
|
|||
["status", "--porcelain"],
|
||||
"An error occurred while checking the file tracking status"
|
||||
);
|
||||
|
||||
if (!result.output.length) {
|
||||
writeln("The current state of the files is up to date as of the latest snapshot");
|
||||
return;
|
||||
}
|
||||
|
||||
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]);
|
||||
|
@ -205,18 +204,20 @@ class Snag {
|
|||
throw new SnagException(
|
||||
"Invalid snapshot hash provided"
|
||||
);
|
||||
|
||||
auto result = git(
|
||||
["status", "--porcelain"],
|
||||
"An error occurred while checking the file tracking status"
|
||||
);
|
||||
|
||||
if (result.output.length)
|
||||
if (result.output.length) {
|
||||
git(
|
||||
["restore", "."],
|
||||
"Failed to reset file changes state"
|
||||
);
|
||||
|
||||
git(
|
||||
["clean", "-fd"],
|
||||
"Failed to clean untracked files"
|
||||
);
|
||||
}
|
||||
git(
|
||||
["rev-parse", hash],
|
||||
"This snapshot is not available in the archive"
|
||||
|
@ -239,4 +240,48 @@ class Snag {
|
|||
}
|
||||
writeln("No changes at the moment");
|
||||
}
|
||||
|
||||
void exportSnapshot(string path, string hash) {
|
||||
try {
|
||||
!path.isDir &&
|
||||
throw new SnagException(
|
||||
"Path is not a directory"
|
||||
);
|
||||
} catch (Exception e) {
|
||||
throw new SnagException(
|
||||
"Failed to verify the archive output directory:\n\t"
|
||||
~ e.msg
|
||||
);
|
||||
}
|
||||
if (hash.length) {
|
||||
!isValidHash(hash) &&
|
||||
throw new SnagException(
|
||||
"Invalid snapshot hash provided"
|
||||
);
|
||||
git(
|
||||
["rev-parse", hash],
|
||||
"This snapshot is not available in the archive"
|
||||
);
|
||||
} else {
|
||||
hash = git(
|
||||
["rev-parse", "--short", "HEAD"],
|
||||
"Failed to retrieve current snapshot information"
|
||||
).output.strip('\n');
|
||||
}
|
||||
string file = buildPath(
|
||||
path.absolutePath.buildNormalizedPath,
|
||||
"%s-%s.tar.gz".format(_date, hash)
|
||||
);
|
||||
git(
|
||||
[
|
||||
"archive",
|
||||
"--format=tar.gz",
|
||||
hash,
|
||||
"-o",
|
||||
file
|
||||
],
|
||||
"Failed to export snapshot to archive"
|
||||
);
|
||||
writeln("Export to archive completed successfully: ", file);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
module snag.version_;
|
||||
|
||||
enum snagVersion = "0.0.8";
|
||||
enum snagVersion = "0.0.9";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue