mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-07-28 21:38:25 +00:00
78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
package events
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"github.com/runatlantis/atlantis/server/events/command"
|
|
"github.com/runatlantis/atlantis/server/events/vcs"
|
|
)
|
|
|
|
func NewUnlockCommandRunner(
|
|
deleteLockCommand DeleteLockCommand,
|
|
vcsClient vcs.Client,
|
|
SilenceNoProjects bool,
|
|
DisableUnlockLabel string,
|
|
) *UnlockCommandRunner {
|
|
return &UnlockCommandRunner{
|
|
deleteLockCommand: deleteLockCommand,
|
|
vcsClient: vcsClient,
|
|
SilenceNoProjects: SilenceNoProjects,
|
|
DisableUnlockLabel: DisableUnlockLabel,
|
|
}
|
|
}
|
|
|
|
type UnlockCommandRunner struct {
|
|
vcsClient vcs.Client
|
|
deleteLockCommand DeleteLockCommand
|
|
// SilenceNoProjects is whether Atlantis should respond to PRs if no projects
|
|
// are found
|
|
SilenceNoProjects bool
|
|
DisableUnlockLabel string
|
|
}
|
|
|
|
func (u *UnlockCommandRunner) Run(ctx *command.Context, _ *CommentCommand) {
|
|
baseRepo := ctx.Pull.BaseRepo
|
|
pullNum := ctx.Pull.Num
|
|
disableUnlockLabel := u.DisableUnlockLabel
|
|
|
|
ctx.Log.Info("Unlocking all locks")
|
|
vcsMessage := "All Atlantis locks for this PR have been unlocked and plans discarded"
|
|
|
|
var hasLabel bool
|
|
var err error
|
|
if disableUnlockLabel != "" {
|
|
var labels []string
|
|
labels, err = u.vcsClient.GetPullLabels(ctx.Log, baseRepo, ctx.Pull)
|
|
if err != nil {
|
|
vcsMessage = "Failed to retrieve PR labels... Not unlocking"
|
|
ctx.Log.Err("Failed to retrieve PR labels for pull %s", err.Error())
|
|
}
|
|
hasLabel = slices.Contains(labels, disableUnlockLabel)
|
|
if hasLabel {
|
|
vcsMessage = "Not allowed to unlock PR with " + disableUnlockLabel + " label"
|
|
ctx.Log.Info("Not allowed to unlock PR with %v label", disableUnlockLabel)
|
|
}
|
|
}
|
|
|
|
var numLocks int
|
|
if err == nil && !hasLabel {
|
|
numLocks, err = u.deleteLockCommand.DeleteLocksByPull(ctx.Log, baseRepo.FullName, pullNum)
|
|
if err != nil {
|
|
vcsMessage = "Failed to delete PR locks"
|
|
ctx.Log.Err("failed to delete locks by pull %s", err.Error())
|
|
}
|
|
}
|
|
|
|
// if there are no locks to delete, no errors, and SilenceNoProjects is enabled, don't comment
|
|
if err == nil && numLocks == 0 {
|
|
ctx.Log.Info("No locks to delete")
|
|
if u.SilenceNoProjects {
|
|
return
|
|
}
|
|
}
|
|
|
|
if commentErr := u.vcsClient.CreateComment(ctx.Log, baseRepo, pullNum, vcsMessage, command.Unlock.String()); commentErr != nil {
|
|
ctx.Log.Err("unable to comment: %s", commentErr)
|
|
}
|
|
}
|