42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
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
|
|
}
|