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
}