func CloneRepo()

in tools/version-tracker/pkg/git/git.go [21:64]


func CloneRepo(cloneURL, destination, headRepoOwner, branch string) (*git.Repository, string, error) {
	logger.V(6).Info(fmt.Sprintf("Cloning repository [%s] to %s directory", cloneURL, destination))
	progress := io.Discard
	if logger.Verbosity >= 6 {
		progress = os.Stdout
	}
	repo, err := git.PlainClone(destination, false, &git.CloneOptions{
		URL:      cloneURL,
		Progress: progress,
	})
	if err != nil {
		if err == git.ErrRepositoryAlreadyExists {
			logger.V(6).Info(fmt.Sprintf("Repo already exists at %s", destination))
			repo, err = git.PlainOpen(destination)
			if err != nil {
				return nil, "", fmt.Errorf("opening repo from %s directory: %v", destination, err)
			}
		} else {
			return nil, "", fmt.Errorf("cloning repo %s to %s directory: %v", cloneURL, destination, err)
		}
	}

	repoHeadCommit, err := repo.ResolveRevision(plumbing.Revision(fmt.Sprintf(constants.BaseRepoHeadRevisionPattern, branch)))
	if err != nil {
		return nil, "", fmt.Errorf("resolving revision [%s] to commit hash: %v", fmt.Sprintf(constants.BaseRepoHeadRevisionPattern, branch), err)
	}
	repoHeadCommitHash := strings.Split(repoHeadCommit.String(), " ")[0]

	if headRepoOwner != "" {
		_, err = repo.CreateRemote(&config.RemoteConfig{
			Name: headRepoOwner,
			URLs: []string{fmt.Sprintf("https://github.com/%s/%s.git", headRepoOwner, constants.BuildToolingRepoName)},
		})
		if err != nil {
			if err == git.ErrRemoteExists {
				logger.V(6).Info(fmt.Sprintf("Remote %s already exists", headRepoOwner))
			} else {
				return nil, "", fmt.Errorf("creating remote %s: %v", headRepoOwner, err)
			}
		}
	}

	return repo, repoHeadCommitHash, nil
}