From 120509f0aad0e945d8e0fc90a822fa904fb70b68 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 6 Mar 2026 01:48:44 +0800 Subject: repository: Refactor --- repository/refs_test.go | 139 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 repository/refs_test.go (limited to 'repository/refs_test.go') 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) + } +} -- cgit v1.3.1-10-gc9f91