]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/api: be more robust against OS deleting temp files
authorBrad Fitzpatrick <bradfitz@golang.org>
Sat, 24 Aug 2013 21:54:56 +0000 (16:54 -0500)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 24 Aug 2013 21:54:56 +0000 (16:54 -0500)
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

src/cmd/api/run.go

index a13d9a5496e7e3c52674120830755b5b85e26eba..067be4eb05d0ae952f6d6472a475d1a4dbe62ccf 100644 (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
+}