diff options
Diffstat (limited to 'network/receivepack/advertise.go')
| -rw-r--r-- | network/receivepack/advertise.go | 57 |
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 +} |
