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 }