mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-17 01:42:45 +02:00
switch to fork of go-git
This commit is contained in:
59
vendor/github.com/jesseduffield/go-git/v5/utils/merkletrie/noder/noder.go
generated
vendored
Normal file
59
vendor/github.com/jesseduffield/go-git/v5/utils/merkletrie/noder/noder.go
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
// Package noder provide an interface for defining nodes in a
|
||||
// merkletrie, their hashes and their paths (a noders and its
|
||||
// ancestors).
|
||||
//
|
||||
// The hasher interface is easy to implement naively by elements that
|
||||
// already have a hash, like git blobs and trees. More sophisticated
|
||||
// implementations can implement the Equal function in exotic ways
|
||||
// though: for instance, comparing the modification time of directories
|
||||
// in a filesystem.
|
||||
package noder
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Hasher interface is implemented by types that can tell you
|
||||
// their hash.
|
||||
type Hasher interface {
|
||||
Hash() []byte
|
||||
}
|
||||
|
||||
// Equal functions take two hashers and return if they are equal.
|
||||
//
|
||||
// These functions are expected to be faster than reflect.Equal or
|
||||
// reflect.DeepEqual because they can compare just the hash of the
|
||||
// objects, instead of their contents, so they are expected to be O(1).
|
||||
type Equal func(a, b Hasher) bool
|
||||
|
||||
// The Noder interface is implemented by the elements of a Merkle Trie.
|
||||
//
|
||||
// There are two types of elements in a Merkle Trie:
|
||||
//
|
||||
// - file-like nodes: they cannot have children.
|
||||
//
|
||||
// - directory-like nodes: they can have 0 or more children and their
|
||||
// hash is calculated by combining their children hashes.
|
||||
type Noder interface {
|
||||
Hasher
|
||||
fmt.Stringer // for testing purposes
|
||||
// Name returns the name of an element (relative, not its full
|
||||
// path).
|
||||
Name() string
|
||||
// IsDir returns true if the element is a directory-like node or
|
||||
// false if it is a file-like node.
|
||||
IsDir() bool
|
||||
// Children returns the children of the element. Note that empty
|
||||
// directory-like noders and file-like noders will both return
|
||||
// NoChildren.
|
||||
Children() ([]Noder, error)
|
||||
// NumChildren returns the number of children this element has.
|
||||
//
|
||||
// This method is an optimization: the number of children is easily
|
||||
// calculated as the length of the value returned by the Children
|
||||
// method (above); yet, some implementations will be able to
|
||||
// implement NumChildren in O(1) while Children is usually more
|
||||
// complex.
|
||||
NumChildren() (int, error)
|
||||
}
|
||||
|
||||
// NoChildren represents the children of a noder without children.
|
||||
var NoChildren = []Noder{}
|
90
vendor/github.com/jesseduffield/go-git/v5/utils/merkletrie/noder/path.go
generated
vendored
Normal file
90
vendor/github.com/jesseduffield/go-git/v5/utils/merkletrie/noder/path.go
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
package noder
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Path values represent a noder and its ancestors. The root goes first
|
||||
// and the actual final noder the path is referring to will be the last.
|
||||
//
|
||||
// A path implements the Noder interface, redirecting all the interface
|
||||
// calls to its final noder.
|
||||
//
|
||||
// Paths build from an empty Noder slice are not valid paths and should
|
||||
// not be used.
|
||||
type Path []Noder
|
||||
|
||||
// String returns the full path of the final noder as a string, using
|
||||
// "/" as the separator.
|
||||
func (p Path) String() string {
|
||||
var buf bytes.Buffer
|
||||
sep := ""
|
||||
for _, e := range p {
|
||||
_, _ = buf.WriteString(sep)
|
||||
sep = "/"
|
||||
_, _ = buf.WriteString(e.Name())
|
||||
}
|
||||
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// Last returns the final noder in the path.
|
||||
func (p Path) Last() Noder {
|
||||
return p[len(p)-1]
|
||||
}
|
||||
|
||||
// Hash returns the hash of the final noder of the path.
|
||||
func (p Path) Hash() []byte {
|
||||
return p.Last().Hash()
|
||||
}
|
||||
|
||||
// Name returns the name of the final noder of the path.
|
||||
func (p Path) Name() string {
|
||||
return p.Last().Name()
|
||||
}
|
||||
|
||||
// IsDir returns if the final noder of the path is a directory-like
|
||||
// noder.
|
||||
func (p Path) IsDir() bool {
|
||||
return p.Last().IsDir()
|
||||
}
|
||||
|
||||
// Children returns the children of the final noder in the path.
|
||||
func (p Path) Children() ([]Noder, error) {
|
||||
return p.Last().Children()
|
||||
}
|
||||
|
||||
// NumChildren returns the number of children the final noder of the
|
||||
// path has.
|
||||
func (p Path) NumChildren() (int, error) {
|
||||
return p.Last().NumChildren()
|
||||
}
|
||||
|
||||
// Compare returns -1, 0 or 1 if the path p is smaller, equal or bigger
|
||||
// than other, in "directory order"; for example:
|
||||
//
|
||||
// "a" < "b"
|
||||
// "a/b/c/d/z" < "b"
|
||||
// "a/b/a" > "a/b"
|
||||
func (p Path) Compare(other Path) int {
|
||||
i := 0
|
||||
for {
|
||||
switch {
|
||||
case len(other) == len(p) && i == len(p):
|
||||
return 0
|
||||
case i == len(other):
|
||||
return 1
|
||||
case i == len(p):
|
||||
return -1
|
||||
default:
|
||||
// We do *not* normalize Unicode here. CGit doesn't.
|
||||
// https://github.com/src-d/go-git/issues/1057
|
||||
cmp := strings.Compare(p[i].Name(), other[i].Name())
|
||||
if cmp != 0 {
|
||||
return cmp
|
||||
}
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user