From fa3d65b2b60da648d12d1070e14c26fdc272abe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Tue, 31 Mar 2020 18:36:41 +0200 Subject: [PATCH] Add "upstream" remote after `repo fork` --- command/repo.go | 45 ++++++++++++++++++++++++++++++++++---------- command/repo_test.go | 39 ++++++++++++++++++++------------------ 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/command/repo.go b/command/repo.go index 4b94812d5..afc6ddec7 100644 --- a/command/repo.go +++ b/command/repo.go @@ -129,14 +129,7 @@ func repoClone(cmd *cobra.Command, args []string) error { } if parentRepo != nil { - // TODO: support SSH remote URLs - upstreamURL := fmt.Sprintf("https://github.com/%s.git", ghrepo.FullName(parentRepo)) - cloneDir := path.Base(strings.TrimSuffix(cloneURL, ".git")) - - cloneCmd := git.GitCommand("-C", cloneDir, "remote", "add", "upstream", upstreamURL) - cloneCmd.Stdout = os.Stdout - cloneCmd.Stderr = os.Stderr - err := run.PrepareCmd(cloneCmd).Run() + err := addUpstreamRemote(parentRepo, cloneURL) if err != nil { return err } @@ -145,6 +138,17 @@ func repoClone(cmd *cobra.Command, args []string) error { return nil } +func addUpstreamRemote(parentRepo ghrepo.Interface, cloneURL string) error { + // TODO: support SSH remote URLs + upstreamURL := fmt.Sprintf("https://github.com/%s.git", ghrepo.FullName(parentRepo)) + cloneDir := path.Base(strings.TrimSuffix(cloneURL, ".git")) + + cloneCmd := git.GitCommand("-C", cloneDir, "remote", "add", "upstream", upstreamURL) + cloneCmd.Stdout = os.Stdout + cloneCmd.Stderr = os.Stderr + return run.PrepareCmd(cloneCmd).Run() +} + func repoCreate(cmd *cobra.Command, args []string) error { projectDir, projectDirErr := git.ToplevelDir() @@ -389,12 +393,28 @@ func repoFork(cmd *cobra.Command, args []string) error { } } if remoteDesired { - _, err := git.AddRemote("fork", forkedRepo.CloneURL) + remoteName := "origin" + + remotes, err := ctx.Remotes() + if err != nil { + return err + } + if _, err := remotes.FindByName(remoteName); err == nil { + renameTarget := "upstream" + renameCmd := git.GitCommand("remote", "rename", remoteName, renameTarget) + err = run.PrepareCmd(renameCmd).Run() + if err != nil { + return err + } + fmt.Fprintf(out, "%s Renamed %s remote to %s\n", greenCheck, utils.Bold(remoteName), utils.Bold(renameTarget)) + } + + _, err = git.AddRemote(remoteName, forkedRepo.CloneURL) if err != nil { return fmt.Errorf("failed to add remote: %w", err) } - fmt.Fprintf(out, "%s Remote added at %s\n", greenCheck, utils.Bold("fork")) + fmt.Fprintf(out, "%s Added remote %s\n", greenCheck, utils.Bold(remoteName)) } } else { cloneDesired := clonePref == "true" @@ -414,6 +434,11 @@ func repoFork(cmd *cobra.Command, args []string) error { return fmt.Errorf("failed to clone fork: %w", err) } + err = addUpstreamRemote(toFork, forkedRepo.CloneURL) + if err != nil { + return err + } + fmt.Fprintf(out, "%s Cloned fork\n", greenCheck) } } diff --git a/command/repo_test.go b/command/repo_test.go index 10820cd45..f0d271cf8 100644 --- a/command/repo_test.go +++ b/command/repo_test.go @@ -151,8 +151,8 @@ func TestRepoFork_in_parent_yes(t *testing.T) { } expectedCmds := []string{ - "git remote add -f fork https://github.com/someone/repo.git", - "git fetch fork", + "git remote rename origin upstream", + "git remote add -f origin https://github.com/someone/repo.git", } for x, cmd := range seenCmds { @@ -163,7 +163,7 @@ func TestRepoFork_in_parent_yes(t *testing.T) { test.ExpectLines(t, output.String(), "Created fork someone/REPO", - "Remote added at fork") + "Added remote origin") } func TestRepoFork_outside_yes(t *testing.T) { @@ -171,11 +171,11 @@ func TestRepoFork_outside_yes(t *testing.T) { http := initFakeHTTP() defer http.StubWithFixture(200, "forkResult.json")() - var seenCmd *exec.Cmd - defer run.SetPrepareCmd(func(cmd *exec.Cmd) run.Runnable { - seenCmd = cmd - return &test.OutputStub{} - })() + cs, restore := test.InitCmdStubber() + defer restore() + + cs.Stub("") // git clone + cs.Stub("") // git remote add output, err := RunCommand(repoForkCmd, "repo fork --clone OWNER/REPO") if err != nil { @@ -184,7 +184,8 @@ func TestRepoFork_outside_yes(t *testing.T) { eq(t, output.Stderr(), "") - eq(t, strings.Join(seenCmd.Args, " "), "git clone https://github.com/someone/repo.git") + eq(t, strings.Join(cs.Calls[0].Args, " "), "git clone https://github.com/someone/repo.git") + eq(t, strings.Join(cs.Calls[1].Args, " "), "git -C repo remote add upstream https://github.com/OWNER/REPO.git") test.ExpectLines(t, output.String(), "Created fork someone/REPO", @@ -196,11 +197,11 @@ func TestRepoFork_outside_survey_yes(t *testing.T) { http := initFakeHTTP() defer http.StubWithFixture(200, "forkResult.json")() - var seenCmd *exec.Cmd - defer run.SetPrepareCmd(func(cmd *exec.Cmd) run.Runnable { - seenCmd = cmd - return &test.OutputStub{} - })() + cs, restore := test.InitCmdStubber() + defer restore() + + cs.Stub("") // git clone + cs.Stub("") // git remote add oldConfirm := Confirm Confirm = func(_ string, result *bool) error { @@ -216,7 +217,8 @@ func TestRepoFork_outside_survey_yes(t *testing.T) { eq(t, output.Stderr(), "") - eq(t, strings.Join(seenCmd.Args, " "), "git clone https://github.com/someone/repo.git") + eq(t, strings.Join(cs.Calls[0].Args, " "), "git clone https://github.com/someone/repo.git") + eq(t, strings.Join(cs.Calls[1].Args, " "), "git -C repo remote add upstream https://github.com/OWNER/REPO.git") test.ExpectLines(t, output.String(), "Created fork someone/REPO", @@ -283,8 +285,8 @@ func TestRepoFork_in_parent_survey_yes(t *testing.T) { } expectedCmds := []string{ - "git remote add -f fork https://github.com/someone/repo.git", - "git fetch fork", + "git remote rename origin upstream", + "git remote add -f origin https://github.com/someone/repo.git", } for x, cmd := range seenCmds { @@ -295,7 +297,8 @@ func TestRepoFork_in_parent_survey_yes(t *testing.T) { test.ExpectLines(t, output.String(), "Created fork someone/REPO", - "Remote added at fork") + "Renamed origin remote to upstream", + "Added remote origin") } func TestRepoFork_in_parent_survey_no(t *testing.T) {