Добавлена команда 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("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("diff", "Show changed data"))
 | 
							.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 Command("create", "Create a new snapshot")
 | 
				
			||||||
			.add(new Option("c", "comment", "Specify comment")
 | 
								.add(new Option("c", "comment", "Specify comment")
 | 
				
			||||||
				.optional
 | 
									.optional
 | 
				
			||||||
| 
						 | 
					@ -50,7 +60,7 @@ int main(string[] args)
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
		.add(new Command("restore", "Restore to the specified snapshot state")
 | 
							.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")
 | 
							.add(new Option("c", "config", "Сonfiguration file path")
 | 
				
			||||||
			.optional
 | 
								.optional
 | 
				
			||||||
| 
						 | 
					@ -100,7 +110,13 @@ int main(string[] args)
 | 
				
			||||||
				)
 | 
									)
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
			.on("restore", restore =>
 | 
								.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) {
 | 
						} catch (SnagException e) {
 | 
				
			||||||
		e.print();
 | 
							e.print();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,8 @@ import std.array;
 | 
				
			||||||
import std.process;
 | 
					import std.process;
 | 
				
			||||||
import std.algorithm;
 | 
					import std.algorithm;
 | 
				
			||||||
import std.string;
 | 
					import std.string;
 | 
				
			||||||
 | 
					import std.file;
 | 
				
			||||||
 | 
					import std.path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import snag.lib;
 | 
					import snag.lib;
 | 
				
			||||||
import snag.core.exception;
 | 
					import snag.core.exception;
 | 
				
			||||||
| 
						 | 
					@ -22,10 +24,9 @@ class Snag {
 | 
				
			||||||
			"git --git-dir=%s --work-tree=%s",
 | 
								"git --git-dir=%s --work-tree=%s",
 | 
				
			||||||
			config.git, config.project
 | 
								config.git, config.project
 | 
				
			||||||
		).split();
 | 
							).split();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		_config = config;
 | 
							_config = config;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		auto currentTime = Clock.currTime();
 | 
							auto currentTime = Clock.currTime();
 | 
				
			||||||
 | 
					 | 
				
			||||||
		_date = format("%02d%03d%02d%02d%02d",
 | 
							_date = format("%02d%03d%02d%02d%02d",
 | 
				
			||||||
						currentTime.year % 100,
 | 
											currentTime.year % 100,
 | 
				
			||||||
						currentTime.dayOfYear,
 | 
											currentTime.dayOfYear,
 | 
				
			||||||
| 
						 | 
					@ -67,12 +68,10 @@ class Snag {
 | 
				
			||||||
			["status", "--porcelain"],
 | 
								["status", "--porcelain"],
 | 
				
			||||||
			"An error occurred while checking the file tracking status"
 | 
								"An error occurred while checking the file tracking status"
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (!result.output.length) {
 | 
							if (!result.output.length) {
 | 
				
			||||||
			writeln("The current state of the files is up to date as of the latest snapshot");
 | 
								writeln("The current state of the files is up to date as of the latest snapshot");
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		writeln("The following list of files requires backup:");
 | 
							writeln("The following list of files requires backup:");
 | 
				
			||||||
		result.output.split('\n').filter!(e => !e.strip.empty).each!((e) {
 | 
							result.output.split('\n').filter!(e => !e.strip.empty).each!((e) {
 | 
				
			||||||
			writefln("\t/%s", e.strip.split[1]);
 | 
								writefln("\t/%s", e.strip.split[1]);
 | 
				
			||||||
| 
						 | 
					@ -205,18 +204,20 @@ class Snag {
 | 
				
			||||||
			throw new SnagException(
 | 
								throw new SnagException(
 | 
				
			||||||
				"Invalid snapshot hash provided"
 | 
									"Invalid snapshot hash provided"
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		auto result = git(
 | 
							auto result = git(
 | 
				
			||||||
			["status", "--porcelain"],
 | 
								["status", "--porcelain"],
 | 
				
			||||||
			"An error occurred while checking the file tracking status"
 | 
								"An error occurred while checking the file tracking status"
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
 | 
							if (result.output.length) {
 | 
				
			||||||
		if (result.output.length)
 | 
					 | 
				
			||||||
			git(
 | 
								git(
 | 
				
			||||||
				["restore", "."],
 | 
									["restore", "."],
 | 
				
			||||||
				"Failed to reset file changes state"
 | 
									"Failed to reset file changes state"
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
 | 
								git(
 | 
				
			||||||
 | 
									["clean", "-fd"],
 | 
				
			||||||
 | 
									"Failed to clean untracked files"
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		git(
 | 
							git(
 | 
				
			||||||
			["rev-parse", hash],
 | 
								["rev-parse", hash],
 | 
				
			||||||
			"This snapshot is not available in the archive"
 | 
								"This snapshot is not available in the archive"
 | 
				
			||||||
| 
						 | 
					@ -239,4 +240,48 @@ class Snag {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		writeln("No changes at the moment");
 | 
							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_;
 | 
					module snag.version_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum snagVersion = "0.0.8";
 | 
					enum snagVersion = "0.0.9";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue