package gitutil import ( "context" "os" "os/exec" "path/filepath" "testing" ) func TestPackObjectsIsIncremental(t *testing.T) { dir := initTestRepository(t) git := Git{Dir: dir} ctx := context.Background() first := commitFile(t, dir, "example.txt", "first\n", "first") firstPack, err := git.PackObjects(ctx, []string{first}, nil) if err != nil { t.Fatal(err) } defer firstPack.Close() if firstPack.Objects != 3 { t.Fatalf("first pack has %d objects, want 3", firstPack.Objects) } if _, err := os.Stat(firstPack.IndexPath); err != nil { t.Fatalf("pack index was not created: %v", err) } second := commitFile(t, dir, "example.txt", "second\n", "second") secondPack, err := git.PackObjects(ctx, []string{second}, []string{first}) if err != nil { t.Fatal(err) } defer secondPack.Close() if secondPack.Objects != 3 { t.Fatalf("incremental pack has %d objects, want 3", secondPack.Objects) } loose, ok, err := git.SmallLooseObjects(ctx, secondPack, 64, 8<<20) if err != nil { t.Fatal(err) } if !ok || len(loose) != int(secondPack.Objects) { t.Fatalf("SmallLooseObjects() returned %d objects, ok=%v; want %d", len(loose), ok, secondPack.Objects) } for _, object := range loose { if _, err := os.Stat(object.Path); err != nil { t.Fatalf("loose object %s is unavailable: %v", object.OID, err) } } } func initTestRepository(t *testing.T) string { t.Helper() dir := t.TempDir() runTestGit(t, dir, "init", "-b", "main") runTestGit(t, dir, "config", "user.name", "Dumbforge Test") runTestGit(t, dir, "config", "user.email", "test@dumbforge.invalid") return dir } func commitFile(t *testing.T, dir, name, contents, message string) string { t.Helper() filename := filepath.Join(dir, name) if err := os.MkdirAll(filepath.Dir(filename), 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(filename, []byte(contents), 0o644); err != nil { t.Fatal(err) } runTestGit(t, dir, "add", name) runTestGit(t, dir, "commit", "-m", message) cmd := exec.Command("git", "-C", dir, "rev-parse", "HEAD") out, err := cmd.Output() if err != nil { t.Fatal(err) } return string(out[:len(out)-1]) } func runTestGit(t *testing.T, dir string, args ...string) { t.Helper() args = append([]string{"-C", dir}, args...) cmd := exec.Command("git", args...) if out, err := cmd.CombinedOutput(); err != nil { t.Fatalf("git %v: %v\n%s", args, err, out) } }