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++ } }