diff options
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 +} |
