Go quickstart

This is a ~60-second round-trip through a local file:// store: compute a snapshot ID, push a directory, then pull it back and confirm the ID is unchanged. Snapshot IDs are 64-character lowercase hex strings, bit-identical to the CLI and every other binding.

1. Install

Add the module and build the native snapdir-ffi artefacts — see Install snapdir for Go for the full recipe:

go get github.com/snapdir/snapdir/bindings/go@v1.11.0

2. Snapshot + push

The store URI is always an argument. With no setup, use a local file:// store under the current directory:

package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"path/filepath"

	snapdir "github.com/snapdir/snapdir/bindings/go"
)

func main() {
	ctx := context.Background()

	cwd, err := os.Getwd()
	if err != nil {
		log.Fatal(err)
	}
	store := "file://" + filepath.Join(cwd, "store")

	// Compute the snapshot ID for a directory (64-char lowercase hex).
	id, err := snapdir.ID(ctx, "./my-dir", nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("id:  ", id)

	// Push the directory to the store; returns the same snapshot ID.
	sid, err := snapdir.Push(ctx, "./my-dir", store)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("push:", sid)
}

This prints the 64-hex snapshot ID twice — snapdir.ID and snapdir.Push agree.

3. Pull it back

Pull the snapshot into a fresh directory, then re-compute its ID to prove the round-trip is lossless:

dest := "./restored"
if err := snapdir.Pull(ctx, sid, store, dest); err != nil {
	log.Fatal(err)
}

back, err := snapdir.ID(ctx, dest, nil)
if err != nil {
	log.Fatal(err)
}
fmt.Println("back:", back) // == sid

The back value equals sid — and it is the exact same snapshot ID you would get from snapdir id / snapdir push on the command line.