package events import ( "github.com/runatlantis/atlantis/server/events/command" "github.com/runatlantis/atlantis/server/events/vcs" ) func NewUnlockCommandRunner( deleteLockCommand DeleteLockCommand, vcsClient vcs.Client, SilenceNoProjects bool, ) *UnlockCommandRunner { return &UnlockCommandRunner{ deleteLockCommand: deleteLockCommand, vcsClient: vcsClient, SilenceNoProjects: SilenceNoProjects, } } type UnlockCommandRunner struct { vcsClient vcs.Client deleteLockCommand DeleteLockCommand // SilenceNoProjects is whether Atlantis should respond to PRs if no projects // are found SilenceNoProjects bool } func (u *UnlockCommandRunner) Run( ctx *command.Context, cmd *CommentCommand, ) { baseRepo := ctx.Pull.BaseRepo pullNum := ctx.Pull.Num vcsMessage := "All Atlantis locks for this PR have been unlocked and plans discarded" numLocks, err := u.deleteLockCommand.DeleteLocksByPull(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 && u.SilenceNoProjects { return } if commentErr := u.vcsClient.CreateComment(baseRepo, pullNum, vcsMessage, command.Unlock.String()); commentErr != nil { ctx.Log.Err("unable to comment: %s", commentErr) } }