From 7b7c7f57bec27bd277d7feb064c8528b00c9905f Mon Sep 17 00:00:00 2001 From: Norwin Date: Wed, 22 Sep 2021 23:48:21 +0800 Subject: [PATCH] tea pr create: make local repo optional (#393) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is a partial fix to #378, making the command available outside of a local repo. new behaviour: - when run interactively without local repo context, the head repo prompt is not pre-populated - when run with flags without local repo context, it will complain unless `--head` is specified refactor: - pass TeaContext down to task.CreatePull Co-authored-by: Norwin Co-authored-by: 6543 <6543@obermui.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/393 Reviewed-by: Alexey 〒erentyev Reviewed-by: 6543 <6543@obermui.de> Co-authored-by: Norwin Co-committed-by: Norwin --- cmd/pulls/create.go | 7 ++----- modules/interact/pull_create.go | 33 ++++++++++++++------------------- modules/task/pull_create.go | 24 +++++++++++------------- 3 files changed, 27 insertions(+), 37 deletions(-) diff --git a/cmd/pulls/create.go b/cmd/pulls/create.go index 6ef3ec2..e1a1d11 100644 --- a/cmd/pulls/create.go +++ b/cmd/pulls/create.go @@ -35,11 +35,10 @@ var CmdPullsCreate = cli.Command{ func runPullsCreate(cmd *cli.Context) error { ctx := context.InitCommand(cmd) - ctx.Ensure(context.CtxRequirement{LocalRepo: true}) // no args -> interactive mode if ctx.NumFlags() == 0 { - return interact.CreatePull(ctx.Login, ctx.Owner, ctx.Repo) + return interact.CreatePull(ctx) } // else use args to create PR @@ -49,9 +48,7 @@ func runPullsCreate(cmd *cli.Context) error { } return task.CreatePull( - ctx.Login, - ctx.Owner, - ctx.Repo, + ctx, ctx.String("base"), ctx.String("head"), opts, diff --git a/modules/interact/pull_create.go b/modules/interact/pull_create.go index 5d8e594..f1a40fe 100644 --- a/modules/interact/pull_create.go +++ b/modules/interact/pull_create.go @@ -6,26 +6,23 @@ package interact import ( "code.gitea.io/sdk/gitea" - "code.gitea.io/tea/modules/config" - "code.gitea.io/tea/modules/git" + "code.gitea.io/tea/modules/context" "code.gitea.io/tea/modules/task" "github.com/AlecAivazis/survey/v2" ) // CreatePull interactively creates a PR -func CreatePull(login *config.Login, owner, repo string) error { +func CreatePull(ctx *context.TeaContext) (err error) { var base, head string // owner, repo - owner, repo, err := promptRepoSlug(owner, repo) - if err != nil { + if ctx.Owner, ctx.Repo, err = promptRepoSlug(ctx.Owner, ctx.Repo); err != nil { return err } // base - base, err = task.GetDefaultPRBase(login, owner, repo) - if err != nil { + if base, err = task.GetDefaultPRBase(ctx.Login, ctx.Owner, ctx.Repo); err != nil { return err } promptI := &survey.Input{Message: "Target branch:", Default: base} @@ -34,14 +31,14 @@ func CreatePull(login *config.Login, owner, repo string) error { } // head - localRepo, err := git.RepoForWorkdir() - if err != nil { - return err - } + var headOwner, headBranch string promptOpts := survey.WithValidator(survey.Required) - headOwner, headBranch, err := task.GetDefaultPRHead(localRepo) - if err == nil { - promptOpts = nil + + if ctx.LocalRepo != nil { + headOwner, headBranch, err = task.GetDefaultPRHead(ctx.LocalRepo) + if err == nil { + promptOpts = nil + } } promptI = &survey.Input{Message: "Source repo owner:", Default: headOwner} if err := survey.AskOne(promptI, &headOwner); err != nil { @@ -52,17 +49,15 @@ func CreatePull(login *config.Login, owner, repo string) error { return err } - head = task.GetHeadSpec(headOwner, headBranch, owner) + head = task.GetHeadSpec(headOwner, headBranch, ctx.Owner) opts := gitea.CreateIssueOption{Title: task.GetDefaultPRTitle(head)} - if err = promptIssueProperties(login, owner, repo, &opts); err != nil { + if err = promptIssueProperties(ctx.Login, ctx.Owner, ctx.Repo, &opts); err != nil { return err } return task.CreatePull( - login, - owner, - repo, + ctx, base, head, &opts) diff --git a/modules/task/pull_create.go b/modules/task/pull_create.go index 2b2d729..b7505b5 100644 --- a/modules/task/pull_create.go +++ b/modules/task/pull_create.go @@ -10,22 +10,17 @@ import ( "code.gitea.io/sdk/gitea" "code.gitea.io/tea/modules/config" + "code.gitea.io/tea/modules/context" local_git "code.gitea.io/tea/modules/git" "code.gitea.io/tea/modules/print" "code.gitea.io/tea/modules/utils" ) // CreatePull creates a PR in the given repo and prints the result -func CreatePull(login *config.Login, repoOwner, repoName, base, head string, opts *gitea.CreateIssueOption) error { - // open local git repo - localRepo, err := local_git.RepoForWorkdir() - if err != nil { - return fmt.Errorf("Could not open local repo: %s", err) - } - +func CreatePull(ctx *context.TeaContext, base, head string, opts *gitea.CreateIssueOption) (err error) { // default is default branch if len(base) == 0 { - base, err = GetDefaultPRBase(login, repoOwner, repoName) + base, err = GetDefaultPRBase(ctx.Login, ctx.Owner, ctx.Repo) if err != nil { return err } @@ -33,12 +28,15 @@ func CreatePull(login *config.Login, repoOwner, repoName, base, head string, opt // default is current one if len(head) == 0 { - headOwner, headBranch, err := GetDefaultPRHead(localRepo) + if ctx.LocalRepo == nil { + return fmt.Errorf("no local git repo detected, please specify head branch") + } + headOwner, headBranch, err := GetDefaultPRHead(ctx.LocalRepo) if err != nil { return err } - head = GetHeadSpec(headOwner, headBranch, repoOwner) + head = GetHeadSpec(headOwner, headBranch, ctx.Owner) } // head & base may not be the same @@ -52,10 +50,10 @@ func CreatePull(login *config.Login, repoOwner, repoName, base, head string, opt } // title is required if len(opts.Title) == 0 { - return fmt.Errorf("Title is required") + return fmt.Errorf("title is required") } - pr, _, err := login.Client().CreatePullRequest(repoOwner, repoName, gitea.CreatePullRequestOption{ + pr, _, err := ctx.Login.Client().CreatePullRequest(ctx.Owner, ctx.Repo, gitea.CreatePullRequestOption{ Head: head, Base: base, Title: opts.Title, @@ -67,7 +65,7 @@ func CreatePull(login *config.Login, repoOwner, repoName, base, head string, opt }) if err != nil { - return fmt.Errorf("Could not create PR from %s to %s:%s: %s", head, repoOwner, base, err) + return fmt.Errorf("could not create PR from %s to %s:%s: %s", head, ctx.Owner, base, err) } print.PullDetails(pr, nil, nil)