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