aboutsummaryrefslogtreecommitdiff
path: root/protocol/v0v1/server/advertise.go
blob: dd77a12d66f2287f4638899cda9b2bc836533e5a (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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()
}