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  }