Example #1
0
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
}