Error when issue-repo doesn't match issue url

This commit is contained in:
Chris Westra 2022-09-14 11:57:51 -04:00
parent 0f1924ba7e
commit 48512176d8
3 changed files with 62 additions and 23 deletions

View file

@ -60,7 +60,7 @@ func NewCmdDevelop(f *cmdutil.Factory, runF func(*DevelopOptions) error) *cobra.
if opts.List {
return developRunList(opts)
}
return developRun(opts)
return developRunCreate(opts)
},
}
fl := cmd.Flags()
@ -72,7 +72,7 @@ func NewCmdDevelop(f *cmdutil.Factory, runF func(*DevelopOptions) error) *cobra.
return cmd
}
func developRun(opts *DevelopOptions) (err error) {
func developRunCreate(opts *DevelopOptions) (err error) {
httpClient, err := opts.HttpClient()
if err != nil {
return err
@ -82,13 +82,14 @@ func developRun(opts *DevelopOptions) (err error) {
if err != nil {
return err
}
opts.IO.StartProgressIndicator()
repo, err := api.GitHubRepo(apiClient, baseRepo)
issueNumber, issueRepo, err := issueMetadata(opts.IssueSelector, opts.IssueRepoSelector, baseRepo)
if err != nil {
return err
}
issueNumber, issueRepo, err := issueMetadata(opts.IssueSelector, opts.IssueRepoSelector, baseRepo)
opts.IO.StartProgressIndicator()
repo, err := api.GitHubRepo(apiClient, baseRepo)
if err != nil {
return err
}
@ -132,23 +133,47 @@ func developRun(opts *DevelopOptions) (err error) {
return
}
func issueMetadata(issueSelector string, issueRepoSelector string, baseRepo ghrepo.Interface) (issueNumber int, issueRepo ghrepo.Interface, err error) {
// If the issue is in the base repo, we can use the issue number directly. Otherwise, we need to use the issue's url or the IssueRepoSelector argument.
// If the repo from the URL doesn't match the IssueRepoSelector argument, we error.
func issueMetadata(issueSelector string, issueRepoSelector string, baseRepo ghrepo.Interface) (issueNumber int, issueFlagRepo ghrepo.Interface, err error) {
var targetRepo ghrepo.Interface
if issueRepoSelector != "" {
issueRepo, err = ghrepo.FromFullNameWithHost(issueRepoSelector, baseRepo.RepoHost())
issueFlagRepo, err = ghrepo.FromFullNameWithHost(issueRepoSelector, baseRepo.RepoHost())
if err != nil {
return 0, nil, err
}
}
targetRepo := baseRepo
if issueRepo != nil {
targetRepo = issueRepo
if issueFlagRepo != nil {
targetRepo = issueFlagRepo
}
issueNumber, issueRepo, err = shared.IssueNumberAndRepoFromArg(issueSelector, targetRepo)
issueNumber, issueArgRepo, err := shared.IssueNumberAndRepoFromArg(issueSelector)
if err != nil {
return 0, nil, err
}
return issueNumber, issueRepo, nil
if issueArgRepo != nil {
targetRepo = issueArgRepo
if issueFlagRepo != nil {
differentOwner := (issueFlagRepo.RepoOwner() != issueArgRepo.RepoOwner())
differentName := (issueFlagRepo.RepoName() != issueArgRepo.RepoName())
if differentOwner || differentName {
return 0, nil, fmt.Errorf("issue repo in url %s/%s does not match the repo from --issue-repo %s/%s", issueArgRepo.RepoOwner(), issueArgRepo.RepoName(), issueFlagRepo.RepoOwner(), issueFlagRepo.RepoName())
}
}
}
if issueFlagRepo == nil && issueArgRepo == nil {
targetRepo = baseRepo
}
if targetRepo == nil {
return 0, nil, fmt.Errorf("could not determine issue repo")
}
return issueNumber, targetRepo, nil
}
func developRunList(opts *DevelopOptions) (err error) {

View file

@ -162,7 +162,7 @@ func Test_developRun(t *testing.T) {
},
expectedOut: "foo\nbar\n",
},
{name: "list branches for an issue providing an issue url and specifying its repo returns an error",
{name: "list branches for an issue providing an issue url and specifying the same repo works",
setup: func(opts *DevelopOptions, t *testing.T) func() {
opts.IssueSelector = "https://github.com/cli/test-repo/issues/42"
opts.IssueRepoSelector = "cli/test-repo"
@ -204,7 +204,16 @@ func Test_developRun(t *testing.T) {
assert.Equal(t, "test-repo", inputs["repositoryName"])
}))
},
expectedErrOut: "error: --issue-repo cannot be used when providing an issue URL\n",
expectedOut: "foo\nbar\n",
},
{name: "list branches for an issue providing an issue url and specifying a different repo returns an error",
setup: func(opts *DevelopOptions, t *testing.T) func() {
opts.IssueSelector = "https://github.com/cli/test-repo/issues/42"
opts.IssueRepoSelector = "cli/other"
opts.List = true
return func() {}
},
wantErr: "issue repo in url cli/test-repo does not match the repo from --issue-repo cli/other",
},
{name: "develop new branch",
setup: func(opts *DevelopOptions, t *testing.T) func() {
@ -243,6 +252,14 @@ func Test_developRun(t *testing.T) {
},
expectedOut: "github.com/OWNER/REPO/tree/my-branch\n",
},
{name: "develop providing an issue url and specifying a different repo returns an error",
setup: func(opts *DevelopOptions, t *testing.T) func() {
opts.IssueSelector = "https://github.com/cli/test-repo/issues/42"
opts.IssueRepoSelector = "cli/other"
return func() {}
},
wantErr: "issue repo in url cli/test-repo does not match the repo from --issue-repo cli/other",
},
{name: "develop new branch with checkout when the branch exists locally",
setup: func(opts *DevelopOptions, t *testing.T) func() {
opts.Name = "my-branch"
@ -288,7 +305,8 @@ func Test_developRun(t *testing.T) {
cs.Register(`git pull --ff-only origin my-branch`, 0, "")
},
expectedOut: "github.com/OWNER/REPO/tree/my-branch\n",
}, {name: "develop new branch with checkout when the branch does not exist locally",
},
{name: "develop new branch with checkout when the branch does not exist locally",
setup: func(opts *DevelopOptions, t *testing.T) func() {
opts.Name = "my-branch"
opts.BaseBranch = "main"
@ -398,7 +416,7 @@ func Test_developRun(t *testing.T) {
err = developRunList(&opts)
} else {
err = developRun(&opts)
err = developRunCreate(&opts)
}
output := &test.CmdOut{
OutBuf: stdout,

View file

@ -60,9 +60,9 @@ func issueMetadataFromURL(s string) (int, ghrepo.Interface) {
return issueNumber, repo
}
//TODO: Returns the issue number and base repo if the issue URL is provided, falling back to the
// supplied repo if the base repo is not specified in the URL.
func IssueNumberAndRepoFromArg(arg string, fallbackRepo ghrepo.Interface) (int, ghrepo.Interface, error) {
// Returns the issue number and repo if the issue URL is provided.
// If only the issue number is provided, returns the number and nil repo.
func IssueNumberAndRepoFromArg(arg string) (int, ghrepo.Interface, error) {
issueNumber, baseRepo := issueMetadataFromURL(arg)
if issueNumber == 0 {
@ -73,10 +73,6 @@ func IssueNumberAndRepoFromArg(arg string, fallbackRepo ghrepo.Interface) (int,
}
}
if baseRepo == nil {
baseRepo = fallbackRepo
}
return issueNumber, baseRepo, nil
}