/
path.go
56 lines (53 loc) · 1.29 KB
/
path.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package scp
import (
"github.com/viant/afs/file"
"os"
"strings"
"time"
)
//adjustPath tracks current and previous relative path to adjust accordingly
func adjustPath(prev, current string, moveDown func(info os.FileInfo) error, moveUp func() error) error {
if prev == current {
return nil
}
var prevElements []string
var currElements []string
if prev != "" {
prevElements = strings.Split(prev, "/")
}
if prev != "" {
currElements = strings.Split(current, "/")
}
if len(prevElements) < len(currElements) {
for i := len(prevElements); i < len(currElements); i++ {
dirInfo := file.NewInfo(currElements[i], 0, file.DefaultDirOsMode, time.Now(), true)
if err := moveDown(dirInfo); err != nil {
return err
}
}
}
var downElements = make([]string, 0)
for i := len(prevElements) - 1; i >= 0; i-- {
prevElem := prevElements[i]
currentElem := ""
if i < len(currElements) {
currentElem = currElements[i]
}
if currentElem == prevElem {
break
}
if currentElem != "" {
downElements = append(downElements, currentElem)
}
if err := moveUp(); err != nil {
return err
}
}
for _, element := range downElements {
dirInfo := file.NewInfo(element, 0, file.DefaultDirOsMode, time.Now(), true)
if err := moveDown(dirInfo); err != nil {
return err
}
}
return nil
}