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)
}
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
+}