git_vault 0.0.9

A simplified version control system built in Rust for local files, quite similar to how git functions.
# 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 / (_| | |_| | | |_ 
   \_/ \__,_|\__,_|_|\__| , simplified version control for local files 
```

### 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.

![Output of vault log](https://github.com/shubhexists/vault/assets/110319892/49e44032-dbcb-4741-b86d-7ca54a7d8a42)
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.
![Screenshot from 2023-12-23 10-05-08](https://github.com/shubhexists/vault/assets/110319892/f9907727-d492-4e5f-ac85-83605079a3b1)

# 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 :)