diff --git a/server/events/working_dir.go b/server/events/working_dir.go index c8f006aa30..2166ac3c0e 100644 --- a/server/events/working_dir.go +++ b/server/events/working_dir.go @@ -117,11 +117,15 @@ func (w *FileWorkspace) Clone( // We're prefix matching here because BitBucket doesn't give us the full // commit, only a 12 character prefix. if strings.HasPrefix(currCommit, p.HeadCommit) { - log.Debug("repo is at correct commit %q so will not re-clone", p.HeadCommit) - return cloneDir, w.warnDiverged(log, p, headRepo, cloneDir), nil + if w.CheckoutMerge && w.recheckDiverged(log, p, headRepo, cloneDir) { + log.Info("base branch has been updated, using merge strategy and will clone again") + } else { + log.Debug("repo is at correct commit %q so will not re-clone", p.HeadCommit) + return cloneDir, false, nil + } + } else { + log.Debug("repo was already cloned but is not at correct commit, wanted %q got %q", p.HeadCommit, currCommit) } - - log.Debug("repo was already cloned but is not at correct commit, wanted %q got %q", p.HeadCommit, currCommit) // We'll fall through to re-clone. } @@ -129,14 +133,14 @@ func (w *FileWorkspace) Clone( return cloneDir, false, w.forceClone(log, cloneDir, headRepo, p) } -// warnDiverged returns true if we should warn the user that the branch we're -// merging into has diverged from what we currently have checked out. +// recheckDiverged returns true if the branch we're merging into has diverged +// from what we currently have checked out. // This matters in the case of the merge checkout strategy because after -// cloning the repo and doing the merge, it's possible main was updated. -// Then users won't be getting the merge functionality they expected. +// cloning the repo and doing the merge, it's possible main was updated +// and we have to perform a new merge. // If there are any errors we return false since we prefer things to succeed // vs. stopping the plan/apply. -func (w *FileWorkspace) warnDiverged(log logging.SimpleLogging, p models.PullRequest, headRepo models.Repo, cloneDir string) bool { +func (w *FileWorkspace) recheckDiverged(log logging.SimpleLogging, p models.PullRequest, headRepo models.Repo, cloneDir string) bool { if !w.CheckoutMerge { // It only makes sense to warn that main has diverged if we're using // the checkout merge strategy. If we're just checking out the branch, @@ -174,13 +178,7 @@ func (w *FileWorkspace) warnDiverged(log logging.SimpleLogging, p models.PullReq } } - hasDiverged := w.HasDiverged(log, cloneDir) - if hasDiverged { - log.Info("remote main branch is ahead and thereby has new commits, it is recommended to pull new commits") - } else { - log.Debug("remote main branch has no new commits") - } - return hasDiverged + return w.HasDiverged(log, cloneDir) } func (w *FileWorkspace) HasDiverged(log logging.SimpleLogging, cloneDir string) bool {