/
paths_subst.go
88 lines (79 loc) · 2.34 KB
/
paths_subst.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package paths
import (
"os/exec"
"regexp"
"strings"
"github.com/VonC/godbg"
)
var subst map[string]string
var fcmdgetsubst func() (out string, err error)
func ifcmdgetsubst() (sout string, err error) {
// godbg.Perrdbgf("invoking subst")
c := exec.Command("cmd", "/C", "subst")
out, err := c.Output()
sout = string(out)
return sout, err
}
func getSubst() map[string]string {
if subst != nil {
return subst
}
subst = make(map[string]string)
var substRx, _ = regexp.Compile(`(?ms)([A-Z]:\\): => ([A-Z]:.*?)$`)
sout, err := fcmdgetsubst()
if err != nil {
godbg.Pdbgf("Error invoking subst\n'%v':\nerr='%v'\n", sout, err)
return nil
}
// godbg.Perrdbgf("subst='%v'", sout)
matches := substRx.FindAllStringSubmatchIndex(sout, -1)
// godbg.Perrdbgf("matches OUT: '%v'\n", matches)
for _, m := range matches {
drive := sout[m[2]:m[3]]
substPath := strings.TrimSpace(sout[m[4]:m[5]])
subst[drive] = substPath
// godbg.Perrdbgf("drive='%v', substPath='%v'", drive, substPath)
}
// godbg.Perrdbgf("subst = '%v'", subst)
return subst
}
// NoSubst returns the path no using a subst path.
// If no subst or matching subst, returns the same object.
// If matching substs, returns new path with long form.
func (p *Path) NoSubst() *Path {
if len(getSubst()) == 0 || p.IsEmpty() {
return p
}
// godbg.Perrdbgf("No subst on path '%v'", p)
for drive, sp := range getSubst() {
// godbg.Perrdbgf("No subst drive='%v, sp='%v': p.path='%v'", drive, sp, p.path)
if strings.HasPrefix(p.path, drive) {
np := strings.Replace(p.path, drive, sp+"\\", -1)
// godbg.Perrdbgf("Reverse subst from '%v' to '%v'", p.path, np)
return NewPath(np)
}
}
return p
}
// Subst returns the path using a subst path.
// If no subst ormatching subst, returns the same object.
// If matching subst, returns new path with the short SUBSTed form.
func (p *Path) Subst() *Path {
if len(getSubst()) == 0 || p.IsEmpty() {
return p
}
// godbg.Perrdbgf("Subst on path '%v'", p)
for drive, sp := range getSubst() {
// godbg.Perrdbgf("Subst drive='%v, sp='%v': p.path='%v'", drive, sp, p.path)
if strings.HasPrefix(p.path, sp) {
np := strings.Replace(p.path, sp, drive, -1)
np = strings.Replace(np, drive+"\\", drive, -1)
// godbg.Perrdbgf("Subst from '%v' to '%v'", p.path, np)
return NewPath(np)
}
}
return p
}
func init() {
fcmdgetsubst = ifcmdgetsubst
}