diff --git a/commands/remote.go b/commands/remote.go index 2fa480d55fd5ee6f45aa3469a57e7f90d2523146..e1130cad18885d3c2110845523096d97e15e5850 100644 --- a/commands/remote.go +++ b/commands/remote.go @@ -1,8 +1,10 @@ package commands import ( + "fmt" "github.com/jingweno/gh/github" "github.com/jingweno/gh/utils" + "regexp" ) var cmdRemote = &Command{ @@ -29,36 +31,51 @@ then uses your GitHub login. > git remote add origin git://github.com/YOUR_LOGIN/THIS_REPO.git */ func remote(command *Command, args *Args) { - if args.ParamsSize() >= 2 && (args.FirstParam() == "add" || args.FirstParam() == "set-url") { + if !args.IsParamsEmpty() && (args.FirstParam() == "add" || args.FirstParam() == "set-url") { transformRemoteArgs(args) } } func transformRemoteArgs(args *Args) { ownerWithName := args.LastParam() - owner, name, match := parseRepoNameOwner(ownerWithName) - if !match { + owner, name := parseRepoNameOwner(ownerWithName) + if owner == "" { return } - var err error + localRepo := github.LocalRepo() + var repoName string if name == "" { - name, err = utils.DirName() - utils.Check(err) + project, err := localRepo.MainProject() + if err == nil { + repoName = project.Name + } else { + repoName, err = utils.DirName() + utils.Check(err) + } + name = repoName } + words := args.Words() isPriavte := parseRemotePrivateFlag(args) - - if owner == "origin" { - owner = github.CurrentConfig().FetchUser() - } else if args.ParamsSize() > 2 { - // `git remote add jingweno foo/bar` + if len(words) == 2 && words[1] == "origin" { + // gh add origin + credentials := github.CurrentConfigs().DefaultCredentials() + owner = credentials.User + name = repoName + } else if len(words) == 2 { + // gh remote add jingweno foo/bar + if idx := args.IndexOfParam(words[1]); idx != -1 { + args.ReplaceParam(idx, owner) + } + } else { args.RemoveParam(args.ParamsSize() - 1) } project := github.NewProject(owner, name, "") + // for GitHub Enterprise + isPriavte = isPriavte || project.Host != github.GitHubHost url := project.GitURL(name, owner, isPriavte) - args.AppendParams(url) } @@ -70,3 +87,22 @@ func parseRemotePrivateFlag(args *Args) bool { return false } + +func parseRepoNameOwner(nameWithOwner string) (owner, name string) { + ownerRe := fmt.Sprintf("^(%s)$", OwnerRe) + ownerRegexp := regexp.MustCompile(ownerRe) + if ownerRegexp.MatchString(nameWithOwner) { + owner = ownerRegexp.FindStringSubmatch(nameWithOwner)[1] + return + } + + nameWithOwnerRe := fmt.Sprintf("^(%s)\\/(%s)$", OwnerRe, NameRe) + nameWithOwnerRegexp := regexp.MustCompile(nameWithOwnerRe) + if nameWithOwnerRegexp.MatchString(nameWithOwner) { + result := nameWithOwnerRegexp.FindStringSubmatch(nameWithOwner) + owner = result[1] + name = result[2] + } + + return +} diff --git a/commands/remote_test.go b/commands/remote_test.go index 23e1c7e21bbbc91782a928c4d6512b1186f02283..a1f22dce65adf810d587c3d6588f8d4b8e4ea46b 100644 --- a/commands/remote_test.go +++ b/commands/remote_test.go @@ -8,8 +8,20 @@ import ( "testing" ) +func TestParseRepoNameOwner(t *testing.T) { + owner, repo := parseRepoNameOwner("jingweno") + assert.Equal(t, "jingweno", owner) + assert.Equal(t, "", repo) + + owner, repo = parseRepoNameOwner("jingweno/gh") + assert.Equal(t, "jingweno", owner) + assert.Equal(t, "gh", repo) +} + func TestTransformRemoteArgs(t *testing.T) { os.Setenv("GH_PROTOCOL", "git") + github.CreateTestConfigs("jingweno", "123") + args := NewArgs([]string{"remote", "add", "jingweno"}) transformRemoteArgs(args) @@ -28,8 +40,6 @@ func TestTransformRemoteArgs(t *testing.T) { reg = regexp.MustCompile("^git@github.com:jingweno/.+\\.git$") assert.T(t, reg.MatchString(args.GetParam(2))) - github.CreateTestConfig("jingweno", "123") - args = NewArgs([]string{"remote", "add", "origin"}) transformRemoteArgs(args) diff --git a/commands/utils.go b/commands/utils.go index 0cd49304730bc4a7ac70fe99439a367edf724ba4..ce9c47ff3b6309e4628bb7c822880d100908bd06 100644 --- a/commands/utils.go +++ b/commands/utils.go @@ -1,12 +1,10 @@ package commands import ( - "fmt" "github.com/jingweno/gh/git" "github.com/jingweno/gh/utils" "github.com/jingweno/go-octokit/octokit" "os" - "regexp" "strings" ) @@ -37,27 +35,6 @@ func parseUserBranchFromPR(pullRequest *octokit.PullRequest) (user string, branc return } -func parseRepoNameOwner(nameWithOwner string) (owner, name string, match bool) { - ownerRe := fmt.Sprintf("^(%s)$", OwnerRe) - ownerRegexp := regexp.MustCompile(ownerRe) - if ownerRegexp.MatchString(nameWithOwner) { - owner = ownerRegexp.FindStringSubmatch(nameWithOwner)[1] - match = true - return - } - - nameWithOwnerRe := fmt.Sprintf("^(%s)\\/(%s)$", OwnerRe, NameRe) - nameWithOwnerRegexp := regexp.MustCompile(nameWithOwnerRe) - if nameWithOwnerRegexp.MatchString(nameWithOwner) { - result := nameWithOwnerRegexp.FindStringSubmatch(nameWithOwner) - owner = result[1] - name = result[2] - match = true - } - - return -} - func hasGitRemote(name string) bool { remotes, err := git.Remotes() utils.Check(err) diff --git a/commands/utils_test.go b/commands/utils_test.go deleted file mode 100644 index f79e0c1b9a10e13c23d7bb87ad62f82bdf0e8ddf..0000000000000000000000000000000000000000 --- a/commands/utils_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package commands - -import ( - "github.com/bmizerany/assert" - "testing" -) - -func TestParseRepoNameOwner(t *testing.T) { - owner, repo, match := parseRepoNameOwner("jingweno") - - assert.T(t, match) - assert.Equal(t, "jingweno", owner) - assert.Equal(t, "", repo) - - owner, repo, match = parseRepoNameOwner("jingweno/gh") - - assert.T(t, match) - assert.Equal(t, "jingweno", owner) - assert.Equal(t, "gh", repo) -} diff --git a/github/project.go b/github/project.go index ab72627fb752212ce34249afe2005f8ec1ee12d9..26d042d8873280c3946e64959783fc93042a3f6b 100644 --- a/github/project.go +++ b/github/project.go @@ -161,7 +161,7 @@ func NewProject(owner, name, host string) *Project { } if host == "" { - host = GitHubHost + host = defaultHost() } if owner == "" {