mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-08-01 04:38:42 +00:00
* Moved CommandContext and CommandResult to models (#193) * Moved CommandContext and CommandResult to models * move from models to command rename CommandContext -> Context rename CommandResult -> Result * moved command related helpers into command package * move ProjectCommandContext and ProjectResult to command/project package * move project command context and project result * revert unrelated code * move tests * fix left over * fix linting * fix tests * remove unused import * fix project context dependencies * fix depenedecies * fix typo
60 lines
2.3 KiB
Go
60 lines
2.3 KiB
Go
package events
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/runatlantis/atlantis/server/events/command"
|
|
"github.com/runatlantis/atlantis/server/events/models"
|
|
"github.com/runatlantis/atlantis/server/events/vcs"
|
|
)
|
|
|
|
type AutoMerger struct {
|
|
VCSClient vcs.Client
|
|
GlobalAutomerge bool
|
|
}
|
|
|
|
func (c *AutoMerger) automerge(ctx *command.Context, pullStatus models.PullStatus, deleteSourceBranchOnMerge bool) {
|
|
// We only automerge if all projects have been successfully applied.
|
|
for _, p := range pullStatus.Projects {
|
|
if p.Status != models.AppliedPlanStatus {
|
|
ctx.Log.Info("not automerging because project at dir %q, workspace %q has status %q", p.RepoRelDir, p.Workspace, p.Status.String())
|
|
return
|
|
}
|
|
}
|
|
|
|
// Comment that we're automerging the pull request.
|
|
if err := c.VCSClient.CreateComment(ctx.Pull.BaseRepo, ctx.Pull.Num, automergeComment, command.Apply.String()); err != nil {
|
|
ctx.Log.Err("failed to comment about automerge: %s", err)
|
|
// Commenting isn't required so continue.
|
|
}
|
|
|
|
// Make the API call to perform the merge.
|
|
ctx.Log.Info("automerging pull request")
|
|
var pullOptions models.PullRequestOptions
|
|
pullOptions.DeleteSourceBranchOnMerge = deleteSourceBranchOnMerge
|
|
err := c.VCSClient.MergePull(ctx.Pull, pullOptions)
|
|
|
|
if err != nil {
|
|
ctx.Log.Err("automerging failed: %s", err)
|
|
|
|
failureComment := fmt.Sprintf("Automerging failed:\n```\n%s\n```", err)
|
|
if commentErr := c.VCSClient.CreateComment(ctx.Pull.BaseRepo, ctx.Pull.Num, failureComment, command.Apply.String()); commentErr != nil {
|
|
ctx.Log.Err("failed to comment about automerge failing: %s", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// automergeEnabled returns true if automerging is enabled in this context.
|
|
func (c *AutoMerger) automergeEnabled(projectCmds []command.ProjectContext) bool {
|
|
// If the global automerge is set, we always automerge.
|
|
return c.GlobalAutomerge ||
|
|
// Otherwise we check if this repo is configured for automerging.
|
|
(len(projectCmds) > 0 && projectCmds[0].AutomergeEnabled)
|
|
}
|
|
|
|
// deleteSourceBranchOnMergeEnabled returns true if we should delete the source branch on merge in this context.
|
|
func (c *AutoMerger) deleteSourceBranchOnMergeEnabled(projectCmds []command.ProjectContext) bool {
|
|
//check if this repo is configured for automerging.
|
|
return (len(projectCmds) > 0 && projectCmds[0].DeleteSourceBranchOnMerge)
|
|
}
|