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