Skip to content

Commit

Permalink
Merge pull request profclems#315 from zemzale/b-mr-close-panic
Browse files Browse the repository at this point in the history
fix(mr): Readd ability to close multiple MRs
  • Loading branch information
zemzale authored Nov 23, 2020
2 parents 80b8cd5 + acf0b3e commit 48d09df
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 41 deletions.
25 changes: 10 additions & 15 deletions commands/mr/close/mr_close.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package close

import (
"fmt"
"strings"

"github.com/profclems/glab/commands/cmdutils"
"github.com/profclems/glab/commands/mr/mrutils"
Expand All @@ -26,30 +25,26 @@ func NewCmdClose(f *cmdutils.Factory) *cobra.Command {
return err
}

mr, repo, err := mrutils.MRFromArgs(f, args)
mrs, repo, err := mrutils.MRsFromArgs(f, args)
if err != nil {
return err
}

if err = mrutils.MRCheckErrors(mr, mrutils.MRCheckErrOptions{
Closed: true,
Merged: true,
}); err != nil {
return err
}

mergeID := args[0]

l := &gitlab.UpdateMergeRequestOptions{}
l.StateEvent = gitlab.String("close")
arrIds := strings.Split(strings.Trim(mergeID, "[] "), ",")
for _, i2 := range arrIds {
for _, mr := range mrs {
if err = mrutils.MRCheckErrors(mr, mrutils.MRCheckErrOptions{
Closed: true,
Merged: true,
}); err != nil {
return err
}
fmt.Fprintf(f.IO.StdOut, "- Closing Merge request...")
mr, err := api.UpdateMR(apiClient, repo.FullName(), utils.StringToInt(i2), l)
_, err := api.UpdateMR(apiClient, repo.FullName(), mr.IID, l)
if err != nil {
return err
}
fmt.Fprintf(f.IO.StdOut, "%s Merge request !%s\n", utils.RedCheck(), i2)
fmt.Fprintf(f.IO.StdOut, "%s Merge request !%d\n", utils.RedCheck(), mr.IID)
fmt.Fprintln(f.IO.StdOut, mrutils.DisplayMR(mr))
}

Expand Down
16 changes: 8 additions & 8 deletions commands/mr/delete/mr_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,28 @@ func NewCmdDelete(f *cmdutils.Factory) *cobra.Command {
Use: "delete [<id> | <branch>]",
Short: `Delete merge requests`,
Long: ``,
Aliases: []string{"del"},
Args: cobra.MaximumNArgs(1),
Aliases: []string{"del"},
Example: "$ glab delete 123",
RunE: func(cmd *cobra.Command, args []string) error {
apiClient, err := f.HttpClient()
if err != nil {
return err
}

mr, repo, err := mrutils.MRFromArgs(f, args)
mrs, repo, err := mrutils.MRsFromArgs(f, args)
if err != nil {
return err
}

fmt.Fprintf(f.IO.StdOut, "- Deleting Merge Request !%d\n", mr.IID)

if err = api.DeleteMR(apiClient, repo.FullName(), mr.IID); err != nil {
return err
for _, mr := range mrs {
fmt.Fprintf(f.IO.StdOut, "- Deleting Merge Request !%d\n", mr.IID)
if err = api.DeleteMR(apiClient, repo.FullName(), mr.IID); err != nil {
return err
}
fmt.Fprintf(f.IO.StdOut, "%s Merge request !%d deleted\n", utils.RedCheck(), mr.IID)
}

fmt.Fprintf(f.IO.StdOut, "%s Merge request !%d deleted\n", utils.RedCheck(), mr.IID)

return nil
},
}
Expand Down
58 changes: 58 additions & 0 deletions commands/mr/mrutils/mrutils.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package mrutils

import (
"context"
"fmt"
"strconv"
"strings"

"github.com/profclems/glab/commands/cmdutils"
"github.com/profclems/glab/internal/glrepo"
"github.com/profclems/glab/internal/utils"
"github.com/profclems/glab/pkg/api"
"github.com/profclems/glab/pkg/tableprinter"
"github.com/xanzy/go-gitlab"
"golang.org/x/sync/errgroup"
)

type MRCheckErrOptions struct {
Expand Down Expand Up @@ -151,6 +154,61 @@ func MRFromArgs(f *cmdutils.Factory, args []string) (*gitlab.MergeRequest, glrep
return mr, baseRepo, nil
}

func MRsFromArgs(f *cmdutils.Factory, args []string) ([]*gitlab.MergeRequest, glrepo.Interface, error) {
if len(args) <= 1 {
var arrIDs []string
if len(args) == 1 {
arrIDs = strings.Split(args[0], ",")
}
if len(arrIDs) <= 1 {
mr, baseRepo, err := MRFromArgs(f, args)
if err != nil {
return nil, nil, err
}
return []*gitlab.MergeRequest{mr}, baseRepo, err
}
args = arrIDs
}

apiClient, err := f.HttpClient()
if err != nil {
return nil, nil, err
}

baseRepo, err := f.BaseRepo()
if err != nil {
return nil, nil, err
}

errGroup, _ := errgroup.WithContext(context.Background())
mrs := make([]*gitlab.MergeRequest, len(args))
for i, arg := range args {
i, arg := i, arg
errGroup.Go(func() error {
mrID, err := strconv.Atoi(arg)
if err != nil {
return err
}
if mrID == 0 {
return fmt.Errorf("invalid merge request ID provided")
}
// fetching multiple MRs does not return many major params in the payload
// so we fetch again using the single mr endpoint
mr, err := api.GetMR(apiClient, baseRepo.FullName(), mrID, &gitlab.GetMergeRequestsOptions{})
if err != nil {
return fmt.Errorf("failed to get merge request %d: %w", mrID, err)
}
mrs[i] = mr
return nil
})
}
if err := errGroup.Wait(); err != nil {
return nil, nil, err
}
return mrs, baseRepo, nil

}

func GetOpenMRForBranch(apiClient *gitlab.Client, baseRepo glrepo.Interface, currentBranch string) (*gitlab.MergeRequest, error) {
mrs, err := api.ListMRs(apiClient, baseRepo.FullName(), &gitlab.ListProjectMergeRequestsOptions{
SourceBranch: gitlab.String(currentBranch),
Expand Down
36 changes: 18 additions & 18 deletions commands/mr/reopen/mr_reopen.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,39 +17,39 @@ func NewCmdReopen(f *cmdutils.Factory) *cobra.Command {
Use: "reopen [<id> | <branch>]",
Short: `Reopen merge requests`,
Long: ``,
Aliases: []string{"open"},
Args: cobra.MaximumNArgs(1),
Aliases: []string{"open"},
RunE: func(cmd *cobra.Command, args []string) error {
apiClient, err := f.HttpClient()
if err != nil {
return err
}

mr, repo, err := mrutils.MRFromArgs(f, args)
mrs, repo, err := mrutils.MRsFromArgs(f, args)
if err != nil {
return err
}

if err = mrutils.MRCheckErrors(mr, mrutils.MRCheckErrOptions{
Opened: true,
Merged: true,
}); err != nil {
return err
}

l := &gitlab.UpdateMergeRequestOptions{}
l.StateEvent = gitlab.String("reopen")

fmt.Fprintf(f.IO.StdOut, "- Reopening Merge request !%d...\n", mr.IID)

mr, err = api.UpdateMR(apiClient, repo.FullName(), mr.IID, l)
if err != nil {
return err
for _, mr := range mrs {
if err = mrutils.MRCheckErrors(mr, mrutils.MRCheckErrOptions{
Opened: true,
Merged: true,
}); err != nil {
return err
}

fmt.Fprintf(f.IO.StdOut, "- Reopening Merge request !%d...\n", mr.IID)
mr, err = api.UpdateMR(apiClient, repo.FullName(), mr.IID, l)
if err != nil {
return err
}

fmt.Fprintf(f.IO.StdOut, "%s Merge request !%d reopened\n", utils.GreenCheck(), mr.IID)
fmt.Fprintln(f.IO.StdOut, mrutils.DisplayMR(mr))
}

fmt.Fprintf(f.IO.StdOut, "%s Merge request !%d reopened\n", utils.GreenCheck(), mr.IID)
fmt.Fprintln(f.IO.StdOut, mrutils.DisplayMR(mr))

return nil
},
}
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ require (
github.com/yuin/goldmark v1.2.1 // indirect
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
golang.org/x/net v0.0.0-20200822124328-c89045814202 // indirect
golang.org/x/sync v0.0.0-20190423024810-112230192c58
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
)
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTm
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand Down

0 comments on commit 48d09df

Please sign in to comment.