func checkout()

in worker/api/stack.go [119:173]


func checkout(dir string, commit string) error {
	log.Println("Prepare sandboxes repository", dir, commit)

	if !plumbing.IsHash(commit) {
		return errors.New(fmt.Sprint("invalid commit hash", commit))
	}

	var progress io.Writer
	if config.Verbose {
		progress = log.Writer()
	}

	repo, err := git.PlainClone(dir, false, &git.CloneOptions{
		URL:      config.GitUrl,
		Progress: progress,
	})

	if err != nil {
		repo, err = git.PlainOpen(dir)
		if err != nil {
			log.Println("Unable to open git repo:", err)
			return err
		}
	}

	refHash := plumbing.NewHash(commit)
	if len(commit) <= 0 {
		ref, err := repo.Head()
		if err != nil {
			log.Println("Unable to retrive ref to HEAD of git repo:", err)
			return err
		}

		refHash = ref.Hash()
	}

	wt, err := repo.Worktree()
	if err != nil {
		log.Println("Unable to read work tree of git repo:", err)
		return err
	}

	log.Println("Checkout", refHash)
	err = wt.Checkout(&git.CheckoutOptions{
		Hash:  refHash,
		Force: true,
		Keep:  false,
	})
	if err != nil {
		log.Println("Unable to checkout git repo:", err)
		return err
	}

	return nil
}