aboutsummaryrefslogtreecommitdiff
path: root/repository
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-06 21:19:56 +0800
committerGravatar Runxi Yu2026-03-07 00:34:30 +0800
commit01d15bccf3b1dcc51516b1f64d50950b31d7f8fb (patch)
treee491fcc762c67c1ef4ce54faafc5dafdb734ae8a /repository
parentobjectstored/refstore: Weird ireturn behavior (diff)
signatureNo 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.go30
-rw-r--r--repository/stored_test.go86
-rw-r--r--repository/traversal_test.go76
-rw-r--r--repository/write_loose_test.go44
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 {