diff options
| author | 2026-03-07 14:24:32 +0800 | |
|---|---|---|
| committer | 2026-03-07 17:21:05 +0800 | |
| commit | 175c8ed3c342f34110cdca42dc4027050b39d7fb (patch) | |
| tree | 8e0ddddc5b7146816f859c2013c7fb7909807e03 /receivepack/advertise.go | |
| parent | receivepack: Add service semantics thingy (diff) | |
| signature | No signature | |
receivepack: Connect protocol with service v0.1.72
Diffstat (limited to 'receivepack/advertise.go')
| -rw-r--r-- | receivepack/advertise.go | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/receivepack/advertise.go b/receivepack/advertise.go new file mode 100644 index 00000000..64fb2fe7 --- /dev/null +++ b/receivepack/advertise.go @@ -0,0 +1,57 @@ +package receivepack + +import ( + "errors" + + common "codeberg.org/lindenii/furgit/protocol/v0v1/server" + "codeberg.org/lindenii/furgit/ref" + "codeberg.org/lindenii/furgit/refstore" +) + +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.ResolveFully("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 +} |
