ref: dc7c74b9b0c6fe66bad9119b2d29e00f70a7cd3b
parent: b46eba214daa9a6ede179ed543033b0f3485ec2e
author: Runxi Yu <runxiyu@umich.edu>
date: Wed Mar 11 22:12:17 EDT 2026
refstore: More fixes on ResolveToDetached
--- a/receivepack/int_test.go
+++ b/receivepack/int_test.go
@@ -393,7 +393,7 @@
resolved, err := reopened.Refs().ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if resolved.ID != commitID {@@ -697,7 +697,7 @@
resolved, err := repo.Refs().ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if resolved.ID != currentID {@@ -788,7 +788,7 @@
resolved, err := receiver.OpenRepository(t).Refs().ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if resolved.ID != commitID {@@ -838,7 +838,7 @@
resolved, err := receiver.OpenRepository(t).Refs().ResolveToDetached("refs/heads/topic") if err != nil {- t.Fatalf("ResolveFully(topic): %v", err)+ t.Fatalf("ResolveToDetached(topic): %v", err)}
if resolved.ID != commitID {@@ -939,7 +939,7 @@
resolved, err := receiver.OpenRepository(t).Refs().ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if resolved.ID != currentID {--- a/refstore/chain/resolve.go
+++ b/refstore/chain/resolve.go
@@ -32,9 +32,9 @@
return nil, refstore.ErrReferenceNotFound
}
-// ResolveFully resolves symbolic references through Resolve until detached.
+// ResolveToDetached resolves symbolic references through Resolve until detached.
//
-// It intentionally does not call backend ResolveFully. This allows symbolic
+// It intentionally does not call backend ResolveToDetached. This allows symbolic
// references to cross backends in the chain.
func (chain *Chain) ResolveToDetached(name string) (ref.Detached, error) {cur := name
--- a/refstore/files/packed_delete_test.go
+++ b/refstore/files/packed_delete_test.go
@@ -55,11 +55,11 @@
got, err := store.ResolveToDetached(prefix + "/foo")
if err != nil {- t.Fatalf("ResolveFully(lock held): %v", err)+ t.Fatalf("ResolveToDetached(lock held): %v", err)}
if got.ID != looseID {- t.Fatalf("ResolveFully(lock held) = %s, want %s", got.ID, looseID)+ t.Fatalf("ResolveToDetached(lock held) = %s, want %s", got.ID, looseID)}
gitRoot := testRepo.OpenGitRoot(t)
@@ -108,11 +108,11 @@
got, err := store.ResolveToDetached(prefix + "/foo")
if err != nil {- t.Fatalf("ResolveFully(new exists): %v", err)+ t.Fatalf("ResolveToDetached(new exists): %v", err)}
if got.ID != looseID {- t.Fatalf("ResolveFully(new exists) = %s, want %s", got.ID, looseID)+ t.Fatalf("ResolveToDetached(new exists) = %s, want %s", got.ID, looseID)}
})
})
@@ -184,11 +184,11 @@
got, err := store.ResolveToDetached(name)
if err != nil {- t.Fatalf("ResolveFully: %v", err)+ t.Fatalf("ResolveToDetached: %v", err)}
if got.ID != commitID {- t.Fatalf("ResolveFully = %s, want %s", got.ID, commitID)+ t.Fatalf("ResolveToDetached = %s, want %s", got.ID, commitID)}
actual := make([]string, 0)
@@ -206,7 +206,7 @@
for _, name := range actual {refValue, resolveErr := store.ResolveToDetached(name)
if resolveErr != nil {- t.Fatalf("ResolveFully(%q): %v", name, resolveErr)+ t.Fatalf("ResolveToDetached(%q): %v", name, resolveErr)}
fullActual = append(fullActual, refValue.ID.String()+" "+name)
@@ -264,11 +264,11 @@
got, err := store.ResolveToDetached(prefix + "/foo")
if err != nil {- t.Fatalf("ResolveFully while lock held: %v", err)+ t.Fatalf("ResolveToDetached while lock held: %v", err)}
if got.ID != looseID {- t.Fatalf("ResolveFully while lock held = %s, want %s", got.ID, looseID)+ t.Fatalf("ResolveToDetached while lock held = %s, want %s", got.ID, looseID)}
testRepo.Remove(t, "packed-refs.lock")
--- a/refstore/files/read_resolve_fully.go
+++ b/refstore/files/read_resolve_fully.go
@@ -7,7 +7,7 @@
"codeberg.org/lindenii/furgit/ref"
)
-// ResolveFully resolves symbolic references through the visible files store
+// ResolveToDetached resolves symbolic references through the visible files store
// namespace until one detached reference is reached.
func (store *Store) ResolveToDetached(name string) (ref.Detached, error) {cur := name
--- a/refstore/files/resolve_list_test.go
+++ b/refstore/files/resolve_list_test.go
@@ -55,11 +55,11 @@
fullHead, err := store.ResolveToDetached("HEAD") if err != nil {- t.Fatalf("ResolveFully(HEAD): %v", err)+ t.Fatalf("ResolveToDetached(HEAD): %v", err)}
if fullHead.ID != looseID {- t.Fatalf("ResolveFully(HEAD) = %s, want %s", fullHead.ID, looseID)+ t.Fatalf("ResolveToDetached(HEAD) = %s, want %s", fullHead.ID, looseID)}
allRefs, err := store.List("")@@ -98,20 +98,20 @@
got, err := store.ResolveToDetached("refs/heads/no-lf") if err != nil {- t.Fatalf("ResolveFully(no-lf): %v", err)+ t.Fatalf("ResolveToDetached(no-lf): %v", err)}
if got.ID != oid {- t.Fatalf("ResolveFully(no-lf) = %s, want %s", got.ID, oid)+ t.Fatalf("ResolveToDetached(no-lf) = %s, want %s", got.ID, oid)}
got, err = store.ResolveToDetached("refs/heads/trailing-ws") if err != nil {- t.Fatalf("ResolveFully(trailing-ws): %v", err)+ t.Fatalf("ResolveToDetached(trailing-ws): %v", err)}
if got.ID != oid {- t.Fatalf("ResolveFully(trailing-ws) = %s, want %s", got.ID, oid)+ t.Fatalf("ResolveToDetached(trailing-ws) = %s, want %s", got.ID, oid)}
_, err = store.Resolve("refs/heads/leading-ws")@@ -219,11 +219,11 @@
got, err := store.ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if got.ID == oneID {- t.Fatalf("ResolveFully(main) unexpectedly returned stale packed id %s", oneID)+ t.Fatalf("ResolveToDetached(main) unexpectedly returned stale packed id %s", oneID)}
tagRef, err := store.Resolve("refs/tags/v1.0")--- a/refstore/files/transaction_dirs_test.go
+++ b/refstore/files/transaction_dirs_test.go
@@ -59,7 +59,7 @@
got, err := store.ResolveToDetached("refs/e-update/foo") if err != nil {- t.Fatalf("ResolveFully(updated foo): %v", err)+ t.Fatalf("ResolveToDetached(updated foo): %v", err)}
if got.ID != newID {@@ -86,7 +86,7 @@
got, err = store.ResolveToDetached("refs/e-create/foo") if err != nil {- t.Fatalf("ResolveFully(created foo): %v", err)+ t.Fatalf("ResolveToDetached(created foo): %v", err)}
if got.ID != oldID {--- a/refstore/files/transaction_pseudoref_test.go
+++ b/refstore/files/transaction_pseudoref_test.go
@@ -37,7 +37,7 @@
got, err := store.ResolveToDetached("PSEUDOREF") if err != nil {- t.Fatalf("ResolveFully(PSEUDOREF): %v", err)+ t.Fatalf("ResolveToDetached(PSEUDOREF): %v", err)}
if got.ID != aID {@@ -61,7 +61,7 @@
got, err = store.ResolveToDetached("PSEUDOREF") if err != nil {- t.Fatalf("ResolveFully(PSEUDOREF) after update: %v", err)+ t.Fatalf("ResolveToDetached(PSEUDOREF) after update: %v", err)}
if got.ID != bID {--- a/refstore/files/transaction_symbolic_test.go
+++ b/refstore/files/transaction_symbolic_test.go
@@ -56,7 +56,7 @@
got, err := store.ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if got.ID != mainID {--- a/refstore/files/transaction_update_test.go
+++ b/refstore/files/transaction_update_test.go
@@ -40,11 +40,11 @@
got, err := store.ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if got.ID != newID {- t.Fatalf("ResolveFully(main) = %s, want %s", got.ID, newID)+ t.Fatalf("ResolveToDetached(main) = %s, want %s", got.ID, newID)}
packedRefs := string(testRepo.ReadFile(t, "packed-refs"))
@@ -139,7 +139,7 @@
mainRef, err := store.ResolveToDetached("refs/heads/main") if err != nil {- t.Fatalf("ResolveFully(main): %v", err)+ t.Fatalf("ResolveToDetached(main): %v", err)}
if mainRef.ID != secondID {--- a/refstore/files/worktree_test.go
+++ b/refstore/files/worktree_test.go
@@ -52,56 +52,56 @@
got, err := mainStore.ResolveToDetached("refs/worktree/foo") if err != nil {- t.Fatalf("ResolveFully(main refs/worktree/foo): %v", err)+ t.Fatalf("ResolveToDetached(main refs/worktree/foo): %v", err)}
if got.ID != initialID {- t.Fatalf("ResolveFully(main refs/worktree/foo) = %s, want %s", got.ID, initialID)+ t.Fatalf("ResolveToDetached(main refs/worktree/foo) = %s, want %s", got.ID, initialID)}
got, err = wt1Store.ResolveToDetached("refs/worktree/foo") if err != nil {- t.Fatalf("ResolveFully(wt1 refs/worktree/foo): %v", err)+ t.Fatalf("ResolveToDetached(wt1 refs/worktree/foo): %v", err)}
if got.ID != wt1ID {- t.Fatalf("ResolveFully(wt1 refs/worktree/foo) = %s, want %s", got.ID, wt1ID)+ t.Fatalf("ResolveToDetached(wt1 refs/worktree/foo) = %s, want %s", got.ID, wt1ID)}
got, err = wt2Store.ResolveToDetached("refs/worktree/foo") if err != nil {- t.Fatalf("ResolveFully(wt2 refs/worktree/foo): %v", err)+ t.Fatalf("ResolveToDetached(wt2 refs/worktree/foo): %v", err)}
if got.ID != wt2ID {- t.Fatalf("ResolveFully(wt2 refs/worktree/foo) = %s, want %s", got.ID, wt2ID)+ t.Fatalf("ResolveToDetached(wt2 refs/worktree/foo) = %s, want %s", got.ID, wt2ID)}
got, err = wt1Store.ResolveToDetached("main-worktree/HEAD") if err != nil {- t.Fatalf("ResolveFully(wt1 main-worktree/HEAD): %v", err)+ t.Fatalf("ResolveToDetached(wt1 main-worktree/HEAD): %v", err)}
if got.ID != initialID {- t.Fatalf("ResolveFully(wt1 main-worktree/HEAD) = %s, want %s", got.ID, initialID)+ t.Fatalf("ResolveToDetached(wt1 main-worktree/HEAD) = %s, want %s", got.ID, initialID)}
got, err = mainStore.ResolveToDetached("worktrees/wt1/HEAD") if err != nil {- t.Fatalf("ResolveFully(main worktrees/wt1/HEAD): %v", err)+ t.Fatalf("ResolveToDetached(main worktrees/wt1/HEAD): %v", err)}
if got.ID != wt1ID {- t.Fatalf("ResolveFully(main worktrees/wt1/HEAD) = %s, want %s", got.ID, wt1ID)+ t.Fatalf("ResolveToDetached(main worktrees/wt1/HEAD) = %s, want %s", got.ID, wt1ID)}
got, err = wt2Store.ResolveToDetached("worktrees/wt1/HEAD") if err != nil {- t.Fatalf("ResolveFully(wt2 worktrees/wt1/HEAD): %v", err)+ t.Fatalf("ResolveToDetached(wt2 worktrees/wt1/HEAD): %v", err)}
if got.ID != wt1ID {- t.Fatalf("ResolveFully(wt2 worktrees/wt1/HEAD) = %s, want %s", got.ID, wt1ID)+ t.Fatalf("ResolveToDetached(wt2 worktrees/wt1/HEAD) = %s, want %s", got.ID, wt1ID)}
assertListMatchesGitForEachRef(t, testRepo.Run(t, "for-each-ref", "--format=%(refname)"), mainStore)
@@ -166,20 +166,20 @@
got, err := mainStore.ResolveToDetached("refs/bisect/main-only") if err != nil {- t.Fatalf("ResolveFully(main-only): %v", err)+ t.Fatalf("ResolveToDetached(main-only): %v", err)}
if got.ID != mainID {- t.Fatalf("ResolveFully(main-only) = %s, want %s", got.ID, mainID)+ t.Fatalf("ResolveToDetached(main-only) = %s, want %s", got.ID, mainID)}
got, err = wt1Store.ResolveToDetached("refs/bisect/wt-only") if err != nil {- t.Fatalf("ResolveFully(wt-only): %v", err)+ t.Fatalf("ResolveToDetached(wt-only): %v", err)}
if got.ID != wt1ID {- t.Fatalf("ResolveFully(wt-only) = %s, want %s", got.ID, wt1ID)+ t.Fatalf("ResolveToDetached(wt-only) = %s, want %s", got.ID, wt1ID)}
_, err = mainStore.Resolve("refs/bisect/wt-only")--- a/refstore/reading.go
+++ b/refstore/reading.go
@@ -11,13 +11,13 @@
// If the reference does not exist, implementations should return
// ErrReferenceNotFound.
Resolve(name string) (ref.Ref, error)
- // ResolveFully resolves a reference name to a detached object ID.
+ // ResolveToDetached resolves a reference name to a detached object ID.
//
// Implementations may use backend-local lookup semantics for symbolic hops.
// Callers that need cross-backend symbolic resolution (for example in a
// chain of stores) should prefer repeatedly calling Resolve.
//
- // ResolveFully resolves symbolic references only. It does not imply peeling
+ // ResolveToDetached resolves symbolic references only. It does not imply peeling
// annotated tag objects.
ResolveToDetached(name string) (ref.Detached, error)
// List returns references matching pattern.
--- a/repository/refs_test.go
+++ b/repository/refs_test.go
@@ -58,11 +58,11 @@
head, err := repo.Refs().ResolveToDetached("HEAD") if err != nil {- t.Fatalf("ResolveFully(HEAD): %v", err)+ t.Fatalf("ResolveToDetached(HEAD): %v", err)}
if head.ID != commitID {- t.Fatalf("ResolveFully(HEAD) id = %s, want %s", head.ID, commitID)+ t.Fatalf("ResolveToDetached(HEAD) id = %s, want %s", head.ID, commitID)}
})
}
@@ -74,7 +74,7 @@
repoHarness := newRepoForRefs(t, algo, "files")
commitID := writeMainAndHead(t, repoHarness)
repoHarness.PackRefs(t, "--all", "--prune")
- assertResolveFully(t, repoHarness, "refs/heads/main", commitID)
+ assertResolveToDetached(t, repoHarness, "refs/heads/main", commitID)
})
}
@@ -97,7 +97,7 @@
return commitID
}
-func assertResolveFully(t *testing.T, repoHarness *testgit.TestRepo, name string, want objectid.ObjectID) {+func assertResolveToDetached(t *testing.T, repoHarness *testgit.TestRepo, name string, want objectid.ObjectID) {t.Helper()
repo := repoHarness.OpenRepository(t)
@@ -104,10 +104,10 @@
resolved, err := repo.Refs().ResolveToDetached(name)
if err != nil {- t.Fatalf("ResolveFully(%s): %v", name, err)+ t.Fatalf("ResolveToDetached(%s): %v", name, err)}
if resolved.ID != want {- t.Fatalf("ResolveFully(%s) id = %s, want %s", name, resolved.ID, want)+ t.Fatalf("ResolveToDetached(%s) id = %s, want %s", name, resolved.ID, want)}
}
--
⑨