in funcbench/env.go [104:165]
func newGitHubEnv(ctx context.Context, e environment, gc *gitHubClient, workspace string) (Environment, error) {
var r *git.Repository
var err error
retryTime := 10 * time.Second
// Retry 10 times.
for i := 1; i <= 10; i++ {
if err := os.RemoveAll(filepath.Join(workspace, gc.repo)); err != nil {
return nil, err
}
e.logger.Println("Cloning ", gc.owner, ":", gc.repo, " is in progress. Checking in ", retryTime)
time.Sleep(retryTime)
r, err = git.PlainCloneContext(ctx, filepath.Join(workspace, gc.repo), false, &git.CloneOptions{
URL: fmt.Sprintf("https://github.com/%s/%s.git", gc.owner, gc.repo),
Progress: os.Stdout,
})
if err == nil {
break
}
}
if err != nil {
return nil, errors.Wrap(err, "clone git repository")
}
if err := os.Chdir(filepath.Join(workspace, gc.repo)); err != nil {
return nil, errors.Wrapf(err, "changing to %s/%s dir", workspace, gc.repo)
}
g := &GitHub{
environment: e,
repo: r,
client: gc,
ctx: ctx,
}
if err := os.Setenv("CGO_ENABLED", "0"); err != nil {
return nil, err
}
wt, err := g.repo.Worktree()
if err != nil {
return nil, err
}
if err := r.FetchContext(ctx, &git.FetchOptions{
RefSpecs: []config.RefSpec{
config.RefSpec(fmt.Sprintf("+refs/pull/%d/head:refs/heads/pullrequest", gc.prNumber)),
},
Progress: os.Stdout,
}); err != nil && err != git.NoErrAlreadyUpToDate {
return nil, errors.Wrap(err, "fetch to pull request branch")
}
if err = wt.Checkout(&git.CheckoutOptions{
Branch: plumbing.NewBranchReferenceName("pullrequest"),
}); err != nil {
return nil, errors.Wrap(err, "switch to pull request branch")
}
e.logger.Println("[GitHub Mode]", gc.owner, ":", gc.repo, "\nBenchmarking PR -", gc.prNumber, "versus:", e.compareTarget, "\nBenchmark func regex:", e.benchFunc)
return g, nil
}