Zig quickstart

This is a ~60-second round-trip: snapshot a directory, push it to a local file:// store, then pull it back and confirm the ID matches. Snapshot IDs are 64-character lowercase hex and bit-identical to the CLI and every other binding, so the ID you print here is the exact string snapdir id produces.

1. Install

Build the snapdir-ffi C ABI from crates.io and zig fetch --save the wrapper (Zig 0.13.0). See Install snapdir for Zig for the full recipe, including the Alpine/musl libgcc_s note.

2. Snapshot + push

Compute the snapshot ID for a directory, then push it to a local store. The store URI is always an argument — file://$PWD/store needs no setup:

const std = @import("std");
const snapdir = @import("snapdir");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const a = gpa.allocator();

    const store = try std.fmt.allocPrintZ(a, "file://{s}/store", .{
        try std.process.getEnvVarOwned(a, "PWD"),
    });
    defer a.free(store);

    // Walk ./my-dir → 64-char snapshot id ([64]u8 value, no free).
    const id = try snapdir.id(a, "./my-dir", .{});
    std.debug.print("id:     {s}\n", .{id});

    // Upload the snapshot to the store; returns the same id.
    const pushed = try snapdir.push(a, "./my-dir", store, .{});
    std.debug.print("pushed: {s}\n", .{pushed});
}

This prints a 64-character lowercase hex ID, e.g. <snapshot-id>.

3. Pull it back

Materialise the snapshot into a fresh directory and recompute its ID — it is the same 64-hex string:

    // pull(id, store, dest) restores the snapshot into ./restored.
    try snapdir.pull(a, &pushed, store, "./restored", .{});

    const restored_id = try snapdir.id(a, "./restored", .{});
    std.debug.print("restored: {s}\n", .{restored_id}); // == id

That is the same snapshot ID you would get from snapdir id or snapdir push on the command line — the Zig binding and the CLI share one Rust core.