ghee 0.6.1

That thin layer of data change management over the filesystem
Documentation
# Ghee History

Ghee's development began as an adjunct to the the [Audiotater](https://git.disroot.org/joshhansen/audiotater) audio annotation tool,
but soon developed a life of its own.

## 0.1.0 - 2 Aug 2023 (as "Hatter")

Initial release including commands to manipulate individual records: `cp`, `mv`, `rm`, `get`, `set`.

### 0.2.0 (as "Mattress")

First command that operates on records as a group ("table"): `idx`.

Also generates shell completions for Bash, Fish, PowerShell, Elvish, and anything else that `clap_complete` supports.

Rename from Hatter to Mattress.

### 0.2.1 (as "Mattress")

Implement setting of user.mattress.keyname

### 0.3.0 - 10 Aug 2023

* Make `get` recursive by default
* SQL WHERE-style select clauses using `-w --where`
* Rename from Mattress to Ghee. Third time's the charm, right?

### 0.4.0 - 30 Aug 2023

Introduces the REPL and subcommands `init`, `ins`, `del`, and `ls`.

Both `get` and `del` now use the best available index to minimize traversals.

-[x] REPL
-[x] `ins` for adding to table while maintaining related indexes
-[x] `ins` from JSON
-[x] `del` for removing from table while maintaining related indexes
-[x] `ls` to show Ghee's view of the world
-[x] `init` to initialize a directory as a full-fledged Ghee table (with specified key names)
-[x] Sensible default destination for `idx`
-[x] Make `get` stop listing nested indices
-[x] Make `get` accelerate traversal using the best available index (a la `del`)
-[x] Make `get` return paths from original index rather than the one used to accelerate
-[x] Fix output order, making commands reproducible

### 0.5.0 - 19 Sep 2023

Maintains soundness of indices when `rm`ing, `set`ing, `cp`ing, and `mv`ing.

Makes `rm` and `set` recursive, with optional opt-out.

Unit tests all commands.

Introduces `create`; like `init` but creates the directory for you.

Adds the ability to insert from JSON on `init`.

-[x] `init`: allow `ins`-like insertion from JSON
-[x] `create` to create directory and then `init`
-[x] Test predicates using default key names, e.g. `key0<10`
-[x] `rm`: recursive by default
-[x] `rm`: when removing indexed xattrs, update the relevant indices
-[x] `set`: recursive by default
-[x] `set`: when setting indexed xattrs, update the relevant indices
-[x] Test `cp_or_mv`
-[x] Test `ls`

## 0.5.1

Fixes a bug when indices were chained together but not reflected in all related indices' table info.

-[x] `idx`: ensure that indices beyond the second result in all related indices being declared as related

## 0.6.0 - 2 Oct 2023

Introduces tools for snapshotting and rolling back the state of Ghee tables, built using Btrfs subvolume snapshots.

The `commit` command makes a snapshot of the current state; `log` lists past changes; `restore` returns files to their
`HEAD` state; and `reset` returns all files to their state in a specified commit.

As in Git, a reference to a `HEAD` commit is maintained, but Ghee stores it in the extended attribute `user.ghee.v0.HEAD`.

(Versioning of the `user.ghee` xattr namespace is also accomplished in this release.)

A `touch` command is introduced to allow easy creation of files, whose xattrs will be inferred from their position within the
table / index directory structure.

Snapshot testing has been greatly strengthened, testing against ext4 and btrfs filesystems as well as relative and absolute paths.

-[x] ~~`init`~~: `create`: create as a Btrfs subvolume when possible
-[x] `ghee commit ./people -m "message!"`: commit the `./people` table in its current form with message "message!"
-[x] `ghee log ./people`: show commit messages for all commits in the `./people` table.
-[x] `commit`: inherit snapshot dir ownership from parent
-[x] `commit`: unit test; implemented, but disabled as it requires superuser
-[x] `ghee status ./people`: show how the ./people table has changed since last commit; using CoW snapshots
-[x] `ghee reset ./people gf037d2c98`: replace the current contents of the `./people` table to its state in commit gf037d2c98
-[x] `ghee restore ./people`: replace all changed files in `./people` with their versions in the most recent commit
-[x] Test `get` on non-table? Whatever that bug is...
-[x] Ensure all commands accept relative paths
-[-] Maybe store table index paths as relative paths? (Then we can operate on snapshots directly.)
     Rejected in favor of storing absolute paths, which we then relativize
-[x] Cover absolute paths in example.sh
-[x] Version user.ghee namespace
-[x] Rename most-recent-snapshot -> HEAD
-[x] Update README.md for 0.6

## 0.6.1 - 2 Oct 2023

Points the `btrfsutil` dependency at a published crate version rather than Git repository.