1
0
mirror of https://gitea.com/jolheiser/sip synced 2024-11-22 19:51:58 +01:00
sip/cmd/pulls_checkout.go
jolheiser 8958c4a312
Split up funcs, add PR create/status/checkout
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2020-02-16 23:28:11 -06:00

84 lines
1.9 KiB
Go

package cmd
import (
"code.gitea.io/sdk/gitea"
"errors"
"fmt"
"gitea.com/jolheiser/beaver"
"gitea.com/jolheiser/tea/modules/config"
"github.com/AlecAivazis/survey/v2"
"github.com/huandu/xstrings"
"github.com/urfave/cli/v2"
"os"
"os/exec"
"strconv"
)
var PullsCheckout = cli.Command{
Name: "checkout",
Usage: "Checkout a pull request for testing",
Action: doPullCheckout,
}
func doPullCheckout(ctx *cli.Context) error {
var issue *gitea.Issue
questions := []*survey.Question{
{
Name: "index",
Prompt: &survey.Input{Message: "Pull request number", Help: "Don't worry if you aren't sure! Just say -1 and we'll search for it instead!"},
Validate: validatePRNum,
},
}
prNum := struct {
Index int64
}{}
if err := survey.Ask(questions, &prNum); err != nil {
return err
}
if prNum.Index < 0 {
var confirmed bool
for !confirmed {
iss, err := issuesSearch(ctx, true)
if err != nil {
return err
}
issue = iss
confirmation := &survey.Confirm{Message: "Is this the pull request you want to checkout?"}
if err := survey.AskOne(confirmation, &confirmed); err != nil {
return err
}
}
} else {
iss, err := getClient(ctx).GetIssue(upstreamRepo[1], upstreamRepo[2], prNum.Index)
if err != nil {
return err
}
issue = iss
}
if issue == nil {
return errors.New("no pull request selected")
}
branch := fmt.Sprintf("pr%d-%s", issue.Index, xstrings.ToKebabCase(issue.Title))
cmd := exec.Command("git", "fetch", config.Upstream, fmt.Sprintf("pull/%d/head:%s", issue.Index, branch))
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
return err
}
beaver.Infof("Pull request successfully checked out. Switch to it using `git checkout %s`", branch)
return nil
}
func validatePRNum(ans interface{}) error {
if err := survey.Required(ans); err != nil {
return err
}
if _, err := strconv.Atoi(ans.(string)); err != nil {
return errors.New("pull request number must be an number")
}
return nil
}