shithub: furgit

Download patch

ref: cdac77529a3f7416843b1d455d413c9b0f21cfff
parent: 32f84b9d89d34ab74f8843f939f8d1d811d403ad
author: Runxi Yu <runxiyu@umich.edu>
date: Sun Mar 29 06:22:19 EDT 2026

object/id: Zero is a property of the algorithm

--- a/network/protocol/v0v1/server/advertise.go
+++ b/network/protocol/v0v1/server/advertise.go
@@ -3,8 +3,6 @@
 import (
 	"fmt"
 	"strings"
-
-	objectid "codeberg.org/lindenii/furgit/object/id"
 )
 
 // AdvertiseRefs writes one server ref advertisement.
@@ -20,7 +18,7 @@
 
 	refs := sortAdvertisedRefs(ad.Refs)
 	if len(refs) == 0 {
-		line := fmt.Sprintf("%s capabilities^{}\x00%s\n", objectid.Zero(session.opts.Algorithm), capList)
+		line := fmt.Sprintf("%s capabilities^{}\x00%s\n", session.opts.Algorithm.Zero(), capList)
 
 		err := session.enc.WriteData([]byte(line))
 		if err != nil {
--- a/network/protocol/v0v1/server/advertise_test.go
+++ b/network/protocol/v0v1/server/advertise_test.go
@@ -93,7 +93,7 @@
 
 		got := out.String()
 
-		want := objectid.Zero(algo).String() + " capabilities^{}\x00report-status object-format=" + algo.String() + "\n"
+		want := algo.Zero().String() + " capabilities^{}\x00report-status object-format=" + algo.String() + "\n"
 		if !strings.Contains(got, want) {
 			t.Fatalf("unexpected no-refs advertisement %q", got)
 		}
--- a/network/protocol/v0v1/server/receivepack/parse_test.go
+++ b/network/protocol/v0v1/server/receivepack/parse_test.go
@@ -19,7 +19,7 @@
 	testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) {
 		t.Parallel()
 
-		oldZero := objectid.Zero(algo).String()
+		oldZero := algo.Zero().String()
 		oneID := mustHexID(t, algo, "1")
 
 		var wire bufferWriteFlusher
@@ -105,7 +105,7 @@
 		enc := pktline.NewEncoder(&wire)
 
 		err := enc.WriteData([]byte(
-			oneID.String() + " " + objectid.Zero(algo).String() + " refs/heads/old\x00delete-refs object-format=" + algo.String() + "\n",
+			oneID.String() + " " + algo.Zero().String() + " refs/heads/old\x00delete-refs object-format=" + algo.String() + "\n",
 		))
 		if err != nil {
 			t.Fatalf("WriteData: %v", err)
@@ -153,7 +153,7 @@
 		enc := pktline.NewEncoder(&wire)
 
 		err := enc.WriteData([]byte(
-			objectid.Zero(algo).String() + " " + oneID.String() + " refs/heads/main\x00atomic object-format=" + algo.String() + "\n",
+			algo.Zero().String() + " " + oneID.String() + " refs/heads/main\x00atomic object-format=" + algo.String() + "\n",
 		))
 		if err != nil {
 			t.Fatalf("WriteData: %v", err)
@@ -209,7 +209,7 @@
 			"nonce nonce\n",
 			"push-option ci.skip\n",
 			"\n",
-			objectid.Zero(algo).String() + " " + oneID.String() + " refs/heads/main\n",
+			algo.Zero().String() + " " + oneID.String() + " refs/heads/main\n",
 			"-----BEGIN PGP SIGNATURE-----\n",
 			"abcdef\n",
 			"push-cert-end\n",
--- a/network/protocol/v0v1/server/receivepack/report_status_test.go
+++ b/network/protocol/v0v1/server/receivepack/report_status_test.go
@@ -59,7 +59,7 @@
 		requestEnc := pktline.NewEncoder(&requestWire)
 
 		err := requestEnc.WriteData([]byte(
-			objectid.Zero(algo).String() + " " + mustHexID(t, algo, "1").String() + " refs/heads/main\x00report-status side-band-64k object-format=" + algo.String() + "\n",
+			algo.Zero().String() + " " + mustHexID(t, algo, "1").String() + " refs/heads/main\x00report-status side-band-64k object-format=" + algo.String() + "\n",
 		))
 		if err != nil {
 			t.Fatalf("WriteData(request): %v", err)
@@ -243,7 +243,7 @@
 		requestEnc := pktline.NewEncoder(&requestWire)
 
 		err := requestEnc.WriteData([]byte(
-			objectid.Zero(algo).String() + " " + mustHexID(t, algo, "1").String() + " refs/heads/main\x00report-status side-band-64k object-format=" + algo.String() + "\n",
+			algo.Zero().String() + " " + mustHexID(t, algo, "1").String() + " refs/heads/main\x00report-status side-band-64k object-format=" + algo.String() + "\n",
 		))
 		if err != nil {
 			t.Fatalf("WriteData(request): %v", err)
--- a/network/protocol/v0v1/server/receivepack/session.go
+++ b/network/protocol/v0v1/server/receivepack/session.go
@@ -208,7 +208,7 @@
 }
 
 func commandIsDelete(cmd Command) bool {
-	return cmd.NewID == objectid.Zero(cmd.NewID.Algorithm())
+	return cmd.NewID == cmd.NewID.Algorithm().Zero()
 }
 
 func deleteOnly(commands []Command) bool {
--- a/network/receivepack/hooks/reject_force_push.go
+++ b/network/receivepack/hooks/reject_force_push.go
@@ -7,7 +7,6 @@
 
 	"codeberg.org/lindenii/furgit/commitquery"
 	receivepack "codeberg.org/lindenii/furgit/network/receivepack"
-	objectid "codeberg.org/lindenii/furgit/object/id"
 	objectmix "codeberg.org/lindenii/furgit/object/store/mix"
 	refstore "codeberg.org/lindenii/furgit/ref/store"
 )
@@ -33,7 +32,7 @@
 		}
 
 		for i, update := range req.Updates {
-			if update.OldID == objectid.Zero(update.OldID.Algorithm()) || update.NewID == objectid.Zero(update.NewID.Algorithm()) {
+			if update.OldID == update.OldID.Algorithm().Zero() || update.NewID == update.NewID.Algorithm().Zero() {
 				continue
 			}
 
--- a/network/receivepack/int_test.go
+++ b/network/receivepack/int_test.go
@@ -36,7 +36,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status atomic delete-refs object-format=" + algo.String() + "\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status atomic delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -83,10 +83,10 @@
 		)
 
 		input.WriteString(pktlineData(
-			staleID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status delete-refs object-format=" + algo.String() + "\n",
+			staleID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/topic\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/topic\n",
 		))
 		input.WriteString("0000")
 
@@ -138,10 +138,10 @@
 		)
 
 		input.WriteString(pktlineData(
-			staleID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status atomic delete-refs object-format=" + algo.String() + "\n",
+			staleID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status atomic delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/topic\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/topic\n",
 		))
 		input.WriteString("0000")
 
@@ -242,7 +242,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00delete-refs atomic object-format=" + algo.String() + "\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/main\x00delete-refs atomic object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -281,7 +281,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status atomic delete-refs object-format=" + algo.String() + "\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status atomic delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -365,7 +365,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			objectid.Zero(algo).String() + " " + commitID.String() + " refs/heads/main\x00report-status-v2 atomic object-format=" + algo.String() + "\n",
+			algo.Zero().String() + " " + commitID.String() + " refs/heads/main\x00report-status-v2 atomic object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -437,7 +437,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			objectid.Zero(algo).String() + " " + commitID.String() + " refs/heads/main\x00report-status-v2 atomic object-format=" + algo.String() + "\n",
+			algo.Zero().String() + " " + commitID.String() + " refs/heads/main\x00report-status-v2 atomic object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -519,10 +519,10 @@
 		)
 
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status delete-refs object-format=" + algo.String() + "\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/topic\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/topic\n",
 		))
 		input.WriteString("0000")
 
@@ -577,7 +577,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status side-band-64k atomic delete-refs object-format=" + algo.String() + "\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status side-band-64k atomic delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -725,7 +725,7 @@
 		)
 
 		input.WriteString(pktlineData(
-			commitID.String() + " " + objectid.Zero(algo).String() + " refs/heads/main\x00report-status-v2 atomic delete-refs object-format=" + algo.String() + "\n",
+			commitID.String() + " " + algo.Zero().String() + " refs/heads/main\x00report-status-v2 atomic delete-refs object-format=" + algo.String() + "\n",
 		))
 		input.WriteString("0000")
 
@@ -747,7 +747,7 @@
 			t.Fatalf("missing option old-oid in %q", got)
 		}
 
-		if !strings.Contains(got, "option new-oid "+objectid.Zero(algo).String()+"\n") {
+		if !strings.Contains(got, "option new-oid "+algo.Zero().String()+"\n") {
 			t.Fatalf("missing option new-oid in %q", got)
 		}
 	})
--- a/network/receivepack/service/apply.go
+++ b/network/receivepack/service/apply.go
@@ -2,7 +2,6 @@
 
 import (
 	"codeberg.org/lindenii/furgit/internal/utils"
-	objectid "codeberg.org/lindenii/furgit/object/id"
 	refstore "codeberg.org/lindenii/furgit/ref/store"
 )
 
@@ -101,7 +100,7 @@
 		return tx.Delete(command.Name, command.OldID)
 	}
 
-	if command.OldID == objectid.Zero(command.OldID.Algorithm()) {
+	if command.OldID == command.OldID.Algorithm().Zero() {
 		return tx.Create(command.Name, command.NewID)
 	}
 
@@ -115,7 +114,7 @@
 		return
 	}
 
-	if command.OldID == objectid.Zero(command.OldID.Algorithm()) {
+	if command.OldID == command.OldID.Algorithm().Zero() {
 		batch.Create(command.Name, command.NewID)
 
 		return
--- a/network/receivepack/service/command.go
+++ b/network/receivepack/service/command.go
@@ -22,7 +22,7 @@
 }
 
 func isDelete(command Command) bool {
-	return command.NewID == objectid.Zero(command.NewID.Algorithm())
+	return command.NewID == command.NewID.Algorithm().Zero()
 }
 
 func objectIDPointer(id objectid.ObjectID) *objectid.ObjectID {
--- a/network/receivepack/service/service_test.go
+++ b/network/receivepack/service/service_test.go
@@ -29,8 +29,8 @@
 		result, err := svc.Execute(context.Background(), &service.Request{
 			Commands: []service.Command{{
 				Name:  "refs/heads/main",
-				OldID: objectid.Zero(algo),
-				NewID: objectid.Zero(algo),
+				OldID: algo.Zero(),
+				NewID: algo.Zero(),
 			}},
 			PackExpected: true,
 			Pack:         strings.NewReader("not a pack"),
@@ -73,8 +73,8 @@
 		result, err := svc.Execute(context.Background(), &service.Request{
 			Commands: []service.Command{{
 				Name:  "refs/heads/main",
-				OldID: objectid.Zero(algo),
-				NewID: objectid.Zero(algo),
+				OldID: algo.Zero(),
+				NewID: algo.Zero(),
 			}},
 			PackExpected: true,
 			Pack:         strings.NewReader("not a pack"),
--- /dev/null
+++ b/object/id/algorithm_zero.go
@@ -1,0 +1,11 @@
+package objectid
+
+// Zero returns the all-zero object ID for this algorithm.
+func (algo Algorithm) Zero() ObjectID {
+	id, err := FromBytes(algo, make([]byte, algo.Size()))
+	if err != nil {
+		panic(err)
+	}
+
+	return id
+}
--- a/object/id/objectid_zero.go
+++ /dev/null
@@ -1,11 +1,0 @@
-package objectid
-
-// Zero returns the all-zero object ID for the specified algorithm.
-func Zero(algo Algorithm) ObjectID {
-	id, err := FromBytes(algo, make([]byte, algo.Size()))
-	if err != nil {
-		panic(err)
-	}
-
-	return id
-}
--