0.1.0-alpha.1
This commit is contained in:
		
							parent
							
								
									b2a0a9eeae
								
							
						
					
					
						commit
						0d99f44291
					
				
					 3 changed files with 259 additions and 2 deletions
				
			
		
							
								
								
									
										257
									
								
								README.en.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								README.en.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,257 @@
 | 
			
		|||
# snag
 | 
			
		||||
 | 
			
		||||
`snag` (snapshot git) is a command-line utility for creating, managing, and restoring data snapshots. It allows importing, exporting, creating, and restoring snapshots, as well as managing file tracking rules.
 | 
			
		||||
 | 
			
		||||
## Build
 | 
			
		||||
 | 
			
		||||
To build, a pre-installed D language compiler (dmd/ldc/gdc) is required. For convenience, use the dub package manager:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
dub build --build=release
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
Basic command format:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag [flags] [options] command
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Flags
 | 
			
		||||
- `-h, --help` — Displays help.
 | 
			
		||||
- `--version` — Displays the utility version.
 | 
			
		||||
 | 
			
		||||
### Options
 | 
			
		||||
- `-c, --config <path>` — Specifies the path to the configuration file.
 | 
			
		||||
 | 
			
		||||
### Commands
 | 
			
		||||
- `init` — Initializes a repository for storing snapshots.
 | 
			
		||||
- `create` — Creates a new snapshot.
 | 
			
		||||
- `import` — Imports a snapshot from a tar.gz archive.
 | 
			
		||||
- `export` — Exports a snapshot to a tar.gz archive.
 | 
			
		||||
- `restore` — Restores state from a specified snapshot.
 | 
			
		||||
- `list` — Lists snapshots.
 | 
			
		||||
- `diff` — Shows changed data.
 | 
			
		||||
- `status` — Checks the status of tracked files.
 | 
			
		||||
- `rules` — Manages tracking rules.
 | 
			
		||||
- `size` — Displays snapshot sizes.
 | 
			
		||||
 | 
			
		||||
## Detailed Command Description
 | 
			
		||||
 | 
			
		||||
### `snag init`
 | 
			
		||||
Initializes a repository for storing snapshots.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag init [-h] [-f]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `-f, --force` — Overwrites an existing repository.
 | 
			
		||||
 | 
			
		||||
### `snag create`
 | 
			
		||||
Creates a new snapshot.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag create [-h] [--no-pre] [--no-post] [-c <comment>] [-a <author>] [-e <email>]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `--no-pre` — Skips pre-commands.
 | 
			
		||||
- `--no-post` — Skips post-commands.
 | 
			
		||||
- `-c, --comment <value>` — Specifies a comment for the snapshot.
 | 
			
		||||
- `-a, --author <value>` — Specifies the snapshot author.
 | 
			
		||||
- `-e, --email <value>` — Specifies the author's email.
 | 
			
		||||
 | 
			
		||||
### `snag import`
 | 
			
		||||
Imports a snapshot from a tar.gz archive.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag import [-h] [--no-pre] [--no-post] [-c <comment>] [-a <author>] [-e <email>] <archive_path>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `--no-pre` — Skips pre-commands.
 | 
			
		||||
- `--no-post` — Skips post-commands.
 | 
			
		||||
- `-c, --comment <value>` — Comment for the snapshot.
 | 
			
		||||
- `-a, --author <value>` — Snapshot author.
 | 
			
		||||
- `-e, --email <value>` — Author's email.
 | 
			
		||||
- `<archive_path>` — Path to the tar.gz file.
 | 
			
		||||
 | 
			
		||||
### `snag export`
 | 
			
		||||
Exports a snapshot to a tar.gz archive.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag export [-h] [-s <snapshot_hash>] <output_path>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `-s, --snapshot <hash>` — Specifies the snapshot hash.
 | 
			
		||||
- `<output_path>` — Path to the output directory for the archive.
 | 
			
		||||
 | 
			
		||||
### `snag restore`
 | 
			
		||||
Restores state from a specified snapshot.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag restore [-h] [--no-pre] [--no-post] <snapshot_hash>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `--no-pre` — Skips pre-commands.
 | 
			
		||||
- `--no-post` —焦性
 | 
			
		||||
- `<snapshot_hash>` — Hash of the snapshot to restore.
 | 
			
		||||
 | 
			
		||||
### `snag list`
 | 
			
		||||
Lists snapshots.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag list [-h] [-c] [-a] [-e]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `-c, --comment` — Show snapshot comments.
 | 
			
		||||
- `-a, --author` — Show snapshot authors.
 | 
			
		||||
- `-e, --email` — Show authors' emails.
 | 
			
		||||
 | 
			
		||||
### `snag diff`
 | 
			
		||||
Shows changed data.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag diff
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### `snag status`
 | 
			
		||||
Checks the status of tracked files.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag status
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### `snag size`
 | 
			
		||||
Displays snapshot sizes.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag size
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### `snag rules`
 | 
			
		||||
Manages tracking rules.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag rules [-h] save|show|update|reset|clear
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- `save` — Saves rules.
 | 
			
		||||
- `show` — Displays rules.
 | 
			
		||||
  ```bash
 | 
			
		||||
  snag rules show [-h] [-c]
 | 
			
		||||
  ```
 | 
			
		||||
  - `-c, --config` — Show rules from the configuration file.
 | 
			
		||||
- `update` — Updates rules.
 | 
			
		||||
  ```bash
 | 
			
		||||
  snag rules update [-h] [-r]
 | 
			
		||||
  ```
 | 
			
		||||
  - `-r, --remove` — Removes ignored files from tracking (use with caution!).
 | 
			
		||||
- `reset` — Resets rules to the state of committed changes.
 | 
			
		||||
- `clear` — Clears rules.
 | 
			
		||||
 | 
			
		||||
## Usage Examples
 | 
			
		||||
 | 
			
		||||
1. **Initialize a repository:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag init
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
2. **Create a snapshot with a comment:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag create -c "Initial snapshot" -a "John Doe" -e "john@example.com"
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
3. **Import a snapshot from an archive:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag import archive.tar.gz
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
4. **Export a snapshot:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag export -s abc123 /path/to/output
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
5. **Restore a snapshot:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag restore abc123
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
6. **View snapshot list with comments:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag list -c
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
7. **Update tracking rules:**
 | 
			
		||||
   ```bash
 | 
			
		||||
   snag rules update
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
## Configuration
 | 
			
		||||
 | 
			
		||||
The `snag` utility supports configuration via a JSON configuration file specified with the `-c` or `--config` option. This file defines the utility’s operating parameters, including paths, author details, pre- and post-snapshot commands, and file tracking rules.
 | 
			
		||||
 | 
			
		||||
Example of using a configuration file:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
snag -c /path/to/config.json create
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Example Configuration File
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
	"git": "/path/to/git/repository/dir",
 | 
			
		||||
	"project": "/path/to/project",
 | 
			
		||||
	"email": "user@site.domain",
 | 
			
		||||
	"author": "snag",
 | 
			
		||||
	"presnag": [
 | 
			
		||||
		"systemctl stop my.service"
 | 
			
		||||
	],
 | 
			
		||||
	"postsnag": [
 | 
			
		||||
		"systemctl start my.service"
 | 
			
		||||
	],
 | 
			
		||||
	"rules": {
 | 
			
		||||
		"tracking": [
 | 
			
		||||
			"/first_dir/",
 | 
			
		||||
			"/second_dir/*.conf",
 | 
			
		||||
			"/second_dir/more/"
 | 
			
		||||
		],
 | 
			
		||||
		"ignore": [
 | 
			
		||||
			"/second_dir/more/*.so"
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Configuration File Fields
 | 
			
		||||
 | 
			
		||||
- **`git`** (`string`): Path to the repository for storing snapshots. Example: `/path/to/git/repository/dir`. Used during `snag init` to specify the storage location for metadata and snapshots.
 | 
			
		||||
- **`project`** (`string`): Path to the project or directory whose files are tracked. Example: `/path/to/project`. Specifies the root directory for creating, importing, or restoring snapshots.
 | 
			
		||||
- **`email`** (`string`): Email of the snapshot author. Used for snapshot metadata in commands like `snag create` or `snag import`. Example: `user@site.domain`. Can be overridden by `-e` or `--email`.
 | 
			
		||||
- **`author`** (`string`): Name of the snapshot author. Used for snapshot metadata. Example: `snag`. Can be overridden by `-a` or `--author`.
 | 
			
		||||
- **`presnag`** (`array of strings`): Commands executed before creating or importing a snapshot (unless `--no-pre` is specified). Example:
 | 
			
		||||
  - `systemctl stop my.service` — Stops the `my.service` service before the operation to ensure data integrity.
 | 
			
		||||
- **`postsnag`** (`array of strings`): Commands executed after creating or importing a snapshot (unless `--no-post` is specified). Example:
 | 
			
		||||
  - `systemctl start my.service` — Starts the `my.service` service after the operation.
 | 
			
		||||
- **`rules`** (`object`): Defines file tracking rules.
 | 
			
		||||
  - **`tracking`** (`array of strings`): Patterns of files or directories to track. Example:
 | 
			
		||||
    - `/first_dir/` — Tracks the entire `/first_dir` directory and its contents.
 | 
			
		||||
    - `/second_dir/*.conf` — Tracks all `.conf` files in `/second_dir`.
 | 
			
		||||
    - `/second_dir/more/` — Tracks the entire `/second_dir/more` directory and its contents.
 | 
			
		||||
  - **`ignore`** (`array of strings`): Files or directories excluded from tracking. Example:
 | 
			
		||||
    - `/second_dir/more/*.so` — Ignores all `.so` files in `/second_dir/more`.
 | 
			
		||||
 | 
			
		||||
### Notes
 | 
			
		||||
 | 
			
		||||
- Rules in the `rules` section can be updated with `snag rules update` or viewed with `snag rules show -c`.
 | 
			
		||||
- Command-line parameters like `email` or `author` (e.g., via `-e` or `-a`) take precedence over configuration file values.
 | 
			
		||||
- Ensure paths specified in `git` and `project` exist and are readable/writable before operations.
 | 
			
		||||
- Commands in `presnag` and `postsnag` must be valid and accessible in the system, or the operation may fail.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
GPL-2.0 License. See the `LICENSE` file for details.
 | 
			
		||||
 | 
			
		||||
## Contact
 | 
			
		||||
 | 
			
		||||
For questions and suggestions: alexander@zhirov.kz
 | 
			
		||||
							
								
								
									
										2
									
								
								dub.json
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								dub.json
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
		"Alexander Zhirov"
 | 
			
		||||
	],
 | 
			
		||||
	"copyright": "Copyright © 2025, Alexander Zhirov",
 | 
			
		||||
	"description": "A backup system based on tracking file states using Git",
 | 
			
		||||
	"description": "Сommand-line utility for creating, managing, and restoring data snapshots",
 | 
			
		||||
	"license": "GPL-2.0-or-later",
 | 
			
		||||
	"name": "snag",
 | 
			
		||||
	"targetPath": "bin",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,3 @@
 | 
			
		|||
module snag.version_;
 | 
			
		||||
 | 
			
		||||
enum snagVersion = "0.0.13";
 | 
			
		||||
enum snagVersion = "0.1.0-alpha.1";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue