1
0
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:
jolheiser 2020-02-14 15:18:13 -06:00
parent 5b7b970a06
commit 2f74fb4ae0
No known key found for this signature in database
GPG Key ID: B853ADA5DA7BBF7A
6 changed files with 119 additions and 23 deletions

@ -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)

@ -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

@ -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

@ -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=

@ -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")
} }