diff options
| author | 2026-03-06 01:48:44 +0800 | |
|---|---|---|
| committer | 2026-03-06 01:48:44 +0800 | |
| commit | 120509f0aad0e945d8e0fc90a822fa904fb70b68 (patch) | |
| tree | 20a541f059591b35795a1a5d3b7dcf48ec711b6a /repository/refs_test.go | |
| parent | refstore/loose: Fix package-level comment (diff) | |
| signature | No signature | |
repository: Refactor v0.1.55
Diffstat (limited to 'repository/refs_test.go')
| -rw-r--r-- | repository/refs_test.go | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/repository/refs_test.go b/repository/refs_test.go new file mode 100644 index 00000000..8d8c604e --- /dev/null +++ b/repository/refs_test.go @@ -0,0 +1,139 @@ +package repository_test + +import ( + "os" + "testing" + + "codeberg.org/lindenii/furgit/internal/testgit" + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objecttype" + "codeberg.org/lindenii/furgit/ref" + "codeberg.org/lindenii/furgit/repository" +) + +func TestOpenFilesRefFormat(t *testing.T) { + t.Parallel() + + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper + repoHarness := testgit.NewRepo(t, testgit.RepoOptions{ + ObjectFormat: algo, + Bare: true, + RefFormat: "files", + }) + + _, _, commitID := repoHarness.MakeCommit(t, "files refs") + repoHarness.UpdateRef(t, "refs/heads/main", commitID) + repoHarness.SymbolicRef(t, "HEAD", "refs/heads/main") + + root, err := os.OpenRoot(repoHarness.Dir()) + if err != nil { + t.Fatalf("os.OpenRoot: %v", err) + } + + defer func() { _ = root.Close() }() + + repo, err := repository.Open(root) + if err != nil { + t.Fatalf("repository.Open: %v", err) + } + + defer func() { _ = repo.Close() }() + + if repo.Algorithm() != algo { + t.Fatalf("Algorithm = %v, want %v", repo.Algorithm(), algo) + } + + headerType, headerSize, err := repo.Objects().ReadHeader(commitID) + if err != nil { + t.Fatalf("ReadHeader(commit): %v", err) + } + + if headerType != objecttype.TypeCommit { + t.Fatalf("ReadHeader(commit) type = %v, want %v", headerType, objecttype.TypeCommit) + } + + if headerSize <= 0 { + t.Fatalf("ReadHeader(commit) size = %d, want > 0", headerSize) + } + + resolved, err := repo.Refs().Resolve("refs/heads/main") + if err != nil { + t.Fatalf("Resolve(refs/heads/main): %v", err) + } + + detached, ok := resolved.(ref.Detached) + if !ok { + t.Fatalf("Resolve(refs/heads/main) type = %T, want ref.Detached", resolved) + } + + if detached.ID != commitID { + t.Fatalf("Resolve(refs/heads/main) id = %s, want %s", detached.ID, commitID) + } + + head, err := repo.Refs().ResolveFully("HEAD") + if err != nil { + t.Fatalf("ResolveFully(HEAD): %v", err) + } + + if head.ID != commitID { + t.Fatalf("ResolveFully(HEAD) id = %s, want %s", head.ID, commitID) + } + }) +} + +func TestOpenFilesWithPackedRefs(t *testing.T) { + t.Parallel() + + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper + repoHarness := newRepoForRefs(t, algo, "files") + commitID := writeMainAndHead(t, repoHarness) + repoHarness.PackRefs(t, "--all", "--prune") + assertResolveFully(t, repoHarness, "refs/heads/main", commitID) + }) +} + +func newRepoForRefs(t *testing.T, algo objectid.Algorithm, refFormat string) *testgit.TestRepo { + t.Helper() + + return testgit.NewRepo(t, testgit.RepoOptions{ + ObjectFormat: algo, + Bare: true, + RefFormat: refFormat, + }) +} + +func writeMainAndHead(t *testing.T, repoHarness *testgit.TestRepo) objectid.ObjectID { + t.Helper() + _, _, commitID := repoHarness.MakeCommit(t, "refs") + repoHarness.UpdateRef(t, "refs/heads/main", commitID) + repoHarness.SymbolicRef(t, "HEAD", "refs/heads/main") + + return commitID +} + +func assertResolveFully(t *testing.T, repoHarness *testgit.TestRepo, name string, want objectid.ObjectID) { + t.Helper() + + root, err := os.OpenRoot(repoHarness.Dir()) + if err != nil { + t.Fatalf("os.OpenRoot: %v", err) + } + + defer func() { _ = root.Close() }() + + repo, err := repository.Open(root) + if err != nil { + t.Fatalf("repository.Open: %v", err) + } + + defer func() { _ = repo.Close() }() + + resolved, err := repo.Refs().ResolveFully(name) + if err != nil { + t.Fatalf("ResolveFully(%s): %v", name, err) + } + + if resolved.ID != want { + t.Fatalf("ResolveFully(%s) id = %s, want %s", name, resolved.ID, want) + } +} |
