github.com/matthewdale/lab@v0.14.0/cmd/fork.go (about) 1 package cmd 2 3 import ( 4 "log" 5 "strings" 6 7 "github.com/spf13/cobra" 8 "github.com/tcnksm/go-gitconfig" 9 "github.com/zaquestion/lab/internal/git" 10 lab "github.com/zaquestion/lab/internal/gitlab" 11 ) 12 13 // forkCmd represents the fork command 14 var forkCmd = &cobra.Command{ 15 Use: "fork [upstream-to-fork]", 16 Short: "Fork a remote repository on GitLab and add as remote", 17 Long: ``, 18 Args: cobra.MaximumNArgs(1), 19 Run: func(cmd *cobra.Command, args []string) { 20 if len(args) == 1 { 21 forkToUpstream(cmd, args) 22 return 23 } 24 forkFromOrigin(cmd, args) 25 }, 26 } 27 28 func forkFromOrigin(cmd *cobra.Command, args []string) { 29 if _, err := gitconfig.Local("remote." + lab.User() + ".url"); err == nil { 30 log.Fatalf("remote: %s already exists", lab.User()) 31 } 32 if _, err := gitconfig.Local("remote.upstream.url"); err == nil { 33 log.Fatal("remote: upstream already exists") 34 } 35 36 remoteURL, err := gitconfig.Local("remote.origin.url") 37 if err != nil { 38 log.Fatal(err) 39 } 40 if git.IsHub && strings.Contains(remoteURL, "github.com") { 41 git := git.New("fork") 42 git.Run() 43 if err != nil { 44 log.Fatal(err) 45 } 46 return 47 } 48 49 project, err := git.PathWithNameSpace("origin") 50 if err != nil { 51 log.Fatal(err) 52 } 53 forkRemoteURL, err := lab.Fork(project) 54 if err != nil { 55 log.Fatal(err) 56 } 57 58 name := determineForkRemote(project) 59 err = git.RemoteAdd(name, forkRemoteURL, ".") 60 if err != nil { 61 log.Fatal(err) 62 } 63 } 64 func forkToUpstream(cmd *cobra.Command, args []string) { 65 _, err := lab.Fork(args[0]) 66 if err != nil { 67 log.Fatal(err) 68 } 69 cloneCmd.Run(nil, []string{strings.Split(args[0], "/")[1]}) 70 } 71 func determineForkRemote(project string) string { 72 name := lab.User() 73 if strings.Split(project, "/")[0] == lab.User() { 74 // #78 allow upstream remote to be added when "origin" is 75 // referring to the user fork (and the fork already exists) 76 name = "upstream" 77 } 78 return name 79 } 80 81 func init() { 82 RootCmd.AddCommand(forkCmd) 83 }