shithub: furgit

Download patch

ref: 048d36efe996b3918b7a33ec971e7a26d4a80ff4
parent: 33a57ddd6fd9fbe4c01afa1fc70051a91b6d81fc
author: Runxi Yu <runxiyu@umich.edu>
date: Mon Mar 30 14:11:59 EDT 2026

object/store/dual: Satisfy WriterQuarantiner

--- a/object/store/dual/dual.go
+++ b/object/store/dual/dual.go
@@ -32,4 +32,5 @@
 	_ objectstore.PackWriter        = (*Dual)(nil)
 	_ objectstore.ObjectQuarantiner = (*Dual)(nil)
 	_ objectstore.PackQuarantiner   = (*Dual)(nil)
+	_ objectstore.WriterQuarantiner = (*Dual)(nil)
 )
--- a/object/store/dual/dual_test.go
+++ b/object/store/dual/dual_test.go
@@ -117,14 +117,14 @@
 		repo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true})
 		store := newDualStore(t, repo, algo)
 
-		quarantiner, ok := any(store).(objectstore.PackQuarantiner)
+		quarantiner, ok := any(store).(objectstore.WriterQuarantiner)
 		if !ok {
-			t.Fatal("dual does not implement PackQuarantiner")
+			t.Fatal("dual does not implement WriterQuarantiner")
 		}
 
-		quarantine, err := quarantiner.BeginPackQuarantine(objectstore.PackQuarantineOptions{})
+		quarantine, err := quarantiner.BeginQuarantine(objectstore.QuarantineOptions{})
 		if err != nil {
-			t.Fatalf("BeginPackQuarantine: %v", err)
+			t.Fatalf("BeginQuarantine: %v", err)
 		}
 
 		err = quarantine.WritePack(bytes.NewReader(packBytes), objectstore.PackWriteOptions{RequireTrailingEOF: true})
@@ -219,18 +219,13 @@
 		repo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true})
 		store := newDualStore(t, repo, algo)
 
-		quarantiner := any(store).(objectstore.ObjectQuarantiner)
-		quarantine, err := quarantiner.BeginObjectQuarantine(objectstore.ObjectQuarantineOptions{})
+		quarantiner := any(store).(objectstore.WriterQuarantiner)
+		quarantine, err := quarantiner.BeginQuarantine(objectstore.QuarantineOptions{})
 		if err != nil {
-			t.Fatalf("BeginObjectQuarantine: %v", err)
+			t.Fatalf("BeginQuarantine: %v", err)
 		}
 
-		packQ, ok := any(quarantine).(objectstore.PackQuarantine)
-		if !ok {
-			t.Fatal("object quarantine does not also implement PackQuarantine")
-		}
-
-		err = packQ.WritePack(bytes.NewReader(packBytes), objectstore.PackWriteOptions{RequireTrailingEOF: true})
+		err = quarantine.WritePack(bytes.NewReader(packBytes), objectstore.PackWriteOptions{RequireTrailingEOF: true})
 		if err != nil {
 			t.Fatalf("quarantine.WritePack: %v", err)
 		}
--- a/object/store/dual/quarantine.go
+++ b/object/store/dual/quarantine.go
@@ -19,6 +19,7 @@
 var (
 	_ objectstore.ObjectQuarantine = (*quarantine)(nil)
 	_ objectstore.PackQuarantine   = (*quarantine)(nil)
+	_ objectstore.WriterQuarantine = (*quarantine)(nil)
 )
 
 func newQuarantine(
--- a/object/store/dual/quarantine_begin.go
+++ b/object/store/dual/quarantine_begin.go
@@ -2,14 +2,21 @@
 
 import objectstore "codeberg.org/lindenii/furgit/object/store"
 
-// TODO: This doesn't actually make sense. We need a combined quarantine.
+// BeginQuarantine creates one coordinated dual quarantine spanning both stores.
+//
+// Labels: Deps-Borrowed, Life-Parent, Close-No.
+func (dual *Dual) BeginQuarantine(opts objectstore.QuarantineOptions) (objectstore.WriterQuarantine, error) {
+	return dual.beginQuarantine(opts)
+}
 
 // BeginObjectQuarantine creates one coordinated dual quarantine spanning both
 // stores and returns it as an object-wise quarantine.
 //
 // Labels: Deps-Borrowed, Life-Parent, Close-No.
-func (dual *Dual) BeginObjectQuarantine(_ objectstore.ObjectQuarantineOptions) (objectstore.ObjectQuarantine, error) {
-	quarantine, err := dual.beginQuarantine()
+func (dual *Dual) BeginObjectQuarantine(opts objectstore.ObjectQuarantineOptions) (objectstore.ObjectQuarantine, error) {
+	quarantine, err := dual.beginQuarantine(objectstore.QuarantineOptions{
+		Object: opts,
+	})
 	if err != nil {
 		return nil, err
 	}
@@ -21,8 +28,10 @@
 // stores and returns it as a pack-wise quarantine.
 //
 // Labels: Deps-Borrowed, Life-Parent, Close-No.
-func (dual *Dual) BeginPackQuarantine(_ objectstore.PackQuarantineOptions) (objectstore.PackQuarantine, error) {
-	quarantine, err := dual.beginQuarantine()
+func (dual *Dual) BeginPackQuarantine(opts objectstore.PackQuarantineOptions) (objectstore.PackQuarantine, error) {
+	quarantine, err := dual.beginQuarantine(objectstore.QuarantineOptions{
+		Pack: opts,
+	})
 	if err != nil {
 		return nil, err
 	}
@@ -30,13 +39,13 @@
 	return quarantine, nil
 }
 
-func (dual *Dual) beginQuarantine() (*quarantine, error) {
-	objectQ, err := dual.object.BeginObjectQuarantine(objectstore.ObjectQuarantineOptions{})
+func (dual *Dual) beginQuarantine(opts objectstore.QuarantineOptions) (*quarantine, error) {
+	objectQ, err := dual.object.BeginObjectQuarantine(opts.Object)
 	if err != nil {
 		return nil, err
 	}
 
-	packQ, err := dual.pack.BeginPackQuarantine(objectstore.PackQuarantineOptions{})
+	packQ, err := dual.pack.BeginPackQuarantine(opts.Pack)
 	if err != nil {
 		_ = objectQ.Discard()
 
--