Files
sgard/cmd/sgard/prune.go
Kyle Isom 94963bb8d6 Step 15: CLI wiring, prune, and sgardd daemon.
Local prune: garden.Prune() removes orphaned blobs. 2 tests.

CLI commands: sgard push, sgard pull (with SSH auth via --ssh-key
or ssh-agent), sgard prune (local by default, remote with --remote).

Server daemon: cmd/sgardd with --listen, --repo, --authorized-keys
flags. Runs gRPC server with optional SSH key auth interceptor.

Root command gains --remote and --ssh-key persistent flags with
resolveRemote() (flag > env > repo/remote file).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 00:03:51 -07:00

72 lines
1.4 KiB
Go

package main
import (
"context"
"fmt"
"github.com/kisom/sgard/client"
"github.com/kisom/sgard/garden"
"github.com/spf13/cobra"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
var pruneCmd = &cobra.Command{
Use: "prune",
Short: "Remove orphaned blobs not referenced by the manifest",
Long: "Remove orphaned blobs locally, or on the remote server with --remote.",
RunE: func(cmd *cobra.Command, args []string) error {
addr, _ := resolveRemote()
if addr != "" {
return pruneRemote(addr)
}
return pruneLocal()
},
}
func pruneLocal() error {
g, err := garden.Open(repoFlag)
if err != nil {
return err
}
removed, err := g.Prune()
if err != nil {
return err
}
fmt.Printf("Pruned %d orphaned blob(s).\n", removed)
return nil
}
func pruneRemote(addr string) error {
signer, err := client.LoadSigner(sshKeyFlag)
if err != nil {
return err
}
creds := client.NewSSHCredentials(signer)
conn, err := grpc.NewClient(addr,
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithPerRPCCredentials(creds),
)
if err != nil {
return fmt.Errorf("connecting to %s: %w", addr, err)
}
defer func() { _ = conn.Close() }()
c := client.New(conn)
removed, err := c.Prune(context.Background())
if err != nil {
return err
}
fmt.Printf("Pruned %d orphaned blob(s) on remote.\n", removed)
return nil
}
func init() {
rootCmd.AddCommand(pruneCmd)
}