aboutsummaryrefslogtreecommitdiff
package memory

import objectid "codeberg.org/lindenii/furgit/object/id"

// Because the public one includes the ref's name/identity.

type storedKind uint8

const (
	storedMissing storedKind = iota
	storedDetached
	storedSymbolic
)

// Missing is obviously not the best design
// but it does make it easier to operate on internally.
// Might make a tagged union wrapper, though...
// Or might just make a wrapper struct that has an "ok" bool.

type storedRef struct {
	kind   storedKind
	id     objectid.ObjectID
	target string
	peeled *objectid.ObjectID
}

func cloneStoredRef(stored storedRef) storedRef {
	if stored.peeled == nil {
		return stored
	}

	peeled := *stored.peeled
	stored.peeled = &peeled

	return stored
}

func cloneRefs(refs map[string]storedRef) map[string]storedRef {
	cloned := make(map[string]storedRef, len(refs))
	for name, stored := range refs {
		cloned[name] = cloneStoredRef(stored)
	}

	return cloned
}