path/filepath: convert drive letter to upper case in windows EvalSymlinks

Fixes #3347.

R=golang-dev, aram, r, rsc
CC=golang-dev
https://golang.org/cl/5918043
This commit is contained in:
Alex Brainman 2012-03-27 12:56:56 +11:00
parent 9031f952e2
commit cf13bd3fab
2 changed files with 32 additions and 1 deletions

View File

@ -846,3 +846,26 @@ func TestVolumeName(t *testing.T) {
}
}
}
func TestDriveLetterInEvalSymlinks(t *testing.T) {
if runtime.GOOS != "windows" {
return
}
wd, _ := os.Getwd()
if len(wd) < 3 {
t.Errorf("Current directory path %q is too short", wd)
}
lp := strings.ToLower(wd)
up := strings.ToUpper(wd)
flp, err := filepath.EvalSymlinks(lp)
if err != nil {
t.Fatalf("EvalSymlinks(%q) failed: %q", lp, err)
}
fup, err := filepath.EvalSymlinks(up)
if err != nil {
t.Fatalf("EvalSymlinks(%q) failed: %q", up, err)
}
if flp != fup {
t.Errorf("Results of EvalSymlinks do not match: %q and %q", flp, fup)
}
}

View File

@ -23,5 +23,13 @@ func evalSymlinks(path string) (string, error) {
}
}
b = b[:n]
return Clean(syscall.UTF16ToString(b)), nil
s := syscall.UTF16ToString(b)
// syscall.GetLongPathName does not change the case of the drive letter,
// but the result of EvalSymlinks must be unique, so we have
// EvalSymlinks(`c:\a`) == EvalSymlinks(`C:\a`).
// Make drive letter upper case. This matches what os.Getwd returns.
if len(s) >= 2 && s[1] == ':' && 'a' <= s[0] && s[0] <= 'z' {
s = string(s[0]+'A'-'a') + s[1:]
}
return Clean(s), nil
}