aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2012-03-27 12:56:56 +1100
committerAlex Brainman <alex.brainman@gmail.com>2012-03-27 12:56:56 +1100
commitcf13bd3fab523931c3555c82c3d2fe896d2935c9 (patch)
treed4715f7a6fb73ae8b3bd991c0fc5ad0130f9a868
parent9031f952e2b17752f4eb716d4d96575026ce5338 (diff)
downloadgo-cf13bd3fab523931c3555c82c3d2fe896d2935c9.tar.gz
go-cf13bd3fab523931c3555c82c3d2fe896d2935c9.zip
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
-rw-r--r--src/pkg/path/filepath/path_test.go23
-rw-r--r--src/pkg/path/filepath/symlink_windows.go10
2 files changed, 32 insertions, 1 deletions
diff --git a/src/pkg/path/filepath/path_test.go b/src/pkg/path/filepath/path_test.go
index 2aba553d23..b8766588cf 100644
--- a/src/pkg/path/filepath/path_test.go
+++ b/src/pkg/path/filepath/path_test.go
@@ -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)
+ }
+}
diff --git a/src/pkg/path/filepath/symlink_windows.go b/src/pkg/path/filepath/symlink_windows.go
index afa88bfe87..2d4257720e 100644
--- a/src/pkg/path/filepath/symlink_windows.go
+++ b/src/pkg/path/filepath/symlink_windows.go
@@ -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
}