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  }