Skip to content

Commit 515ecf5

Browse files
committed
Fix os.RemoveAll() for windows pre-go1.7
Fixes golang#18.
1 parent f7fd81c commit 515ecf5

File tree

5 files changed

+76
-7
lines changed

5 files changed

+76
-7
lines changed

manager_test.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ func TestSourceManagerInit(t *testing.T) {
4545
if err != nil {
4646
t.Errorf("Unexpected error on SourceManager creation: %s", err)
4747
}
48-
defer os.RemoveAll(cpath)
48+
defer func() {
49+
err := removeAll(cpath)
50+
if err != nil {
51+
t.Errorf("removeAll failed: %s", err)
52+
}
53+
}()
4954

5055
_, err = NewSourceManager(cpath, bd, false, dummyAnalyzer{})
5156
if err == nil {
@@ -79,8 +84,13 @@ func TestProjectManagerInit(t *testing.T) {
7984
t.Errorf("Unexpected error on SourceManager creation: %s", err)
8085
t.FailNow()
8186
}
87+
defer func() {
88+
err := removeAll(cpath)
89+
if err != nil {
90+
t.Errorf("removeAll failed: %s", err)
91+
}
92+
}()
8293
defer sm.Release()
83-
defer os.RemoveAll(cpath)
8494

8595
pn := ProjectName("github.com/Masterminds/VCSTestRepo")
8696
v, err := sm.ListVersions(pn)
@@ -210,15 +220,20 @@ func TestRepoVersionFetching(t *testing.T) {
210220
pmi, err := sm.getProjectManager(u)
211221
if err != nil {
212222
sm.Release()
213-
os.RemoveAll(cpath)
223+
removeAll(cpath)
214224
t.Errorf("Unexpected error on ProjectManager creation: %s", err)
215225
t.FailNow()
216226
}
217227
pms[k] = pmi.pm.(*projectManager)
218228
}
219229

230+
defer func() {
231+
err := removeAll(cpath)
232+
if err != nil {
233+
t.Errorf("removeAll failed: %s", err)
234+
}
235+
}()
220236
defer sm.Release()
221-
defer os.RemoveAll(cpath)
222237

223238
// test git first
224239
vlist, exbits, err := pms[0].crepo.getCurrentVersionPairs()
@@ -305,8 +320,13 @@ func TestGetInfoListVersionsOrdering(t *testing.T) {
305320
t.Errorf("Unexpected error on SourceManager creation: %s", err)
306321
t.FailNow()
307322
}
323+
defer func() {
324+
err := removeAll(cpath)
325+
if err != nil {
326+
t.Errorf("removeAll failed: %s", err)
327+
}
328+
}()
308329
defer sm.Release()
309-
defer os.RemoveAll(cpath)
310330

311331
// setup done, now do the test
312332

project_manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ func stripVendor(path string, info os.FileInfo, err error) error {
531531
if info.Name() == "vendor" {
532532
if _, err := os.Lstat(path); err == nil {
533533
if info.IsDir() {
534-
return os.RemoveAll(path)
534+
return removeAll(path)
535535
}
536536
}
537537
}

remove_go16.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// +build !go1.7
2+
3+
package vsolver
4+
5+
import (
6+
"os"
7+
"path/filepath"
8+
"runtime"
9+
)
10+
11+
// removeAll removes path and any children it contains. It deals correctly with
12+
// removal on Windows where, prior to Go 1.7, there were issues when files were
13+
// set to read-only.
14+
func removeAll(path string) error {
15+
// Only need special handling for windows
16+
if runtime.GOOS != "windows" {
17+
return os.RemoveAll(path)
18+
}
19+
20+
// Simple case: if Remove works, we're done.
21+
err := os.Remove(path)
22+
if err == nil || os.IsNotExist(err) {
23+
return nil
24+
}
25+
26+
// make sure all files are writable so we can delete them
27+
return filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
28+
if err != nil {
29+
// walk gave us some error, give it back.
30+
return err
31+
}
32+
mode := info.Mode()
33+
if mode|0200 == mode {
34+
return nil
35+
}
36+
return os.Chmod(path, mode|0200)
37+
})
38+
}

remove_go17.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// +build go1.7
2+
3+
package vsolver
4+
5+
import "os"
6+
7+
// go1.7 and later deal with the file perms issue in os.RemoveAll(), so our
8+
// workaround is no longer necessary.
9+
func removeAll(path string) error {
10+
return os.RemoveAll(path)
11+
}

result.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func CreateVendorTree(basedir string, l Lock, sm SourceManager, sv bool) error {
4646

4747
err = sm.ExportProject(p.Ident().LocalName, p.Version(), to)
4848
if err != nil {
49-
os.RemoveAll(basedir)
49+
removeAll(basedir)
5050
return fmt.Errorf("Error while exporting %s: %s", p.Ident().LocalName, err)
5151
}
5252
if sv {

0 commit comments

Comments
 (0)