github.com/ianfoo/lab@v0.9.5-0.20180123060006-5ed79f2ccfc7/cmd/clone.go (about) 1 package cmd 2 3 import ( 4 "log" 5 "strings" 6 7 "github.com/spf13/cobra" 8 "github.com/zaquestion/lab/internal/git" 9 "github.com/zaquestion/lab/internal/gitlab" 10 ) 11 12 // cloneCmd represents the clone command 13 // NOTE: There is special handling for "clone" in cmd/root.go 14 var cloneCmd = &cobra.Command{ 15 Use: "clone", 16 Short: "", 17 Long: `Clone supports these shorthands 18 - repo 19 - namespace/repo`, 20 Run: func(cmd *cobra.Command, args []string) { 21 project, err := gitlab.FindProject(args[0]) 22 if err == gitlab.ErrProjectNotFound { 23 err = git.New(append([]string{"clone"}, args...)...).Run() 24 if err != nil { 25 log.Fatal(err) 26 } 27 return 28 } else if err != nil { 29 log.Fatal(err) 30 } 31 path := project.SSHURLToRepo 32 err = git.New(append([]string{"clone", path}, args[1:]...)...).Run() 33 if err != nil { 34 log.Fatal(err) 35 } 36 37 // Clone project was a fork belonging to the user so user is 38 // treating forks as origin. Add upstream as remoted pointing 39 // to forked from repo 40 if project.ForkedFromProject != nil && 41 strings.Contains(project.PathWithNamespace, gitlab.User()) { 42 var dir string 43 if len(args) > 1 { 44 dir = args[1] 45 } else { 46 dir = project.Name 47 } 48 ffProject, err := gitlab.FindProject(project.ForkedFromProject.PathWithNamespace) 49 if err != nil { 50 log.Fatal(err) 51 } 52 err = git.RemoteAdd("upstream", ffProject.SSHURLToRepo, "./"+dir) 53 if err != nil { 54 log.Fatal(err) 55 } 56 } 57 }, 58 } 59 60 func init() { 61 RootCmd.AddCommand(cloneCmd) 62 }