github.com/ianfoo/lab@v0.9.5-0.20180123060006-5ed79f2ccfc7/cmd/mrCheckout.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/spf13/cobra"
     8  	"github.com/xanzy/go-gitlab"
     9  	"github.com/zaquestion/lab/internal/git"
    10  	lab "github.com/zaquestion/lab/internal/gitlab"
    11  )
    12  
    13  var (
    14  	branch string
    15  )
    16  
    17  // listCmd represents the list command
    18  var checkoutCmd = &cobra.Command{
    19  	Use:   "checkout",
    20  	Short: "Checkout an open merge request",
    21  	Long:  ``,
    22  	Args:  cobra.ExactArgs(1),
    23  	Run: func(cmd *cobra.Command, args []string) {
    24  		rn, mrID, err := parseArgs(args)
    25  		if err != nil {
    26  			log.Fatal(err)
    27  		}
    28  
    29  		mrs, err := lab.MRList(rn, &gitlab.ListProjectMergeRequestsOptions{
    30  			IIDs: []int{int(mrID)},
    31  		})
    32  		if err != nil {
    33  			log.Fatal(err)
    34  		}
    35  		if len(mrs) < 1 {
    36  			fmt.Printf("MR #%d not found\n", mrID)
    37  			return
    38  		}
    39  		// https://docs.gitlab.com/ee/user/project/merge_requests/#checkout-merge-requests-locally
    40  		if branch == "" {
    41  			branch = mrs[0].SourceBranch
    42  		}
    43  		mr := fmt.Sprintf("refs/merge-requests/%d/head", mrID)
    44  		gitf := git.New("fetch", forkedFromRemote, fmt.Sprintf("%s:%s", mr, branch))
    45  		err = gitf.Run()
    46  		if err != nil {
    47  			log.Fatal(err)
    48  		}
    49  
    50  		gitc := git.New("checkout", branch)
    51  		err = gitc.Run()
    52  		if err != nil {
    53  			log.Fatal(err)
    54  		}
    55  	},
    56  }
    57  
    58  func init() {
    59  	checkoutCmd.Flags().StringVarP(&branch, "branch", "b", "", "checkout merge request with <branch> name")
    60  	mrCmd.AddCommand(checkoutCmd)
    61  }