# Vault
Vault will be a command line tool (if successful) similar to git which would have multiple features like branches etc etc.
Drop a ✨ if you are here. It would mean a lot : )
```
__ __ _ _
\ \ / /_ _ _ _| | |_
\ \ / / _` | | | | | __|
\ V / (_| | |_| | | |_
### About
Vault is a version control system in Rust, written as a learning project. It follows a similar approach of how Git works i.e.
- Files are stored as Blobs and Directories as Trees.
- SHA256 is used to encode these objects.
- ZLib Compression is used for maximum efficiency.
For more details, Refer to [Workflow.md](https://github.com/saksham-tomer/vault/blob/master/src/workFlow.md) (wip)
Vault is not suitable for real-world use, but might be of interest for learning about git-internals.
# Installation
You can directly install from [Cargo](https://crates.io/crates/vault_vcs) by
```
cargo install vault_vcs
```
Note - This will install the binaries with executable name `vault_vcs`. So, if you want to continue using `vault` as an executable name, you can alias `vault_vcs` to `vault` or build it from source.
### References
- [Git Book](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects)
- [Article](https://dev.to/nopenoshishi/make-your-original-git-analyze-section-139d#de)
### From Source
1) Clone this repository by running the command
```
git clone https://github.com/saksham-tomer/vault
```
2) `cd` into the directory and run
```
cargo build --release
```
This will create binaries for the project.
3) Export the path of the executable (It is in the `/target/release/` directory .) For eg,
```
export PATH="$PATH:~/vault/target/release"
```
4) You are now all set to "VAULTIFY" your local files :)
# Commands
1) To initialize a new vault instance in your present working directory.
```
vault init
```
2) To create a new commit.
```
vault commit -m "Your Commit Message"
```
Parameter `-m` or `--message` is optional. It would take an empty message by default if no message is provided.
3) To create a new branch.
```
vault create branch_name
```
4) To revert commits (get back to a previous point of directory)
```
vault revert -l "No. of commits" "dir_name"
```
- Parameter `-l` or `--level` defines the number of commits to go back.. For eg. -l 2 would go back 2 commits in the repository. If nothing is provided , default vaule would be taken as 1.
- `dir_name` requires a directory name in which the files would be added. If nothing is provided, it would replace the files of the current directory.. (wip)
For eg. for `vault revert -l 2 hello`, a new directory would be created namely `hello`, that would have the files 2 commits ago..
5) Delete a Branch
```
vault delete branch_to_delete
```
6) Switching to another branch ( git checkout )
```
vault switch branch_to_switch
```
7) Logs of the current branch
```
vault log
```
Note - Output of vault log just consists of the logs of current active branch.

8) (Mainly For Debugging Purposes) To read the contents of a Zlib compressed binary
```
vault cat hash_string_to_read
```
Note - `vault cat` command should be run in the root directory. i.e. the directory in which `.vault` exists.

# Limitations / WIP
1) `.vaultignore` is not functional currently
2) To add - Test cases and subsequent workflows
3) Add more useful commands
There would be probably many more! Some of them are in the [issues](https://github.com/saksham-tomer/vault/issues).
# Thanks
If you read till here, thanks for showing interest in the project :)