aboutsummaryrefslogtreecommitdiff
path: root/network/receivepack/advertise.go
diff options
context:
space:
mode:
Diffstat (limited to 'network/receivepack/advertise.go')
-rw-r--r--network/receivepack/advertise.go57
1 files changed, 57 insertions, 0 deletions
diff --git a/network/receivepack/advertise.go b/network/receivepack/advertise.go
new file mode 100644
index 00000000..0fa010bf
--- /dev/null
+++ b/network/receivepack/advertise.go
@@ -0,0 +1,57 @@
+package receivepack
+
+import (
+ "errors"
+
+ common "codeberg.org/lindenii/furgit/network/protocol/v0v1/server"
+ "codeberg.org/lindenii/furgit/ref"
+ refstore "codeberg.org/lindenii/furgit/ref/store"
+)
+
+func advertisedRefs(opts Options) ([]common.AdvertisedRef, error) {
+ listed, err := opts.Refs.List("")
+ if err != nil {
+ return nil, err
+ }
+
+ return buildAdvertisedRefs(opts, listed)
+}
+
+func buildAdvertisedRefs(opts Options, listed []ref.Ref) ([]common.AdvertisedRef, error) {
+ refs := make([]common.AdvertisedRef, 0, len(listed))
+ for _, entry := range listed {
+ switch resolved := entry.(type) {
+ case ref.Detached:
+ advertised := common.AdvertisedRef{
+ Name: resolved.Name(),
+ ID: resolved.ID,
+ }
+
+ if resolved.Peeled != nil {
+ advertised.Peeled = resolved.Peeled
+ }
+
+ refs = append(refs, advertised)
+ case ref.Symbolic:
+ if resolved.Name() != "HEAD" {
+ continue
+ }
+
+ head, err := opts.Refs.ResolveToDetached("HEAD")
+ if err != nil {
+ if errors.Is(err, refstore.ErrReferenceNotFound) {
+ continue
+ }
+
+ return nil, err
+ }
+
+ refs = append(refs, common.AdvertisedRef{
+ Name: "HEAD",
+ ID: head.ID,
+ })
+ }
+ }
+
+ return refs, nil
+}