Commit 935faf3b authored by Yasuhiro Matsumoto's avatar Yasuhiro Matsumoto Committed by Russ Cox

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/16795Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent b28eeea1
...@@ -269,7 +269,7 @@ func Rel(basepath, targpath string) (string, error) { ...@@ -269,7 +269,7 @@ func Rel(basepath, targpath string) (string, error) {
// Can't use IsAbs - `\a` and `a` are both relative in Windows. // Can't use IsAbs - `\a` and `a` are both relative in Windows.
baseSlashed := len(base) > 0 && base[0] == Separator baseSlashed := len(base) > 0 && base[0] == Separator
targSlashed := len(targ) > 0 && targ[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) return "", errors.New("Rel: can't make " + targ + " relative to " + base)
} }
// Position base[b0:bi] and targ[t0:ti] at the first differing elements. // Position base[b0:bi] and targ[t0:ti] at the first differing elements.
...@@ -283,7 +283,7 @@ func Rel(basepath, targpath string) (string, error) { ...@@ -283,7 +283,7 @@ func Rel(basepath, targpath string) (string, error) {
for ti < tl && targ[ti] != Separator { for ti < tl && targ[ti] != Separator {
ti++ ti++
} }
if targ[t0:ti] != base[b0:bi] { if !sameWord(targ[t0:ti], base[b0:bi]) {
break break
} }
if bi < bl { if bi < bl {
......
...@@ -42,3 +42,7 @@ func join(elem []string) string { ...@@ -42,3 +42,7 @@ func join(elem []string) string {
} }
return "" return ""
} }
func sameWord(a, b string) bool {
return a == b
}
...@@ -1033,6 +1033,7 @@ var winreltests = []RelTests{ ...@@ -1033,6 +1033,7 @@ var winreltests = []RelTests{
{`C:a\b\c`, `C:a/b/d`, `..\d`}, {`C:a\b\c`, `C:a/b/d`, `..\d`},
{`C:\`, `D:\`, `err`}, {`C:\`, `D:\`, `err`},
{`C:`, `D:`, `err`}, {`C:`, `D:`, `err`},
{`C:\Projects`, `c:\projects\src`, `src`},
} }
func TestRel(t *testing.T) { func TestRel(t *testing.T) {
......
...@@ -44,3 +44,7 @@ func join(elem []string) string { ...@@ -44,3 +44,7 @@ func join(elem []string) string {
} }
return "" return ""
} }
func sameWord(a, b string) bool {
return a == b
}
...@@ -145,3 +145,7 @@ func joinNonEmpty(elem []string) string { ...@@ -145,3 +145,7 @@ func joinNonEmpty(elem []string) string {
func isUNC(path string) bool { func isUNC(path string) bool {
return volumeNameLen(path) > 2 return volumeNameLen(path) > 2
} }
func sameWord(a, b string) bool {
return strings.EqualFold(a, b)
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment