diff options
Diffstat (limited to 'format')
| -rw-r--r-- | format/pack/ingest/ingest_test.go | 166 | ||||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha1/METADATA.txt | 3 | ||||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha1/base.pack | bin | 0 -> 81007 bytes | |||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha1/nonthin.pack | bin | 0 -> 117458 bytes | |||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha1/thin.pack | bin | 0 -> 38581 bytes | |||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha256/METADATA.txt | 3 | ||||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha256/base.pack | bin | 0 -> 105138 bytes | |||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha256/nonthin.pack | bin | 0 -> 152284 bytes | |||
| -rw-r--r-- | format/pack/ingest/testdata/fixtures/sha256/thin.pack | bin | 0 -> 49412 bytes |
9 files changed, 84 insertions, 88 deletions
diff --git a/format/pack/ingest/ingest_test.go b/format/pack/ingest/ingest_test.go index d1b68cba..5526d839 100644 --- a/format/pack/ingest/ingest_test.go +++ b/format/pack/ingest/ingest_test.go @@ -3,8 +3,6 @@ package ingest_test import ( "bytes" "errors" - "fmt" - "io" "os" "path/filepath" "strings" @@ -16,26 +14,79 @@ import ( "codeberg.org/lindenii/furgit/repository" ) -// thinBaseDistances enumerates candidate main-history distances for thin-pack -// probing. -var thinBaseDistances = [...]int{16, 24, 32, 48, 64, 96, 128, 160, 192, 224, 256, 320} +func fixtureAlgorithmDir(algo objectid.Algorithm) string { + switch algo { + case objectid.AlgorithmSHA1: + return "sha1" + case objectid.AlgorithmSHA256: + return "sha256" + default: + return "" + } +} -// pickThinBase selects one main-history base where git emits a truly thin pack -// for `head ^base`. -func pickThinBase(t *testing.T, sender *testgit.TestRepo, head objectid.ObjectID) objectid.ObjectID { +// fixturePath returns one fixture file path for the selected algorithm. +func fixturePath(t *testing.T, algo objectid.Algorithm, name string) string { t.Helper() - for _, distance := range thinBaseDistances { - base := sender.RevParse(t, fmt.Sprintf("refs/heads/main~%d", distance)) - revs := []string{head.String(), "^" + base.String()} - if sender.PackObjectsIsThin(t, revs) { - return base + dir := fixtureAlgorithmDir(algo) + if dir == "" { + t.Fatalf("unsupported fixture algorithm: %v", algo) + } + + return filepath.Join("testdata", "fixtures", dir, name) +} + +// fixtureBytes reads one fixture file fully. +func fixtureBytes(t *testing.T, algo objectid.Algorithm, name string) []byte { + t.Helper() + + path := fixturePath(t, algo, name) + data, err := os.ReadFile(path) + if err != nil { + t.Fatalf("read fixture %q: %v", path, err) + } + + return data +} + +// fixtureMetadata parses key=value metadata for one algorithm fixture set. +func fixtureMetadata(t *testing.T, algo objectid.Algorithm) map[string]string { + t.Helper() + + data := fixtureBytes(t, algo, "METADATA.txt") + out := make(map[string]string) + for line := range strings.SplitSeq(strings.TrimSpace(string(data)), "\n") { + line = strings.TrimSpace(line) + if line == "" { + continue + } + key, value, ok := strings.Cut(line, "=") + if !ok { + t.Fatalf("invalid fixture metadata line %q", line) } + out[strings.TrimSpace(key)] = strings.TrimSpace(value) + } + + return out +} + +// fixtureOID returns one fixture metadata object ID value. +func fixtureOID(t *testing.T, algo objectid.Algorithm, key string) objectid.ObjectID { + t.Helper() + + meta := fixtureMetadata(t, algo) + hex, ok := meta[key] + if !ok { + t.Fatalf("missing fixture metadata key %q", key) } - t.Fatalf("failed to find thin base for head %s", head.String()) + id, err := objectid.ParseHex(algo, hex) + if err != nil { + t.Fatalf("parse fixture metadata oid %q: %v", hex, err) + } - return objectid.ObjectID{} + return id } // verifyReindexOracle regenerates idx/rev with upstream git index-pack and @@ -77,17 +128,8 @@ func TestIngestNonThinPackWritesPackIdxRev(t *testing.T) { t.Parallel() testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper - sender := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) - sender.MakeManyObjectsHistory(t) - head := sender.RevParse(t, "refs/heads/main") - - reader := sender.PackObjectsReader(t, []string{head.String()}, false) - defer func() { - err := reader.Close() - if err != nil { - t.Fatalf("close pack reader: %v", err) - } - }() + head := fixtureOID(t, algo, "head") + packBytes := fixtureBytes(t, algo, "nonthin.pack") receiver := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) packRoot, err := os.OpenRoot(filepath.Join(receiver.Dir(), "objects", "pack")) @@ -101,7 +143,7 @@ func TestIngestNonThinPackWritesPackIdxRev(t *testing.T) { } }() - result, err := ingest.Ingest(reader, packRoot, algo, false, true, nil) + result, err := ingest.Ingest(bytes.NewReader(packBytes), packRoot, algo, false, true, nil) if err != nil { t.Fatalf("Ingest: %v", err) } @@ -132,19 +174,7 @@ func TestIngestNonThinPackWritesPackIdxRev(t *testing.T) { verifyReindexOracle(t, receiver, packPath, idxPath, revPath) receiver.UpdateRef(t, "refs/heads/main", head) - wantRaw := sender.Run(t, "rev-list", "--objects", "refs/heads/main") - for line := range strings.SplitSeq(strings.TrimSpace(wantRaw), "\n") { - line = strings.TrimSpace(line) - if line == "" { - continue - } - - fields := strings.Fields(line) - if len(fields) == 0 { - continue - } - _ = receiver.Run(t, "cat-file", "-e", fields[0]) - } + _ = receiver.Run(t, "fsck", "--full", "--strict", "--no-progress", "--no-dangling") }) } @@ -152,19 +182,7 @@ func TestIngestThinPackWithoutFixReturnsUnresolved(t *testing.T) { t.Parallel() testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper - sender := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) - sender.MakeManyObjectsHistory(t) - sender.Repack(t, "-a", "-d", "-f", "--window=128", "--depth=128") - - head := sender.RevParse(t, "refs/heads/main") - base := pickThinBase(t, sender, head) - reader := sender.PackObjectsReader(t, []string{head.String(), "^" + base.String()}, true) - defer func() { - err := reader.Close() - if err != nil { - t.Fatalf("close pack reader: %v", err) - } - }() + thinPack := fixtureBytes(t, algo, "thin.pack") receiver := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) packDir := filepath.Join(receiver.Dir(), "objects", "pack") @@ -179,7 +197,7 @@ func TestIngestThinPackWithoutFixReturnsUnresolved(t *testing.T) { } }() - _, err = ingest.Ingest(reader, packRoot, algo, false, true, nil) + _, err = ingest.Ingest(bytes.NewReader(thinPack), packRoot, algo, false, true, nil) if err == nil { t.Fatal("Ingest error = nil, want error") } @@ -203,12 +221,9 @@ func TestIngestThinPackWithFixThin(t *testing.T) { t.Parallel() testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper - sender := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) - sender.MakeManyObjectsHistory(t) - sender.Repack(t, "-a", "-d", "-f", "--window=128", "--depth=128") - - head := sender.RevParse(t, "refs/heads/main") - base := pickThinBase(t, sender, head) + head := fixtureOID(t, algo, "head") + basePack := fixtureBytes(t, algo, "base.pack") + thinPack := fixtureBytes(t, algo, "thin.pack") receiver := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) packRoot, err := os.OpenRoot(filepath.Join(receiver.Dir(), "objects", "pack")) @@ -222,16 +237,10 @@ func TestIngestThinPackWithFixThin(t *testing.T) { } }() - baseReader := sender.PackObjectsReader(t, []string{base.String()}, false) - _, err = ingest.Ingest(baseReader, packRoot, algo, false, false, nil) + _, err = ingest.Ingest(bytes.NewReader(basePack), packRoot, algo, false, false, nil) if err != nil { - _ = baseReader.Close() t.Fatalf("ingest base pack: %v", err) } - err = baseReader.Close() - if err != nil { - t.Fatalf("close base reader: %v", err) - } receiverRoot, err := os.OpenRoot(receiver.Dir()) if err != nil { @@ -255,16 +264,10 @@ func TestIngestThinPackWithFixThin(t *testing.T) { } }() - thinReader := sender.PackObjectsReader(t, []string{head.String(), "^" + base.String()}, true) - result, err := ingest.Ingest(thinReader, packRoot, algo, true, true, receiverRepo.Objects()) + result, err := ingest.Ingest(bytes.NewReader(thinPack), packRoot, algo, true, true, receiverRepo.Objects()) if err != nil { - _ = thinReader.Close() t.Fatalf("Ingest(thin): %v", err) } - err = thinReader.Close() - if err != nil { - t.Fatalf("close thin reader: %v", err) - } if !result.ThinFixed { t.Fatal("ThinFixed = false, want true") } @@ -283,20 +286,7 @@ func TestIngestPackTrailerMismatch(t *testing.T) { t.Parallel() testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper - sender := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true}) - sender.MakeManyObjectsHistory(t) - head := sender.RevParse(t, "refs/heads/main") - - stream := sender.PackObjectsReader(t, []string{head.String()}, false) - packBytes, err := io.ReadAll(stream) - if err != nil { - _ = stream.Close() - t.Fatalf("read pack stream: %v", err) - } - err = stream.Close() - if err != nil { - t.Fatalf("close stream: %v", err) - } + packBytes := fixtureBytes(t, algo, "nonthin.pack") if len(packBytes) == 0 { t.Fatal("empty pack stream") } diff --git a/format/pack/ingest/testdata/fixtures/sha1/METADATA.txt b/format/pack/ingest/testdata/fixtures/sha1/METADATA.txt new file mode 100644 index 00000000..5fcbfe26 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha1/METADATA.txt @@ -0,0 +1,3 @@ +format=sha1 +head=200c960359dad025b4170284c518919eb4a24305 +base=4bc507fc631ea78474d83c47548743c9f1dda0dc diff --git a/format/pack/ingest/testdata/fixtures/sha1/base.pack b/format/pack/ingest/testdata/fixtures/sha1/base.pack Binary files differnew file mode 100644 index 00000000..3d7a4903 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha1/base.pack diff --git a/format/pack/ingest/testdata/fixtures/sha1/nonthin.pack b/format/pack/ingest/testdata/fixtures/sha1/nonthin.pack Binary files differnew file mode 100644 index 00000000..ea07c9a0 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha1/nonthin.pack diff --git a/format/pack/ingest/testdata/fixtures/sha1/thin.pack b/format/pack/ingest/testdata/fixtures/sha1/thin.pack Binary files differnew file mode 100644 index 00000000..95084feb --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha1/thin.pack diff --git a/format/pack/ingest/testdata/fixtures/sha256/METADATA.txt b/format/pack/ingest/testdata/fixtures/sha256/METADATA.txt new file mode 100644 index 00000000..8a5ea0a2 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha256/METADATA.txt @@ -0,0 +1,3 @@ +format=sha256 +head=35cc0f4cd1c73524187540494058d233a2ecbd071c85d496a2250d8e0c805ef8 +base=b4abe46895f0bb5aa22fd42d28d428413f265359734c288752e3c2d270eec276 diff --git a/format/pack/ingest/testdata/fixtures/sha256/base.pack b/format/pack/ingest/testdata/fixtures/sha256/base.pack Binary files differnew file mode 100644 index 00000000..52ceef74 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha256/base.pack diff --git a/format/pack/ingest/testdata/fixtures/sha256/nonthin.pack b/format/pack/ingest/testdata/fixtures/sha256/nonthin.pack Binary files differnew file mode 100644 index 00000000..50db05d0 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha256/nonthin.pack diff --git a/format/pack/ingest/testdata/fixtures/sha256/thin.pack b/format/pack/ingest/testdata/fixtures/sha256/thin.pack Binary files differnew file mode 100644 index 00000000..b331b915 --- /dev/null +++ b/format/pack/ingest/testdata/fixtures/sha256/thin.pack |
