github.com/pengwynn/gh@v1.0.1-0.20140118055701-14327ca3942e/commands/fork.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/jingweno/gh/github"
     6  	"github.com/jingweno/gh/utils"
     7  	"os"
     8  	"reflect"
     9  )
    10  
    11  var cmdFork = &Command{
    12  	Run:   fork,
    13  	Usage: "fork [--no-remote]",
    14  	Short: "Make a fork of a remote repository on GitHub and add as remote",
    15  	Long: `Forks the original project (referenced by "origin" remote) on GitHub and
    16  adds a new remote for it under your username.
    17  `,
    18  }
    19  
    20  var flagForkNoRemote bool
    21  
    22  func init() {
    23  	cmdFork.Flag.BoolVar(&flagForkNoRemote, "no-remote", false, "")
    24  
    25  	CmdRunner.Use(cmdFork)
    26  }
    27  
    28  /*
    29    $ gh fork
    30    [ repo forked on GitHub ]
    31    > git remote add -f YOUR_USER git@github.com:YOUR_USER/CURRENT_REPO.git
    32  
    33    $ gh fork --no-remote
    34    [ repo forked on GitHub ]
    35  */
    36  func fork(cmd *Command, args *Args) {
    37  	localRepo := github.LocalRepo()
    38  
    39  	project, err := localRepo.MainProject()
    40  	utils.Check(err)
    41  
    42  	configs := github.CurrentConfigs()
    43  	credentials := configs.PromptFor(project.Host)
    44  	forkProject := github.NewProject(credentials.User, project.Name, project.Host)
    45  
    46  	client := github.NewClient(project.Host)
    47  	existingRepo, err := client.Repository(forkProject)
    48  	if err == nil {
    49  		var parentURL *github.URL
    50  		if parent := existingRepo.Parent; parent != nil {
    51  			parentURL, _ = github.ParseURL(parent.HTMLURL)
    52  		}
    53  		if parentURL == nil || !reflect.DeepEqual(parentURL.Project, project) {
    54  			err = fmt.Errorf("Error creating fork: %s already exists on %s",
    55  				forkProject, forkProject.Host)
    56  			utils.Check(err)
    57  		}
    58  	} else {
    59  		if !args.Noop {
    60  			_, err := client.ForkRepository(project)
    61  			utils.Check(err)
    62  		}
    63  	}
    64  
    65  	if flagForkNoRemote {
    66  		os.Exit(0)
    67  	} else {
    68  		u := forkProject.GitURL("", "", true)
    69  		args.Replace("git", "remote", "add", "-f", forkProject.Owner, u)
    70  		args.After("echo", fmt.Sprintf("new remote: %s", forkProject.Owner))
    71  	}
    72  }