shithub: furgit

ref: df1f2fb3daa1acd25c88510f259d5535fb482126
dir: /ref/store/chain/list.go/

View raw version
package chain

import (
	"fmt"

	"codeberg.org/lindenii/furgit/ref"
)

// List lists references from every backend and deduplicates by ref name.
//
// First-seen wins, so earlier backends have precedence.
func (chain *Chain) List(pattern string) ([]ref.Ref, error) {
	var refs []ref.Ref

	seen := map[string]struct{}{}

	for i, backend := range chain.backends {
		listed, err := backend.List(pattern)
		if err != nil {
			return nil, fmt.Errorf("refstore: backend %d list: %w", i, err)
		}

		for _, entry := range listed {
			if entry == nil {
				continue
			}

			name := entry.Name()
			if _, ok := seen[name]; ok {
				continue
			}

			seen[name] = struct{}{}

			refs = append(refs, entry)
		}
	}

	return refs, nil
}