shithub: furgit

ref: 1556cfb51d980ae8c5bf664ad69f3abd46f02386
dir: /repository/objects.go/

View raw version
package repository

import (
	"errors"
	"fmt"
	"os"

	"codeberg.org/lindenii/furgit/objectid"
	"codeberg.org/lindenii/furgit/objectstore"
	objectloose "codeberg.org/lindenii/furgit/objectstore/loose"
	objectmix "codeberg.org/lindenii/furgit/objectstore/mix"
	objectpacked "codeberg.org/lindenii/furgit/objectstore/packed"
)

//nolint:ireturn
func openObjectStore(
	root *os.Root,
	algo objectid.Algorithm,
) (
	objects objectstore.Store,
	objectsRoot *os.Root,
	objectsPackRoot *os.Root,
	objectsLoose *objectloose.Store,
	objectsPacked *objectpacked.Store,
	err error,
) {
	objectsRoot, err = root.OpenRoot("objects")
	if err != nil {
		return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects: %w", err)
	}

	objectsLoose, err = objectloose.New(objectsRoot, algo)
	if err != nil {
		_ = objectsRoot.Close()

		return nil, nil, nil, nil, nil, err
	}

	backends := []objectstore.Store{objectsLoose}

	objectsPackRoot, err = objectsRoot.OpenRoot("pack")
	if err == nil {
		objectsPacked, err = objectpacked.New(
			objectsPackRoot,
			algo,
			objectpacked.Options{RefreshPolicy: objectpacked.RefreshPolicyNever},
		)
		if err != nil {
			_ = objectsPackRoot.Close()
			_ = objectsLoose.Close()
			_ = objectsRoot.Close()

			return nil, nil, nil, nil, nil, err
		}

		backends = append(backends, objectsPacked)
	} else if !errors.Is(err, os.ErrNotExist) {
		_ = objectsLoose.Close()
		_ = objectsRoot.Close()

		return nil, nil, nil, nil, nil, fmt.Errorf("repository: open objects/pack: %w", err)
	}

	objects = objectmix.New(backends...)

	return objects, objectsRoot, objectsPackRoot, objectsLoose, objectsPacked, nil
}

// Objects returns the configured object store.
//
//nolint:ireturn
func (repo *Repository) Objects() objectstore.Store {
	return repo.objects
}