Improve `hub create` dealing with an existing "origin" remote

- No longer says "updating git remote", but not actually doing anything
- Shows a helpful warning about "origin" pointing to a possibly unrelated repo
This commit is contained in:
Mislav Marohnić 2018-12-28 00:28:22 +01:00
Родитель cc38879bd6
Коммит 9ac583cacf
4 изменённых файлов: 17 добавлений и 24 удалений

Просмотреть файл

@ -117,7 +117,7 @@ func create(command *Command, args *Args) {
err = fmt.Errorf("Repository '%s' already exists and is public", repo.FullName) err = fmt.Errorf("Repository '%s' already exists and is public", repo.FullName)
utils.Check(err) utils.Check(err)
} else { } else {
ui.Errorln("Existing repository detected. Updating git remote") ui.Errorln("Existing repository detected")
project = foundProject project = foundProject
} }
} else { } else {
@ -138,10 +138,15 @@ func create(command *Command, args *Args) {
localRepo, err := github.LocalRepo() localRepo, err := github.LocalRepo()
utils.Check(err) utils.Check(err)
remote, _ := localRepo.OriginRemote() originName := "origin"
if remote == nil || remote.Name != "origin" { if originRemote, err := localRepo.RemoteByName(originName); err == nil {
originProject, err := originRemote.Project()
if err != nil || !originProject.SameAs(project) {
ui.Errorf(`A git remote named "%s" already exists and is set to push to '%s'.\n`, originRemote.Name, originRemote.PushURL)
}
} else {
url := project.GitURL("", "", true) url := project.GitURL("", "", true)
args.Before("git", "remote", "add", "-f", "origin", url) args.Before("git", "remote", "add", "-f", originName, url)
} }
webUrl := project.WebURL("", "", "") webUrl := project.WebURL("", "", "")

Просмотреть файл

@ -111,6 +111,7 @@ Feature: hub create
And the "origin" remote has url "git://github.com/mislav/dotfiles.git" And the "origin" remote has url "git://github.com/mislav/dotfiles.git"
When I successfully run `hub create` When I successfully run `hub create`
Then the url for "origin" should be "git://github.com/mislav/dotfiles.git" Then the url for "origin" should be "git://github.com/mislav/dotfiles.git"
And the output should contain exactly "https://github.com/mislav/dotfiles\n"
Scenario: Unrelated origin remote already exists Scenario: Unrelated origin remote already exists
Given the GitHub API server: Given the GitHub API server:
@ -122,8 +123,12 @@ Feature: hub create
""" """
And the "origin" remote has url "git://example.com/unrelated.git" And the "origin" remote has url "git://example.com/unrelated.git"
When I successfully run `hub create` When I successfully run `hub create`
Then the output should contain exactly "https://github.com/mislav/dotfiles\n" Then the url for "origin" should be "git://example.com/unrelated.git"
And the url for "origin" should be "git://example.com/unrelated.git" And the stdout should contain exactly "https://github.com/mislav/dotfiles\n"
And the stderr should contain exactly:
"""
A git remote named "origin" already exists and is set to push to 'git://example.com/unrelated.git'.\n
"""
Scenario: Another remote already exists Scenario: Another remote already exists
Given the GitHub API server: Given the GitHub API server:
@ -145,7 +150,7 @@ Feature: hub create
} }
""" """
When I successfully run `hub create` When I successfully run `hub create`
Then the output should contain "Existing repository detected. Updating git remote\n" Then the output should contain "Existing repository detected\n"
And the url for "origin" should be "git@github.com:mislav/dotfiles.git" And the url for "origin" should be "git@github.com:mislav/dotfiles.git"
Scenario: GitHub repo already exists and is not private Scenario: GitHub repo already exists and is not private

Просмотреть файл

@ -170,10 +170,6 @@ func (r *GitHubRepo) RemoteForRepo(repo *Repository) (*Remote, error) {
return nil, fmt.Errorf("could not find git remote for %s/%s", repo.Owner.Login, repo.Name) return nil, fmt.Errorf("could not find git remote for %s/%s", repo.Owner.Login, repo.Name)
} }
func (r *GitHubRepo) OriginRemote() (remote *Remote, err error) {
return r.RemoteByName("origin")
}
func (r *GitHubRepo) MainRemote() (remote *Remote, err error) { func (r *GitHubRepo) MainRemote() (remote *Remote, err error) {
r.loadRemotes() r.loadRemotes()

Просмотреть файл

@ -5,21 +5,8 @@ import (
"testing" "testing"
"github.com/bmizerany/assert" "github.com/bmizerany/assert"
"github.com/github/hub/fixtures"
) )
func TestGitHubRepo_OriginRemote(t *testing.T) {
repo := fixtures.SetupTestRepo()
defer repo.TearDown()
localRepo, _ := LocalRepo()
gitRemote, _ := localRepo.OriginRemote()
assert.Equal(t, "origin", gitRemote.Name)
u, _ := url.Parse(repo.Remote)
assert.Equal(t, u, gitRemote.URL)
}
func TestGitHubRepo_remotesForPublish(t *testing.T) { func TestGitHubRepo_remotesForPublish(t *testing.T) {
url, _ := url.Parse("ssh://git@github.com/Owner/repo.git") url, _ := url.Parse("ssh://git@github.com/Owner/repo.git")
remotes := []Remote{ remotes := []Remote{