Skip to content

Commit

Permalink
Merge branch 'cancel-all-deploys'
Browse files Browse the repository at this point in the history
  • Loading branch information
cwarden committed Sep 2, 2024
2 parents 9659b59 + ac6aeef commit 3c93671
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 5 deletions.
64 changes: 59 additions & 5 deletions command/deploys.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"os"
"strconv"
"strings"
"sync"
"time"

"github.com/ForceCLI/force/bubbles"
Expand All @@ -22,7 +23,8 @@ func init() {
defaultOutputFormat = "csv"
}
cancelDeployCmd.Flags().StringP("deploy-id", "d", "", "Deploy Id to cancel")
cancelDeployCmd.MarkFlagRequired("deploy-id")
cancelDeployCmd.Flags().BoolP("all", "A", false, "Cancel all pending and in-progress deploys")
cancelDeployCmd.MarkFlagsMutuallyExclusive("deploy-id", "all")

listDeploysCmd.Flags().StringP("format", "f", defaultOutputFormat, "output format: csv, json, json-pretty, console")

Expand All @@ -48,6 +50,7 @@ List and cancel metadata deployments.

Example: `
force deploys list
force deploys cancel --all
force deploys cancel -d 0Af000000000000000
`,
DisableFlagsInUseLine: false,
Expand Down Expand Up @@ -156,15 +159,66 @@ var cancelDeployCmd = &cobra.Command{
Use: "cancel -d <deploy id>",
Short: "Cancel deploy",
DisableFlagsInUseLine: true,
Run: func(cmd *cobra.Command, args []string) {
RunE: func(cmd *cobra.Command, args []string) error {
all, _ := cmd.Flags().GetBool("all")
if all {
err := cancelAll()
if err != nil {
ErrorAndExit("Error canceling jobs: " + err.Error())
}
return nil
}
deployId, _ := cmd.Flags().GetString("deploy-id")
_, err := force.Metadata.CancelDeploy(deployId)
if err != nil {
ErrorAndExit("Error canceling job: " + err.Error())
if deployId != "" {
_, err := force.Metadata.CancelDeploy(deployId)
if err != nil {
ErrorAndExit("Error canceling job: " + err.Error())
}
return nil
}
return fmt.Errorf("--all or --deploy-id required")
},
}

func cancelAll() error {
query := `SELECT Id FROM DeployRequest WHERE Status IN ('Pending', 'InProgress')`
var queryOptions []func(*QueryOptions)
queryOptions = append(queryOptions, func(options *QueryOptions) {
options.IsTooling = true
})
result, err := force.Query(query, queryOptions...)
if err != nil {
return err
}
var wg sync.WaitGroup
for _, r := range result.Records {
wg.Add(1)
deployId := r["Id"].(string)
go func() {
defer wg.Done()
_, err := force.Metadata.CancelDeploy(deployId)
if err != nil && err != AlreadyCompletedError {
ErrorAndExit("Error cancelling deploy: " + err.Error())
}
for {
result, err := force.Metadata.CheckDeployStatus(deployId)
if err != nil {
ErrorAndExit("Error checking deploy status: " + err.Error())
}
if result.Done {
Log.Info(fmt.Sprintf("Deploy %s finished: %s", deployId, result.Status))
return
}
Log.Info(fmt.Sprintf("Waiting for deploy %s to finish: %s", deployId, result.Status))
time.Sleep(1 * time.Second)
}
}()
}
wg.Wait()

return nil
}

func displayErrors(deployId string) {
result, err := force.Metadata.CheckDeployStatus(deployId)
if err != nil {
Expand Down
5 changes: 5 additions & 0 deletions lib/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ type BigObject struct {
Fields []BigObjectField
}

var AlreadyCompletedError = errors.New("Deployment already completed")

var preserveZip bool

func (bo *BigObject) ToXml() string {
Expand Down Expand Up @@ -750,6 +752,9 @@ func (fm *ForceMetadata) CancelDeploy(id string) (ForceCancelDeployResult, error
var cancelResult ForceCancelDeployResult
body, err := fm.soapExecute("cancelDeploy", fmt.Sprintf("<id>%s</id>", id))
if err != nil {
if err.Error() == "INVALID_ID_FIELD: Deployment already completed" {
err = AlreadyCompletedError
}
return cancelResult, err
}

Expand Down

0 comments on commit 3c93671

Please sign in to comment.