package archive import ( "bytes" "fmt" "io" "os/exec" "github.com/klauspost/compress/zstd" ) // BuildSourceArchive runs `git archive --format=tar HEAD` in repoDir and // compresses the result with zstd. Returns the compressed bytes. // // Only tracked files at HEAD are included. .gitignored files that were // never tracked are excluded. Tracked-then-gitignored files are still // included — callers may warn separately. func BuildSourceArchive(repoDir string) ([]byte, error) { cmd := exec.Command("git", "archive", "--format=tar", "HEAD") cmd.Dir = repoDir var tarOut, stderr bytes.Buffer cmd.Stdout = &tarOut cmd.Stderr = &stderr if err := cmd.Run(); err != nil { return nil, fmt.Errorf("git archive: %v: %s", err, stderr.String()) } var compressed bytes.Buffer enc, err := zstd.NewWriter(&compressed, zstd.WithEncoderLevel(zstd.SpeedDefault)) if err != nil { return nil, err } if _, err := io.Copy(enc, &tarOut); err != nil { _ = enc.Close() return nil, err } if err := enc.Close(); err != nil { return nil, err } return compressed.Bytes(), nil }