internal/gitaly/storage/gitstorage/alternates.go (26 lines of code) (raw):

package gitstorage import ( "errors" "fmt" "io/fs" "gitlab.com/gitlab-org/gitaly/v16/internal/git/stats" ) var ( // ErrNoAlternate is returned when a repository has no alternate. ErrNoAlternate = errors.New("repository has no alternate") // ErrMultipleAlternates is returned when a repository has multiple alternates // configured. ErrMultipleAlternates = errors.New("repository has multiple alternates") ) // ReadAlternatesFile reads the alternates file from the given repository. ErrNoAlternate is returned if the // file doesn't exist or didn't contain an alternate. ErrMultipleAlternates is returned if the // repository had multiple alternates. func ReadAlternatesFile(repositoryPath string) (string, error) { alternates, err := stats.ReadAlternatesFile(repositoryPath) if err != nil { if errors.Is(err, fs.ErrNotExist) { return "", ErrNoAlternate } return "", fmt.Errorf("read alternates file: %w", err) } if len(alternates) == 0 { return "", ErrNoAlternate } else if len(alternates) > 1 { // Repositories shouldn't have more than one alternate given they should only be // linked to a single pool at most. return "", ErrMultipleAlternates } return alternates[0], nil }