diff --git a/command/repo.go b/command/repo.go index ad208a277..f459c2310 100644 --- a/command/repo.go +++ b/command/repo.go @@ -56,6 +56,9 @@ var repoCloneCmd = &cobra.Command{ Short: "Clone a repository locally", Long: `Clone a GitHub repository locally. +If the "OWNER/" portion of the "OWNER/REPO" repository argument is omitted, it +defaults to the name of the authenticating user. + To pass 'git clone' flags, separate them with '--'.`, RunE: repoClone, } @@ -125,8 +128,21 @@ func runClone(cloneURL string, args []string) (target string, err error) { } func repoClone(cmd *cobra.Command, args []string) error { + ctx := contextForCommand(cmd) + apiClient, err := apiClientForContext(ctx) + if err != nil { + return err + } + cloneURL := args[0] if !strings.Contains(cloneURL, ":") { + if !strings.Contains(cloneURL, "/") { + currentUser, err := api.CurrentLoginName(apiClient) + if err != nil { + return err + } + cloneURL = currentUser + "/" + cloneURL + } cloneURL = formatRemoteURL(cmd, cloneURL) } @@ -140,12 +156,6 @@ func repoClone(cmd *cobra.Command, args []string) error { } if repo != nil { - ctx := contextForCommand(cmd) - apiClient, err := apiClientForContext(ctx) - if err != nil { - return err - } - parentRepo, err = api.RepoParent(apiClient, repo) if err != nil { return err diff --git a/command/repo_test.go b/command/repo_test.go index 760298231..ff882d12e 100644 --- a/command/repo_test.go +++ b/command/repo_test.go @@ -15,6 +15,7 @@ import ( "github.com/cli/cli/context" "github.com/cli/cli/internal/run" + "github.com/cli/cli/pkg/httpmock" "github.com/cli/cli/test" "github.com/cli/cli/utils" ) @@ -508,6 +509,37 @@ func TestRepoClone_hasParent(t *testing.T) { eq(t, strings.Join(cs.Calls[1].Args, " "), "git -C REPO remote add -f upstream https://github.com/hubot/ORIG.git") } +func TestRepo_withoutUsername(t *testing.T) { + http := initFakeHTTP() + http.Register( + httpmock.GraphQL(`\bviewer\b`), + httpmock.StringResponse(` + { "data": { "viewer": { + "login": "OWNER" + }}}`)) + http.Register( + httpmock.GraphQL(`\brepository\(`), + httpmock.StringResponse(` + { "data": { "repository": { + "parent": null + } } }`)) + + cs, restore := test.InitCmdStubber() + defer restore() + + cs.Stub("") // git clone + + output, err := RunCommand("repo clone REPO") + if err != nil { + t.Fatalf("error running command `repo clone`: %v", err) + } + + eq(t, output.String(), "") + eq(t, output.Stderr(), "") + eq(t, cs.Count, 1) + eq(t, strings.Join(cs.Calls[0].Args, " "), "git clone https://github.com/OWNER/REPO.git") +} + func TestRepoCreate(t *testing.T) { ctx := context.NewBlank() ctx.SetBranch("master")