package archive import ( "archive/tar" "bytes" "io" "os" "os/exec" "path/filepath" "testing" "github.com/klauspost/compress/zstd" ) func TestBuildSourceArchive_RoundTrip(t *testing.T) { dir := t.TempDir() run := func(name string, args ...string) { t.Helper() cmd := exec.Command(name, args...) cmd.Dir = dir cmd.Env = append(os.Environ(), "GIT_AUTHOR_NAME=t", "GIT_AUTHOR_EMAIL=t@t", "GIT_COMMITTER_NAME=t", "GIT_COMMITTER_EMAIL=t@t", ) out, err := cmd.CombinedOutput() if err != nil { t.Fatalf("%s %v: %v\n%s", name, args, err, out) } } run("git", "init", "-q") if err := os.WriteFile(filepath.Join(dir, "plugin.mod"), []byte("[plugin]\nname=\"x\"\nscope=\"@s\"\nversion=\"0.1.0\"\n"), 0o644); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, "ignored.log"), []byte("nope"), 0o644); err != nil { t.Fatal(err) } if err := os.WriteFile(filepath.Join(dir, ".gitignore"), []byte("ignored.log\n"), 0o644); err != nil { t.Fatal(err) } run("git", "add", "plugin.mod", ".gitignore") run("git", "commit", "-qm", "init") zstdBytes, err := BuildSourceArchive(dir) if err != nil { t.Fatalf("BuildSourceArchive: %v", err) } if len(zstdBytes) == 0 { t.Fatal("empty archive") } dec, err := zstd.NewReader(bytes.NewReader(zstdBytes)) if err != nil { t.Fatal(err) } defer dec.Close() tr := tar.NewReader(dec) got := map[string]string{} for { hdr, err := tr.Next() if err == io.EOF { break } if err != nil { t.Fatal(err) } buf, err := io.ReadAll(tr) if err != nil { t.Fatal(err) } got[hdr.Name] = string(buf) } if _, ok := got["plugin.mod"]; !ok { t.Errorf("expected plugin.mod in archive, got %v", keys(got)) } if _, ok := got["ignored.log"]; ok { t.Errorf("ignored.log should not be in archive (gitignored + untracked)") } } func keys(m map[string]string) []string { out := make([]string, 0, len(m)) for k := range m { out = append(out, k) } return out }