mirror of
https://gitea.com/jolheiser/sip
synced 2024-11-26 07:33:48 +01:00
Add pulls and emoji
Signed-off-by: jolheiser <john.olheiser@gmail.com>
This commit is contained in:
parent
5b7b970a06
commit
2f74fb4ae0
@ -25,27 +25,7 @@ func doSearchIssues(ctx *cli.Context) error {
|
|||||||
auth := getAuth(ctx.String("login"))
|
auth := getAuth(ctx.String("login"))
|
||||||
client := getClient(ctx.String("url"))
|
client := getClient(ctx.String("url"))
|
||||||
|
|
||||||
questions := []*survey.Question{
|
issues, err := queryIssues(auth, client, false)
|
||||||
{
|
|
||||||
Name: "repo",
|
|
||||||
Prompt: &survey.Input{Message: "Full repository name", Default: fullName()},
|
|
||||||
Validate: validateFullName,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "query",
|
|
||||||
Prompt: &survey.Input{Message: "Search query"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
answers := struct {
|
|
||||||
Repo string
|
|
||||||
Query string
|
|
||||||
}{}
|
|
||||||
|
|
||||||
if err := survey.Ask(questions, &answers); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
ownerRepo := strings.Split(answers.Repo, "/")
|
|
||||||
issues, err := getAllIssues(auth, client, ownerRepo[0], ownerRepo[1], &gitea.IssueListIssuesOpts{Q: optional.NewString(answers.Query)})
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -89,6 +69,39 @@ func doSearchIssues(ctx *cli.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func queryIssues(auth context.Context, client *gitea.APIClient, pulls bool) ([]gitea.Issue, error) {
|
||||||
|
questions := []*survey.Question{
|
||||||
|
{
|
||||||
|
Name: "repo",
|
||||||
|
Prompt: &survey.Input{Message: "Full repository name", Default: fullName()},
|
||||||
|
Validate: validateFullName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "query",
|
||||||
|
Prompt: &survey.Input{Message: "Search query"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
answers := struct {
|
||||||
|
Repo string
|
||||||
|
Query string
|
||||||
|
}{}
|
||||||
|
|
||||||
|
if err := survey.Ask(questions, &answers); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ownerRepo := strings.Split(answers.Repo, "/")
|
||||||
|
opts := &gitea.IssueListIssuesOpts{Q: optional.NewString(answers.Query), Type_: optional.NewString("issues")}
|
||||||
|
if pulls {
|
||||||
|
opts.Type_ = optional.NewString("pulls")
|
||||||
|
}
|
||||||
|
issues, err := getAllIssues(auth, client, ownerRepo[0], ownerRepo[1], opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return issues, nil
|
||||||
|
}
|
||||||
|
|
||||||
func getAllIssues(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.IssueListIssuesOpts) ([]gitea.Issue, error) {
|
func getAllIssues(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.IssueListIssuesOpts) ([]gitea.Issue, error) {
|
||||||
opts.State = optional.NewString("open")
|
opts.State = optional.NewString("open")
|
||||||
issuesOpen, err := getIssues(auth, client, owner, repo, opts)
|
issuesOpen, err := getIssues(auth, client, owner, repo, opts)
|
||||||
@ -107,7 +120,6 @@ func getAllIssues(auth context.Context, client *gitea.APIClient, owner, repo str
|
|||||||
|
|
||||||
func getIssues(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.IssueListIssuesOpts) ([]gitea.Issue, error) {
|
func getIssues(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.IssueListIssuesOpts) ([]gitea.Issue, error) {
|
||||||
issues := make([]gitea.Issue, 0)
|
issues := make([]gitea.Issue, 0)
|
||||||
opts.Type_ = optional.NewString("issues")
|
|
||||||
var p int32 = 1
|
var p int32 = 1
|
||||||
for {
|
for {
|
||||||
opts.Page = optional.NewInt32(p)
|
opts.Page = optional.NewInt32(p)
|
||||||
|
79
cmd/pulls.go
79
cmd/pulls.go
@ -2,10 +2,89 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"gitea.com/jolheiser/beaver/color"
|
||||||
"gitea.com/jolheiser/gitea-sdk"
|
"gitea.com/jolheiser/gitea-sdk"
|
||||||
|
"gitea.com/jolheiser/tea/modules/markdown"
|
||||||
|
"gitea.com/jolheiser/tea/modules/stdout"
|
||||||
|
"github.com/AlecAivazis/survey/v2"
|
||||||
"github.com/antihax/optional"
|
"github.com/antihax/optional"
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var Pulls = cli.Command{
|
||||||
|
Name: "pulls",
|
||||||
|
Aliases: []string{"pr"},
|
||||||
|
Usage: "Commands for interacting with pull requests",
|
||||||
|
Action: doSearchPulls,
|
||||||
|
}
|
||||||
|
|
||||||
|
func doSearchPulls(ctx *cli.Context) error {
|
||||||
|
auth := getAuth(ctx.String("login"))
|
||||||
|
client := getClient(ctx.String("url"))
|
||||||
|
|
||||||
|
issues, err := queryIssues(auth, client, true)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(issues) == 0 {
|
||||||
|
stdout.Red("No pulls found")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
issueMap := make(map[string]gitea.Issue)
|
||||||
|
for _, issue := range issues {
|
||||||
|
index := color.New(color.FgCyan).Format("#" + strconv.Itoa(int(issue.Number)))
|
||||||
|
title := color.New(color.FgYellow).Format(issue.Title)
|
||||||
|
lbls := make([]string, len(issue.Labels))
|
||||||
|
for idx, label := range issue.Labels {
|
||||||
|
lbls[idx] = label.Name
|
||||||
|
}
|
||||||
|
var labels string
|
||||||
|
if len(lbls) > 0 {
|
||||||
|
labels = color.New(color.FgHiBlack).Format("(" + strings.Join(lbls, ",") + ")")
|
||||||
|
}
|
||||||
|
issueMap[fmt.Sprintf("%s %s %s", index, title, labels)] = issue
|
||||||
|
}
|
||||||
|
|
||||||
|
list := make([]string, 0)
|
||||||
|
for key := range issueMap {
|
||||||
|
list = append(list, key)
|
||||||
|
}
|
||||||
|
sel := &survey.Select{Options: list, Message: "Matching issues, select one to see more details"}
|
||||||
|
var selection string
|
||||||
|
if err := survey.AskOne(sel, &selection); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := markdown.Render(issueMap[selection].Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(body)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAllPulls(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.RepoListPullRequestsOpts) ([]gitea.PullRequest, error) {
|
||||||
|
opts.State = optional.NewString("open")
|
||||||
|
pullsOpen, err := getPulls(auth, client, owner, repo, opts)
|
||||||
|
if err == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
opts.State = optional.NewString("closed")
|
||||||
|
pullsClosed, err := getPulls(auth, client, owner, repo, opts)
|
||||||
|
if err == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(pullsOpen, pullsClosed...), nil
|
||||||
|
}
|
||||||
|
|
||||||
func getPulls(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.RepoListPullRequestsOpts) ([]gitea.PullRequest, error) {
|
func getPulls(auth context.Context, client *gitea.APIClient, owner, repo string, opts *gitea.RepoListPullRequestsOpts) ([]gitea.PullRequest, error) {
|
||||||
pulls := make([]gitea.PullRequest, 0)
|
pulls := make([]gitea.PullRequest, 0)
|
||||||
var p int32 = 1
|
var p int32 = 1
|
||||||
|
1
go.mod
1
go.mod
@ -12,6 +12,7 @@ require (
|
|||||||
github.com/golang/protobuf v1.3.3 // indirect
|
github.com/golang/protobuf v1.3.3 // indirect
|
||||||
github.com/kr/pretty v0.2.0 // indirect
|
github.com/kr/pretty v0.2.0 // indirect
|
||||||
github.com/kr/pty v1.1.8 // indirect
|
github.com/kr/pty v1.1.8 // indirect
|
||||||
|
github.com/kyokomi/emoji v2.1.0+incompatible
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
github.com/sergi/go-diff v1.1.0 // indirect
|
github.com/sergi/go-diff v1.1.0 // indirect
|
||||||
github.com/urfave/cli/v2 v2.1.1
|
github.com/urfave/cli/v2 v2.1.1
|
||||||
|
2
go.sum
2
go.sum
@ -65,6 +65,8 @@ github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI=
|
|||||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kyokomi/emoji v2.1.0+incompatible h1:+DYU2RgpI6OHG4oQkM5KlqD3Wd3UPEsX8jamTo1Mp6o=
|
||||||
|
github.com/kyokomi/emoji v2.1.0+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA=
|
||||||
github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23 h1:Wp7NjqGKGN9te9N/rvXYRhlVcrulGdxnz8zadXWs7fc=
|
github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23 h1:Wp7NjqGKGN9te9N/rvXYRhlVcrulGdxnz8zadXWs7fc=
|
||||||
github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
github.com/logrusorgru/aurora v0.0.0-20191116043053-66b7ad493a23/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||||
github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
|
github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac=
|
||||||
|
1
main.go
1
main.go
@ -19,6 +19,7 @@ func main() {
|
|||||||
&cmd.Logout,
|
&cmd.Logout,
|
||||||
&cmd.Repo,
|
&cmd.Repo,
|
||||||
&cmd.Issues,
|
&cmd.Issues,
|
||||||
|
&cmd.Pulls,
|
||||||
}
|
}
|
||||||
app.Flags = cmd.Flags
|
app.Flags = cmd.Flags
|
||||||
app.EnableBashCompletion = true
|
app.EnableBashCompletion = true
|
||||||
|
@ -2,6 +2,7 @@ package markdown
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/charmbracelet/glamour"
|
"github.com/charmbracelet/glamour"
|
||||||
|
"github.com/kyokomi/emoji"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -12,5 +13,5 @@ func normalizeNewlines(s string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Render(text string) (string, error) {
|
func Render(text string) (string, error) {
|
||||||
return glamour.Render(normalizeNewlines(text), "dark")
|
return glamour.Render(emoji.Sprint(normalizeNewlines(text)), "dark")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user