diff options
| author | 2026-03-25 16:22:03 +0000 | |
|---|---|---|
| committer | 2026-03-25 16:22:03 +0000 | |
| commit | 311edcd50f3a84f4b860bde3cb887451d74eaa11 (patch) | |
| tree | be7aa5e9a51e636358f33b1c90637b5024b70dc3 /network/protocol/v0v1/server/advertise.go | |
| parent | README: Split off contrib, benchmarks, remove history for now I guess, etc. (diff) | |
| signature | No signature | |
network/protocol: Rename from protocol v0.1.110
Diffstat (limited to 'network/protocol/v0v1/server/advertise.go')
| -rw-r--r-- | network/protocol/v0v1/server/advertise.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/network/protocol/v0v1/server/advertise.go b/network/protocol/v0v1/server/advertise.go new file mode 100644 index 00000000..be1b1f02 --- /dev/null +++ b/network/protocol/v0v1/server/advertise.go @@ -0,0 +1,55 @@ +package server + +import ( + "fmt" + "strings" + + objectid "codeberg.org/lindenii/furgit/object/id" +) + +// 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() +} |
