ref: df1f2fb3daa1acd25c88510f259d5535fb482126
dir: /ref/store/files/transaction_symbolic_test.go/
package files_test
import (
"errors"
"testing"
"codeberg.org/lindenii/furgit/internal/testgit"
objectid "codeberg.org/lindenii/furgit/object/id"
refstore "codeberg.org/lindenii/furgit/ref/store"
)
func TestFilesTransactionDirectSymbolicDeletes(t *testing.T) {
t.Parallel()
testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper
testRepo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true})
_, _, mainID := testRepo.MakeCommit(t, "main")
testRepo.UpdateRef(t, "refs/heads/main", mainID)
store := openFilesStore(t, testRepo, algo)
tx, err := store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(create symref): %v", err)
}
err = tx.CreateSymbolic("SYMREF", "refs/heads/main")
if err != nil {
t.Fatalf("CreateSymbolic(SYMREF): %v", err)
}
err = tx.Commit()
if err != nil {
t.Fatalf("Commit(CreateSymbolic SYMREF): %v", err)
}
tx, err = store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(delete symref): %v", err)
}
err = tx.DeleteSymbolic("SYMREF", "refs/heads/main")
if err != nil {
t.Fatalf("DeleteSymbolic(SYMREF): %v", err)
}
err = tx.Commit()
if err != nil {
t.Fatalf("Commit(DeleteSymbolic SYMREF): %v", err)
}
_, err = store.Resolve("SYMREF")
if !errors.Is(err, refstore.ErrReferenceNotFound) {
t.Fatalf("Resolve(SYMREF after delete) err=%v", err)
}
got, err := store.ResolveToDetached("refs/heads/main")
if err != nil {
t.Fatalf("ResolveToDetached(main): %v", err)
}
if got.ID != mainID {
t.Fatalf("main after DeleteSymbolic = %s, want %s", got.ID, mainID)
}
})
}
func TestFilesTransactionSelfAndDanglingSymrefs(t *testing.T) {
t.Parallel()
testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper
testRepo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true})
_, _, mainID := testRepo.MakeCommit(t, "main")
testRepo.UpdateRef(t, "refs/heads/main", mainID)
store := openFilesStore(t, testRepo, algo)
tx, err := store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(create self): %v", err)
}
err = tx.CreateSymbolic("refs/heads/self", "refs/heads/self")
if err != nil {
t.Fatalf("CreateSymbolic(self): %v", err)
}
err = tx.Commit()
if err != nil {
t.Fatalf("Commit(CreateSymbolic self): %v", err)
}
tx, err = store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(delete logical self): %v", err)
}
err = tx.Delete("refs/heads/self", mainID)
if err == nil {
err = tx.Commit()
} else {
_ = tx.Abort()
}
if err == nil {
t.Fatal("Delete(self) unexpectedly succeeded")
}
tx, err = store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(delete symbolic self): %v", err)
}
err = tx.DeleteSymbolic("refs/heads/self", "refs/heads/self")
if err != nil {
t.Fatalf("DeleteSymbolic(self): %v", err)
}
err = tx.Commit()
if err != nil {
t.Fatalf("Commit(DeleteSymbolic self): %v", err)
}
tx, err = store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(create dangling): %v", err)
}
err = tx.CreateSymbolic("refs/heads/dangling", "refs/heads/missing")
if err != nil {
t.Fatalf("CreateSymbolic(dangling): %v", err)
}
err = tx.Commit()
if err != nil {
t.Fatalf("Commit(CreateSymbolic dangling): %v", err)
}
tx, err = store.BeginTransaction()
if err != nil {
t.Fatalf("BeginTransaction(delete dangling): %v", err)
}
err = tx.DeleteSymbolic("refs/heads/dangling", "refs/heads/missing")
if err != nil {
t.Fatalf("DeleteSymbolic(dangling): %v", err)
}
err = tx.Commit()
if err != nil {
t.Fatalf("Commit(DeleteSymbolic dangling): %v", err)
}
})
}