os: handle long path in RemoveAll for windows
Fixes #36375
Change-Id: I407a1db23868880b83e73bc136d274659483fb69
Reviewed-on: https://go-review.googlesource.com/c/go/+/214437
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/src/os/removeall_noat.go b/src/os/removeall_noat.go
index c1b43e3..6474d2d 100644
--- a/src/os/removeall_noat.go
+++ b/src/os/removeall_noat.go
@@ -27,6 +27,7 @@
}
// Simple case: if Remove works, we're done.
+ path = fixLongPath(path)
err := Remove(path)
if err == nil || IsNotExist(err) {
return nil
diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go
index 8a71f68..6fb31c2 100644
--- a/src/os/removeall_test.go
+++ b/src/os/removeall_test.go
@@ -206,6 +206,26 @@
}
}
+func TestRemoveAllLongPathWindows(t *testing.T) {
+ startPath, err := ioutil.TempDir("", "TestRemoveAllLongPath-")
+ if err != nil {
+ t.Fatalf("Could not create TempDir: %s", err)
+ }
+ defer RemoveAll(startPath)
+
+ // Make a long path
+ err = MkdirAll(filepath.Join(startPath, "foo", "bar", strings.Repeat("a", 150),
+ strings.Repeat("b", 150)), ModePerm)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ err = RemoveAll("foo")
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
func TestRemoveAllDot(t *testing.T) {
prevDir, err := Getwd()
if err != nil {