1
0
Fork 0
mirror of https://gitea.com/jolheiser/sip synced 2024-06-10 17:06:05 +02:00
sip/cmd/pulls_checkout.go
jolheiser 67326a7948
Start work on flags
Signed-off-by: jolheiser <john.olheiser@gmail.com>
2020-09-18 14:28:02 -05:00

94 lines
2.1 KiB
Go

package cmd
import (
"errors"
"fmt"
"gitea.com/jolheiser/sip/prompt"
"os"
"os/exec"
"strconv"
"gitea.com/jolheiser/sip/config"
"gitea.com/jolheiser/sip/flag"
"code.gitea.io/sdk/gitea"
"github.com/AlecAivazis/survey/v2"
"github.com/huandu/xstrings"
"github.com/urfave/cli/v2"
"go.jolheiser.com/beaver"
)
var indexFlag = &cli.Int64Flag{
Name: "index",
Usage: "PR Index",
Value: -1,
}
var PullsCheckout = cli.Command{
Name: "checkout",
Usage: "Checkout a pull request for testing",
Action: doPullCheckout,
Flags: []cli.Flag{
indexFlag,
confirmFlag,
},
}
func doPullCheckout(ctx *cli.Context) error {
client, err := getClient(true)
if err != nil {
return err
}
var issue *gitea.Issue
prIndex, err := prompt.Custom(ctx, "index",
&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!"},
validatePRNum,
)
if prIndex.(int64) < 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 := client.GetIssue(flag.Upstream.Owner, flag.Upstream.Repo, prIndex.(int64))
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
}