WIP: sort entries by full path name before compare
This commit is contained in:
parent
a072d6d6e7
commit
29603ae478
2 changed files with 30 additions and 0 deletions
|
@ -3,6 +3,7 @@ package mtree
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -348,6 +349,7 @@ func Compare(thisDh, thatDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta,
|
||||||
|
|
||||||
// First, iterate over the old hierarchy. If nil, pretend it's empty.
|
// First, iterate over the old hierarchy. If nil, pretend it's empty.
|
||||||
if thisDh != nil {
|
if thisDh != nil {
|
||||||
|
sort.Sort(byName(thisDh.Entries))
|
||||||
for _, e := range thisDh.Entries {
|
for _, e := range thisDh.Entries {
|
||||||
if e.Type == RelativeType || e.Type == FullType {
|
if e.Type == RelativeType || e.Type == FullType {
|
||||||
path, err := e.Path()
|
path, err := e.Path()
|
||||||
|
@ -370,6 +372,7 @@ func Compare(thisDh, thatDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta,
|
||||||
|
|
||||||
// Then, iterate over the new hierarchy. If nil, pretend it's empty.
|
// Then, iterate over the new hierarchy. If nil, pretend it's empty.
|
||||||
if thatDh != nil {
|
if thatDh != nil {
|
||||||
|
sort.Sort(byName(thatDh.Entries))
|
||||||
for _, e := range thatDh.Entries {
|
for _, e := range thatDh.Entries {
|
||||||
if e.Type == RelativeType || e.Type == FullType {
|
if e.Type == RelativeType || e.Type == FullType {
|
||||||
path, err := e.Path()
|
path, err := e.Path()
|
||||||
|
|
27
entry.go
27
entry.go
|
@ -14,6 +14,33 @@ func (bp byPos) Len() int { return len(bp) }
|
||||||
func (bp byPos) Less(i, j int) bool { return bp[i].Pos < bp[j].Pos }
|
func (bp byPos) Less(i, j int) bool { return bp[i].Pos < bp[j].Pos }
|
||||||
func (bp byPos) Swap(i, j int) { bp[i], bp[j] = bp[j], bp[i] }
|
func (bp byPos) Swap(i, j int) { bp[i], bp[j] = bp[j], bp[i] }
|
||||||
|
|
||||||
|
type byName []Entry
|
||||||
|
|
||||||
|
func (bp byName) Len() int { return len(bp) }
|
||||||
|
func (bp byName) Less(i, j int) bool {
|
||||||
|
var iParent string
|
||||||
|
var jParent string
|
||||||
|
var err error
|
||||||
|
if bp[i].Parent != nil {
|
||||||
|
iParent, err = bp[i].Parent.Path()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iName := filepath.Clean(filepath.Join(iParent, bp[i].Name))
|
||||||
|
|
||||||
|
if bp[j].Parent != nil {
|
||||||
|
jParent, err = bp[j].Parent.Path()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jName := filepath.Clean(filepath.Join(jParent, bp[j].Name))
|
||||||
|
|
||||||
|
return iName < jName
|
||||||
|
}
|
||||||
|
func (bp byName) Swap(i, j int) { bp[i], bp[j] = bp[j], bp[i] }
|
||||||
|
|
||||||
// Entry is each component of content in the mtree spec file
|
// Entry is each component of content in the mtree spec file
|
||||||
type Entry struct {
|
type Entry struct {
|
||||||
Parent *Entry // up
|
Parent *Entry // up
|
||||||
|
|
Loading…
Reference in a new issue