aboutsummaryrefslogtreecommitdiff
path: root/protocol/v0v1/server/advertise.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-07 14:24:05 +0800
committerGravatar Runxi Yu2026-03-07 17:01:46 +0800
commit4b8d39764f9b54ea3090d0fea92a23025dbea30d (patch)
treecaa6e408c4ea625afcbb1b4aa4fb9e945f46994b /protocol/v0v1/server/advertise.go
parentrefstore: Split files (diff)
signatureNo signature
protocol: Add v0v1 server protocol and its receivepack subprotocol
Diffstat (limited to 'protocol/v0v1/server/advertise.go')
-rw-r--r--protocol/v0v1/server/advertise.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/protocol/v0v1/server/advertise.go b/protocol/v0v1/server/advertise.go
new file mode 100644
index 00000000..dd77a12d
--- /dev/null
+++ b/protocol/v0v1/server/advertise.go
@@ -0,0 +1,55 @@
+package server
+
+import (
+ "fmt"
+ "strings"
+
+ "codeberg.org/lindenii/furgit/objectid"
+)
+
+// AdvertiseRefs writes one server ref advertisement.
+func (session *Session) AdvertiseRefs(ad Advertisement, capabilityTokens []string) error {
+ if session.opts.Version == Version1 {
+ err := session.enc.WriteData([]byte("version 1\n"))
+ if err != nil {
+ return err
+ }
+ }
+
+ capList := strings.Join(capabilityTokens, " ")
+
+ refs := sortAdvertisedRefs(ad.Refs)
+ if len(refs) == 0 {
+ line := fmt.Sprintf("%s capabilities^{}\x00%s\n", objectid.Zero(session.opts.Algorithm), capList)
+
+ err := session.enc.WriteData([]byte(line))
+ if err != nil {
+ return err
+ }
+
+ return session.WriteFlush()
+ }
+
+ for i, entry := range refs {
+ line := fmt.Sprintf("%s %s", entry.ID, entry.Name)
+ if i == 0 {
+ line += "\x00" + capList
+ }
+
+ err := session.enc.WriteData([]byte(line + "\n"))
+ if err != nil {
+ return err
+ }
+
+ if entry.Peeled != nil {
+ peeled := fmt.Sprintf("%s %s^{}\n", *entry.Peeled, entry.Name)
+
+ err = session.enc.WriteData([]byte(peeled))
+ if err != nil {
+ return err
+ }
+ }
+ }
+
+ return session.WriteFlush()
+}