mirror of
https://github.com/golang/go
synced 2024-11-23 16:20:04 -07:00
path/filepath: in Rel use case-insensitive comparison on Windows
Fixes #10802 Compare Volume name and each path elements using strings.EqualFold. Change-Id: Ibdefdb801d0326e53755bc9cc8c10eed998094e5 Reviewed-on: https://go-review.googlesource.com/16795 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
b28eeea136
commit
935faf3be2
@ -269,7 +269,7 @@ func Rel(basepath, targpath string) (string, error) {
|
||||
// Can't use IsAbs - `\a` and `a` are both relative in Windows.
|
||||
baseSlashed := len(base) > 0 && base[0] == Separator
|
||||
targSlashed := len(targ) > 0 && targ[0] == Separator
|
||||
if baseSlashed != targSlashed || baseVol != targVol {
|
||||
if baseSlashed != targSlashed || !sameWord(baseVol, targVol) {
|
||||
return "", errors.New("Rel: can't make " + targ + " relative to " + base)
|
||||
}
|
||||
// Position base[b0:bi] and targ[t0:ti] at the first differing elements.
|
||||
@ -283,7 +283,7 @@ func Rel(basepath, targpath string) (string, error) {
|
||||
for ti < tl && targ[ti] != Separator {
|
||||
ti++
|
||||
}
|
||||
if targ[t0:ti] != base[b0:bi] {
|
||||
if !sameWord(targ[t0:ti], base[b0:bi]) {
|
||||
break
|
||||
}
|
||||
if bi < bl {
|
||||
|
@ -42,3 +42,7 @@ func join(elem []string) string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func sameWord(a, b string) bool {
|
||||
return a == b
|
||||
}
|
||||
|
@ -1033,6 +1033,7 @@ var winreltests = []RelTests{
|
||||
{`C:a\b\c`, `C:a/b/d`, `..\d`},
|
||||
{`C:\`, `D:\`, `err`},
|
||||
{`C:`, `D:`, `err`},
|
||||
{`C:\Projects`, `c:\projects\src`, `src`},
|
||||
}
|
||||
|
||||
func TestRel(t *testing.T) {
|
||||
|
@ -44,3 +44,7 @@ func join(elem []string) string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func sameWord(a, b string) bool {
|
||||
return a == b
|
||||
}
|
||||
|
@ -145,3 +145,7 @@ func joinNonEmpty(elem []string) string {
|
||||
func isUNC(path string) bool {
|
||||
return volumeNameLen(path) > 2
|
||||
}
|
||||
|
||||
func sameWord(a, b string) bool {
|
||||
return strings.EqualFold(a, b)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user