Step 4: Garden core with Init, Open, Add and CLI commands.

Garden package ties manifest and store together. Supports adding
files (hashed and stored as blobs), directories (manifest-only),
and symlinks (target recorded). Paths under $HOME are stored as
~/... in the manifest for portability. CLI init and add commands
wired up via cobra.

8 tests covering init, open, add for all three entry types,
duplicate rejection, HashFile, and tilde path expansion.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-23 21:34:55 -07:00
parent 87db4b912f
commit 1550bdf940
7 changed files with 529 additions and 10 deletions

19
garden/hasher.go Normal file
View File

@@ -0,0 +1,19 @@
package garden
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"os"
)
// HashFile computes the SHA-256 hash of the file at path and returns
// the hex-encoded hash string.
func HashFile(path string) (string, error) {
data, err := os.ReadFile(path)
if err != nil {
return "", fmt.Errorf("hashing file: %w", err)
}
sum := sha256.Sum256(data)
return hex.EncodeToString(sum[:]), nil
}