1
0
mirror of https://github.com/golang/go synced 2024-09-30 00:14:36 -06:00

cmd/api: be more robust against OS deleting temp files

OS X in particular deletes tmp files (but not directories)
pretty reliably.

Ask hg whether the go.tools directory in tmp is good before
using it.

Fixes issue Rob and others were reporting, which I just hit
myself now.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/13084049
This commit is contained in:
Brad Fitzpatrick 2013-08-24 16:54:56 -05:00
parent cb79c57dfa
commit e7b125fc65

View File

@ -110,12 +110,13 @@ func prepGoPath() string {
tmpDir := filepath.Join(cloneDir, tempBase)
// finalDir is where the checkout will live once it's complete.
// If this exists already, we're done.
finalDir := filepath.Join(cloneDir, "go.tools")
if fi, err := os.Stat(finalDir); err == nil && fi.IsDir() {
if goToolsCheckoutGood(finalDir) {
return gopath
}
os.RemoveAll(finalDir) // in case it's there but corrupt
os.RemoveAll(tmpDir) // in case of aborted hg clone before
if err := os.MkdirAll(cloneDir, 0700); err != nil {
log.Fatal(err)
@ -138,3 +139,29 @@ func prepGoPath() string {
}
return gopath
}
func goToolsCheckoutGood(dir string) bool {
if _, err := os.Stat(dir); err != nil {
return false
}
cmd := exec.Command("hg", "id", "--id")
cmd.Dir = dir
out, err := cmd.Output()
if err != nil {
return false
}
id := strings.TrimSpace(string(out))
if id != goToolsVersion {
return false
}
cmd = exec.Command("hg", "status")
cmd.Dir = dir
out, err = cmd.Output()
if err != nil || len(out) > 0 {
return false
}
return true
}