func (bc *fsBuildCache) InstallVersion(v versionutil.Version, target string) error { cached := bc.getCached(v) var cachedInit string if cached == "" { if v.Commit != "" { return ErrCannotDownloadCommit } resp, err := http.Get(v.DownloadURL()) if err != nil { return err } tf, err := bc.tempFile() if err != nil { return err } _, err = io.Copy(tf, resp.Body) if err != nil { if err := bc.cleanupTempFile(tf); err != nil { // Just log log.Printf("Error cleaning up temp file %v: %s", tf.Name(), err) } return err } cached, err = bc.saveVersion(tf, v) if err != nil { return err } // Remove any "-init" cachedInit = initFile(cached) if _, err := os.Stat(cachedInit); err == nil { if err := os.Remove(cachedInit); err != nil { return err } } } else { cachedInit = initFile(cached) } if err := CopyFile(cached, target, 0755); err != nil { return err } targetInit := initFile(target) if _, err := os.Stat(cachedInit); err == nil { // Create target file, check if name starts with docker, replace with dockerinit return CopyFile(cachedInit, targetInit, 0755) } if _, err := os.Stat(targetInit); err == nil { // Truncate file, do not remove since operator may only have access // to file and not directory. Future calls may rely on overwriting // the content of this file. vf, err := os.OpenFile(targetInit, os.O_TRUNC|os.O_WRONLY, 0755) if err != nil { return err } return vf.Close() } return nil }