diff options
| author | 2026-03-06 21:19:56 +0800 | |
|---|---|---|
| committer | 2026-03-07 00:34:30 +0800 | |
| commit | 01d15bccf3b1dcc51516b1f64d50950b31d7f8fb (patch) | |
| tree | e491fcc762c67c1ef4ce54faafc5dafdb734ae8a /repository | |
| parent | objectstored/refstore: Weird ireturn behavior (diff) | |
| signature | No signature | |
Urgh I made some wrong amends and I'm too tired to separate the commits out this time
ancestor: Split out of reachability
mergebase: Add merge base routines
internal/commitquery: Add commit query context engine thingy
internal/peel: Shared tag peeling
errors: Shared object query errors
internal/testgit: Add rooted repo helpers; remove raw path access
objectstore/memory: Add in-memory object store
objectid: Add Compare helper
Diffstat (limited to 'repository')
| -rw-r--r-- | repository/refs_test.go | 30 | ||||
| -rw-r--r-- | repository/stored_test.go | 86 | ||||
| -rw-r--r-- | repository/traversal_test.go | 76 | ||||
| -rw-r--r-- | repository/write_loose_test.go | 44 |
4 files changed, 62 insertions, 174 deletions
diff --git a/repository/refs_test.go b/repository/refs_test.go index 8d8c604e..8b2676a2 100644 --- a/repository/refs_test.go +++ b/repository/refs_test.go @@ -1,14 +1,12 @@ 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) { @@ -25,19 +23,7 @@ func TestOpenFilesRefFormat(t *testing.T) { 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() }() + repo := repoHarness.OpenRepository(t) if repo.Algorithm() != algo { t.Fatalf("Algorithm = %v, want %v", repo.Algorithm(), algo) @@ -114,19 +100,7 @@ func writeMainAndHead(t *testing.T, repoHarness *testgit.TestRepo) objectid.Obje 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() }() + repo := repoHarness.OpenRepository(t) resolved, err := repo.Refs().ResolveFully(name) if err != nil { diff --git a/repository/stored_test.go b/repository/stored_test.go index 0ca88664..cefb4cbe 100644 --- a/repository/stored_test.go +++ b/repository/stored_test.go @@ -2,14 +2,12 @@ package repository_test import ( "fmt" - "os" "strings" "testing" "codeberg.org/lindenii/furgit/internal/testgit" "codeberg.org/lindenii/furgit/object" "codeberg.org/lindenii/furgit/objectid" - "codeberg.org/lindenii/furgit/repository" ) func TestReadStoredTyped(t *testing.T) { @@ -24,19 +22,7 @@ func TestReadStoredTyped(t *testing.T) { blobID, treeID, commitID := repoHarness.MakeCommit(t, "stored types") - 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() }() + repo := repoHarness.OpenRepository(t) blob, err := repo.ReadStoredBlob(blobID) if err != nil { @@ -93,19 +79,7 @@ func TestResolveTreeEntry(t *testing.T) { childTreeID := repoHarness.Mktree(t, fmt.Sprintf("100644 blob %s\tleaf.txt\n", blobID)) rootTreeID := repoHarness.Mktree(t, fmt.Sprintf("040000 tree %s\tdir\n", childTreeID)) - 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() }() + repo := repoHarness.OpenRepository(t) rootTree, err := repo.ReadStoredTree(rootTreeID) if err != nil { @@ -141,19 +115,7 @@ func TestResolveTreeEntryErrors(t *testing.T) { blobID := repoHarness.HashObject(t, "blob", []byte("body\n")) rootTreeID := repoHarness.Mktree(t, fmt.Sprintf("100644 blob %s\tfile.txt\n", blobID)) - 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() }() + repo := repoHarness.OpenRepository(t) rootTree, err := repo.ReadStoredTree(rootTreeID) if err != nil { @@ -176,19 +138,7 @@ func TestResolveTreeEntryErrors(t *testing.T) { blobID := repoHarness.HashObject(t, "blob", []byte("body\n")) rootTreeID := repoHarness.Mktree(t, fmt.Sprintf("100644 blob %s\tdir\n", blobID)) - 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() }() + repo := repoHarness.OpenRepository(t) rootTree, err := repo.ReadStoredTree(rootTreeID) if err != nil { @@ -227,19 +177,7 @@ func TestResolveTreeEntryDeepPath(t *testing.T) { parts = append(parts, []byte("leaf.txt")) - 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() }() + repo := repoHarness.OpenRepository(t) rootTree, err := repo.ReadStoredTree(currentTree) if err != nil { @@ -287,19 +225,7 @@ func TestReadStoredTreeMixedModes(t *testing.T) { ), ) - 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() }() + repo := repoHarness.OpenRepository(t) rootTree, err := repo.ReadStoredTree(rootTreeID) if err != nil { diff --git a/repository/traversal_test.go b/repository/traversal_test.go index ff3614dc..d5eaabb4 100644 --- a/repository/traversal_test.go +++ b/repository/traversal_test.go @@ -31,7 +31,8 @@ func TestRepositoryDepthFirstEnumerationFromHEAD(t *testing.T) { repoHarness.UpdateRef(t, "refs/heads/main", commit2) repoHarness.SymbolicRef(t, "HEAD", "refs/heads/main") - walkRepositoryFromHead(t, repoHarness.Dir()) + root := repoHarness.OpenGitRoot(t) + walkRepositoryFromRoot(t, root, "test repo") }) } @@ -39,38 +40,51 @@ func TestRepositoryDepthFirstEnumerationCurrentWorktree(t *testing.T) { t.Parallel() worktreeRoot := filepath.Clean("..") - gitPath := filepath.Join(worktreeRoot, ".git") - info, err := os.Stat(gitPath) + worktreeFS, err := os.OpenRoot(worktreeRoot) if err != nil { - t.Fatalf("stat %q: %v", gitPath, err) + t.Fatalf("os.OpenRoot(%q): %v", worktreeRoot, err) + } + + defer func() { _ = worktreeFS.Close() }() + + info, err := worktreeFS.Stat(".git") + if err != nil { + t.Fatalf("stat %q: %v", filepath.Join(worktreeRoot, ".git"), err) } if info.IsDir() { - walkRepositoryFromHead(t, gitPath) + gitRoot, err := worktreeFS.OpenRoot(".git") + if err != nil { + t.Fatalf("OpenRoot(.git): %v", err) + } + + defer func() { _ = gitRoot.Close() }() + + walkRepositoryFromRoot(t, gitRoot, filepath.Join(worktreeRoot, ".git")) return } if !info.Mode().IsRegular() { - t.Fatalf("%q is neither a directory nor a regular file", gitPath) + t.Fatalf("%q is neither a directory nor a regular file", filepath.Join(worktreeRoot, ".git")) } - content, err := os.ReadFile(gitPath) //#nosec G304 + content, err := worktreeFS.ReadFile(".git") if err != nil { - t.Fatalf("read %q: %v", gitPath, err) + t.Fatalf("read %q: %v", filepath.Join(worktreeRoot, ".git"), err) } line := strings.TrimSpace(string(content)) prefix := "gitdir: " if !strings.HasPrefix(line, prefix) { - t.Fatalf("%q file does not begin with %q", gitPath, prefix) + t.Fatalf("%q file does not begin with %q", filepath.Join(worktreeRoot, ".git"), prefix) } gitdirRel := strings.TrimSpace(line[len(prefix):]) if gitdirRel == "" { - t.Fatalf("%q contains empty gitdir path", gitPath) + t.Fatalf("%q contains empty gitdir path", filepath.Join(worktreeRoot, ".git")) } gitdirPath := gitdirRel @@ -78,42 +92,54 @@ func TestRepositoryDepthFirstEnumerationCurrentWorktree(t *testing.T) { gitdirPath = filepath.Join(worktreeRoot, gitdirPath) } - commondirPath := filepath.Join(gitdirPath, "commondir") + gitRoot, err := os.OpenRoot(gitdirPath) + if err != nil { + t.Fatalf("os.OpenRoot(%q): %v", gitdirPath, err) + } + + defer func() { _ = gitRoot.Close() }() - commondirContent, err := os.ReadFile(commondirPath) //#nosec G304 + commondirContent, err := gitRoot.ReadFile("commondir") if err != nil { - t.Fatalf("read %q: %v", commondirPath, err) + t.Fatalf("read %q: %v", filepath.Join(gitdirPath, "commondir"), err) } repoPath := strings.TrimSpace(string(commondirContent)) if repoPath == "" { - t.Fatalf("%q contains empty repo path", commondirPath) + t.Fatalf("%q contains empty repo path", filepath.Join(gitdirPath, "commondir")) } if filepath.IsAbs(repoPath) { - walkRepositoryFromHead(t, repoPath) + repoRoot, err := os.OpenRoot(repoPath) + if err != nil { + t.Fatalf("os.OpenRoot(%q): %v", repoPath, err) + } + + defer func() { _ = repoRoot.Close() }() + + walkRepositoryFromRoot(t, repoRoot, repoPath) return } repoPath = filepath.Join(gitdirPath, repoPath) - walkRepositoryFromHead(t, repoPath) -} - -func walkRepositoryFromHead(t *testing.T, repoPath string) { - t.Helper() - - root, err := os.OpenRoot(repoPath) + repoRoot, err := os.OpenRoot(repoPath) if err != nil { t.Fatalf("os.OpenRoot(%q): %v", repoPath, err) } - defer func() { _ = root.Close() }() + defer func() { _ = repoRoot.Close() }() + + walkRepositoryFromRoot(t, repoRoot, repoPath) +} + +func walkRepositoryFromRoot(t *testing.T, root *os.Root, label string) { + t.Helper() repo, err := repository.Open(root) if err != nil { - t.Fatalf("repository.Open(root for %q): %v", repoPath, err) + t.Fatalf("repository.Open(root for %q): %v", label, err) } defer func() { _ = repo.Close() }() @@ -129,7 +155,7 @@ func walkRepositoryFromHead(t *testing.T, repoPath string) { } if objectsRead <= 0 { - t.Fatalf("no objects were enumerated from HEAD (%s)", fmt.Sprintf("%q", repoPath)) + t.Fatalf("no objects were enumerated from HEAD (%s)", fmt.Sprintf("%q", label)) } } diff --git a/repository/write_loose_test.go b/repository/write_loose_test.go index 6cd9b8a1..6b0a8572 100644 --- a/repository/write_loose_test.go +++ b/repository/write_loose_test.go @@ -2,13 +2,11 @@ package repository_test import ( "bytes" - "os" "testing" "codeberg.org/lindenii/furgit/internal/testgit" "codeberg.org/lindenii/furgit/objectid" "codeberg.org/lindenii/furgit/objecttype" - "codeberg.org/lindenii/furgit/repository" ) func TestWriteLooseBytesContent(t *testing.T) { @@ -21,19 +19,7 @@ func TestWriteLooseBytesContent(t *testing.T) { RefFormat: "files", }) - 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() }() + repo := repoHarness.OpenRepository(t) content := []byte("write-loose-bytes-content\n") @@ -72,19 +58,7 @@ func TestWriteLooseReaderContent(t *testing.T) { RefFormat: "files", }) - 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() }() + repo := repoHarness.OpenRepository(t) content := []byte("write-loose-reader-content\n") @@ -111,19 +85,7 @@ func TestWriteLooseFull(t *testing.T) { }) _, _, commitID := repoHarness.MakeCommit(t, "write-loose-full") - 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() }() + repo := repoHarness.OpenRepository(t) raw, err := repo.Objects().ReadBytesFull(commitID) if err != nil { |
