Refactor: Move list print functions into print package (#273)
MV list issues -> print.IssuesList MV list labels -> print.LabelsList & task.LabelsExport MV list logins -> print.LoginsList MV list miles -> print.MilestonesList MV list pulls -> print.PullsList MV list releases -> print.ReleasesList MV list issues&pulls of mile -> print.IssuesPullsList MV list notification threads -> print.NotificationsList Unexport print.outputList Unexport print.outputMarkdown remove comd/flags dependency in print module Reviewed-on: https://gitea.com/gitea/tea/pulls/273 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Reviewed-by: Andrew Thornton <art27@cantab.net> Co-Authored-By: 6543 <6543@obermui.de> Co-Committed-By: 6543 <6543@obermui.de>
This commit is contained in:
parent
2b11f408fd
commit
5cb3e1ded5
|
@ -6,7 +6,6 @@ package issues
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
|
@ -50,44 +49,6 @@ func RunIssuesList(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.IssuesList(issues, flags.GlobalOutputValue)
|
||||||
"Index",
|
|
||||||
"Title",
|
|
||||||
"State",
|
|
||||||
"Author",
|
|
||||||
"Milestone",
|
|
||||||
"Updated",
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
if len(issues) == 0 {
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, issue := range issues {
|
|
||||||
author := issue.Poster.FullName
|
|
||||||
if len(author) == 0 {
|
|
||||||
author = issue.Poster.UserName
|
|
||||||
}
|
|
||||||
mile := ""
|
|
||||||
if issue.Milestone != nil {
|
|
||||||
mile = issue.Milestone.Title
|
|
||||||
}
|
|
||||||
values = append(
|
|
||||||
values,
|
|
||||||
[]string{
|
|
||||||
strconv.FormatInt(issue.Index, 10),
|
|
||||||
issue.Title,
|
|
||||||
string(issue.State),
|
|
||||||
author,
|
|
||||||
mile,
|
|
||||||
print.FormatTime(issue.Updated),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,18 +5,15 @@
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
"code.gitea.io/tea/cmd/labels"
|
"code.gitea.io/tea/cmd/labels"
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
"code.gitea.io/tea/modules/print"
|
"code.gitea.io/tea/modules/print"
|
||||||
|
"code.gitea.io/tea/modules/task"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
"github.com/muesli/termenv"
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -46,54 +43,15 @@ var CmdLabels = cli.Command{
|
||||||
func runLabels(ctx *cli.Context) error {
|
func runLabels(ctx *cli.Context) error {
|
||||||
login, owner, repo := config.InitCommand(flags.GlobalRepoValue, flags.GlobalLoginValue, flags.GlobalRemoteValue)
|
login, owner, repo := config.InitCommand(flags.GlobalRepoValue, flags.GlobalLoginValue, flags.GlobalRemoteValue)
|
||||||
|
|
||||||
headers := []string{
|
|
||||||
"Index",
|
|
||||||
"Color",
|
|
||||||
"Name",
|
|
||||||
"Description",
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
labels, _, err := login.Client().ListRepoLabels(owner, repo, gitea.ListLabelsOptions{ListOptions: flags.GetListOptions(ctx)})
|
labels, _, err := login.Client().ListRepoLabels(owner, repo, gitea.ListLabelsOptions{ListOptions: flags.GetListOptions(ctx)})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(labels) == 0 {
|
if ctx.IsSet("save") {
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
return task.LabelsExport(labels, ctx.String("save"))
|
||||||
return nil
|
}
|
||||||
}
|
|
||||||
|
print.LabelsList(labels, flags.GlobalOutputValue)
|
||||||
p := termenv.ColorProfile()
|
|
||||||
|
|
||||||
fPath := ctx.String("save")
|
|
||||||
if len(fPath) > 0 {
|
|
||||||
f, err := os.Create(fPath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
for _, label := range labels {
|
|
||||||
fmt.Fprintf(f, "#%s %s\n", label.Color, label.Name)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for _, label := range labels {
|
|
||||||
color := termenv.String(label.Color)
|
|
||||||
|
|
||||||
values = append(
|
|
||||||
values,
|
|
||||||
[]string{
|
|
||||||
strconv.FormatInt(label.ID, 10),
|
|
||||||
fmt.Sprint(color.Background(p.Color("#" + label.Color))),
|
|
||||||
label.Name,
|
|
||||||
label.Description,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ package cmd
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"code.gitea.io/tea/cmd/flags"
|
||||||
"code.gitea.io/tea/cmd/login"
|
"code.gitea.io/tea/cmd/login"
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
"code.gitea.io/tea/modules/print"
|
"code.gitea.io/tea/modules/print"
|
||||||
|
@ -48,6 +49,6 @@ func runLoginDetail(name string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
print.LoginDetails(l)
|
print.LoginDetails(l, flags.GlobalOutputValue)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
package login
|
package login
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
|
@ -32,27 +31,6 @@ func RunLoginList(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.LoginsList(config.Config.Logins, flags.GlobalOutputValue)
|
||||||
"Name",
|
|
||||||
"URL",
|
|
||||||
"SSHHost",
|
|
||||||
"User",
|
|
||||||
"Default",
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
for _, l := range config.Config.Logins {
|
|
||||||
values = append(values, []string{
|
|
||||||
l.Name,
|
|
||||||
l.URL,
|
|
||||||
l.GetSSHHost(),
|
|
||||||
l.User,
|
|
||||||
fmt.Sprint(l.Default),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ package milestones
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
|
@ -105,44 +104,7 @@ func runMilestoneIssueList(ctx *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.IssuesPullsList(issues, flags.GlobalOutputValue)
|
||||||
"Index",
|
|
||||||
"State",
|
|
||||||
"Kind",
|
|
||||||
"Author",
|
|
||||||
"Updated",
|
|
||||||
"Title",
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
if len(issues) == 0 {
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, issue := range issues {
|
|
||||||
name := issue.Poster.FullName
|
|
||||||
if len(name) == 0 {
|
|
||||||
name = issue.Poster.UserName
|
|
||||||
}
|
|
||||||
kind := "Issue"
|
|
||||||
if issue.PullRequest != nil {
|
|
||||||
kind = "Pull"
|
|
||||||
}
|
|
||||||
values = append(
|
|
||||||
values,
|
|
||||||
[]string{
|
|
||||||
strconv.FormatInt(issue.Index, 10),
|
|
||||||
string(issue.State),
|
|
||||||
kind,
|
|
||||||
name,
|
|
||||||
print.FormatTime(issue.Updated),
|
|
||||||
issue.Title,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
package milestones
|
package milestones
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
|
@ -55,40 +54,6 @@ func RunMilestonesList(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.MilestonesList(milestones, flags.GlobalOutputValue, state)
|
||||||
"Title",
|
|
||||||
}
|
|
||||||
if state == gitea.StateAll {
|
|
||||||
headers = append(headers, "State")
|
|
||||||
}
|
|
||||||
headers = append(headers,
|
|
||||||
"Open/Closed Issues",
|
|
||||||
"DueDate",
|
|
||||||
)
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
for _, m := range milestones {
|
|
||||||
var deadline = ""
|
|
||||||
|
|
||||||
if m.Deadline != nil && !m.Deadline.IsZero() {
|
|
||||||
deadline = print.FormatTime(*m.Deadline)
|
|
||||||
}
|
|
||||||
|
|
||||||
item := []string{
|
|
||||||
m.Title,
|
|
||||||
}
|
|
||||||
if state == gitea.StateAll {
|
|
||||||
item = append(item, string(m.State))
|
|
||||||
}
|
|
||||||
item = append(item,
|
|
||||||
fmt.Sprintf("%d/%d", m.OpenIssues, m.ClosedIssues),
|
|
||||||
deadline,
|
|
||||||
)
|
|
||||||
|
|
||||||
values = append(values, item)
|
|
||||||
}
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
|
@ -78,41 +77,6 @@ func runNotifications(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.NotificationsList(news, flags.GlobalOutputValue, ctx.Bool("all"))
|
||||||
"Type",
|
|
||||||
"Index",
|
|
||||||
"Title",
|
|
||||||
}
|
|
||||||
if ctx.Bool("all") {
|
|
||||||
headers = append(headers, "Repository")
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
for _, n := range news {
|
|
||||||
if n.Subject == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// if pull or Issue get Index
|
|
||||||
var index string
|
|
||||||
if n.Subject.Type == "Issue" || n.Subject.Type == "Pull" {
|
|
||||||
index = n.Subject.URL
|
|
||||||
urlParts := strings.Split(n.Subject.URL, "/")
|
|
||||||
if len(urlParts) != 0 {
|
|
||||||
index = urlParts[len(urlParts)-1]
|
|
||||||
}
|
|
||||||
index = "#" + index
|
|
||||||
}
|
|
||||||
|
|
||||||
item := []string{n.Subject.Type, index, n.Subject.Title}
|
|
||||||
if ctx.Bool("all") {
|
|
||||||
item = append(item, n.Repository.FullName)
|
|
||||||
}
|
|
||||||
values = append(values, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(values) != 0 {
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ func RunOrganizationList(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
print.OrganizationsList(userOrganizations)
|
print.OrganizationsList(userOrganizations, flags.GlobalOutputValue)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ package pulls
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"code.gitea.io/tea/cmd/flags"
|
"code.gitea.io/tea/cmd/flags"
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
|
@ -48,47 +47,6 @@ func RunPullsList(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.PullsList(prs, flags.GlobalOutputValue)
|
||||||
"Index",
|
|
||||||
"Title",
|
|
||||||
"State",
|
|
||||||
"Author",
|
|
||||||
"Milestone",
|
|
||||||
"Updated",
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
if len(prs) == 0 {
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pr := range prs {
|
|
||||||
if pr == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
author := pr.Poster.FullName
|
|
||||||
if len(author) == 0 {
|
|
||||||
author = pr.Poster.UserName
|
|
||||||
}
|
|
||||||
mile := ""
|
|
||||||
if pr.Milestone != nil {
|
|
||||||
mile = pr.Milestone.Title
|
|
||||||
}
|
|
||||||
values = append(
|
|
||||||
values,
|
|
||||||
[]string{
|
|
||||||
strconv.FormatInt(pr.Index, 10),
|
|
||||||
pr.Title,
|
|
||||||
string(pr.State),
|
|
||||||
author,
|
|
||||||
mile,
|
|
||||||
print.FormatTime(*pr.Updated),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,41 +38,7 @@ func RunReleasesList(ctx *cli.Context) error {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
headers := []string{
|
print.ReleasesList(releases, flags.GlobalOutputValue)
|
||||||
"Tag-Name",
|
|
||||||
"Title",
|
|
||||||
"Published At",
|
|
||||||
"Status",
|
|
||||||
"Tar URL",
|
|
||||||
}
|
|
||||||
|
|
||||||
var values [][]string
|
|
||||||
|
|
||||||
if len(releases) == 0 {
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, release := range releases {
|
|
||||||
status := "released"
|
|
||||||
if release.IsDraft {
|
|
||||||
status = "draft"
|
|
||||||
} else if release.IsPrerelease {
|
|
||||||
status = "prerelease"
|
|
||||||
}
|
|
||||||
values = append(
|
|
||||||
values,
|
|
||||||
[]string{
|
|
||||||
release.TagName,
|
|
||||||
release.Title,
|
|
||||||
print.FormatTime(release.PublishedAt),
|
|
||||||
status,
|
|
||||||
release.TarURL,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
print.OutputList(flags.GlobalOutputValue, headers, values)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ func RunReposList(ctx *cli.Context) error {
|
||||||
reposFiltered = filterReposByType(rps, typeFilter)
|
reposFiltered = filterReposByType(rps, typeFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
print.ReposList(reposFiltered, getFields(ctx))
|
print.ReposList(reposFiltered, flags.GlobalOutputValue, getFields(ctx))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -123,6 +123,6 @@ func runReposSearch(ctx *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
print.ReposList(rps, getFields(ctx))
|
print.ReposList(rps, flags.GlobalOutputValue, getFields(ctx))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,14 @@ package print
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IssueDetails print an issue rendered to stdout
|
// IssueDetails print an issue rendered to stdout
|
||||||
func IssueDetails(issue *gitea.Issue) {
|
func IssueDetails(issue *gitea.Issue) {
|
||||||
OutputMarkdown(fmt.Sprintf(
|
outputMarkdown(fmt.Sprintf(
|
||||||
"# #%d %s (%s)\n@%s created %s\n\n%s\n",
|
"# #%d %s (%s)\n@%s created %s\n\n%s\n",
|
||||||
issue.Index,
|
issue.Index,
|
||||||
issue.Title,
|
issue.Title,
|
||||||
|
@ -22,3 +23,87 @@ func IssueDetails(issue *gitea.Issue) {
|
||||||
issue.Body,
|
issue.Body,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IssuesList prints a listing of issues
|
||||||
|
func IssuesList(issues []*gitea.Issue, output string) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Index",
|
||||||
|
"Title",
|
||||||
|
"State",
|
||||||
|
"Author",
|
||||||
|
"Milestone",
|
||||||
|
"Updated",
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(issues) == 0 {
|
||||||
|
outputList(output, headers, values)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, issue := range issues {
|
||||||
|
author := issue.Poster.FullName
|
||||||
|
if len(author) == 0 {
|
||||||
|
author = issue.Poster.UserName
|
||||||
|
}
|
||||||
|
mile := ""
|
||||||
|
if issue.Milestone != nil {
|
||||||
|
mile = issue.Milestone.Title
|
||||||
|
}
|
||||||
|
values = append(
|
||||||
|
values,
|
||||||
|
[]string{
|
||||||
|
strconv.FormatInt(issue.Index, 10),
|
||||||
|
issue.Title,
|
||||||
|
string(issue.State),
|
||||||
|
author,
|
||||||
|
mile,
|
||||||
|
FormatTime(issue.Updated),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
outputList(output, headers, values)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IssuesPullsList prints a listing of issues & pulls
|
||||||
|
// TODO combine with IssuesList
|
||||||
|
func IssuesPullsList(issues []*gitea.Issue, output string) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Index",
|
||||||
|
"State",
|
||||||
|
"Kind",
|
||||||
|
"Author",
|
||||||
|
"Updated",
|
||||||
|
"Title",
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(issues) == 0 {
|
||||||
|
outputList(output, headers, values)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, issue := range issues {
|
||||||
|
name := issue.Poster.FullName
|
||||||
|
if len(name) == 0 {
|
||||||
|
name = issue.Poster.UserName
|
||||||
|
}
|
||||||
|
kind := "Issue"
|
||||||
|
if issue.PullRequest != nil {
|
||||||
|
kind = "Pull"
|
||||||
|
}
|
||||||
|
values = append(
|
||||||
|
values,
|
||||||
|
[]string{
|
||||||
|
strconv.FormatInt(issue.Index, 10),
|
||||||
|
string(issue.State),
|
||||||
|
kind,
|
||||||
|
name,
|
||||||
|
FormatTime(issue.Updated),
|
||||||
|
issue.Title,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
outputList(output, headers, values)
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package print
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/muesli/termenv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LabelsList prints a listing of labels
|
||||||
|
func LabelsList(labels []*gitea.Label, output string) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Index",
|
||||||
|
"Color",
|
||||||
|
"Name",
|
||||||
|
"Description",
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(labels) == 0 {
|
||||||
|
outputList(output, headers, values)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
p := termenv.ColorProfile()
|
||||||
|
|
||||||
|
for _, label := range labels {
|
||||||
|
color := termenv.String(label.Color)
|
||||||
|
|
||||||
|
values = append(
|
||||||
|
values,
|
||||||
|
[]string{
|
||||||
|
strconv.FormatInt(label.ID, 10),
|
||||||
|
fmt.Sprint(color.Background(p.Color("#" + label.Color))),
|
||||||
|
label.Name,
|
||||||
|
label.Description,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
outputList(output, headers, values)
|
||||||
|
}
|
|
@ -72,9 +72,9 @@ func outputyaml(headers []string, values [][]string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OutputList provides general function to convert given list of items
|
// outputList provides general function to convert given list of items
|
||||||
// into several outputs (table, csv, simple, tsv, yaml)
|
// into several outputs (table, csv, simple, tsv, yaml)
|
||||||
func OutputList(output string, headers []string, values [][]string) {
|
func outputList(output string, headers []string, values [][]string) {
|
||||||
switch {
|
switch {
|
||||||
case output == "" || output == "table":
|
case output == "" || output == "table":
|
||||||
outputtable(headers, values)
|
outputtable(headers, values)
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// LoginDetails print login entry to stdout
|
// LoginDetails print login entry to stdout
|
||||||
func LoginDetails(login *config.Login) {
|
func LoginDetails(login *config.Login, output string) {
|
||||||
in := fmt.Sprintf("# %s\n\n[@%s](%s/%s)\n",
|
in := fmt.Sprintf("# %s\n\n[@%s](%s/%s)\n",
|
||||||
login.Name,
|
login.Name,
|
||||||
login.User,
|
login.User,
|
||||||
|
@ -28,5 +28,29 @@ func LoginDetails(login *config.Login) {
|
||||||
}
|
}
|
||||||
in += fmt.Sprintf("\nCreated: %s", time.Unix(login.Created, 0).Format(time.RFC822))
|
in += fmt.Sprintf("\nCreated: %s", time.Unix(login.Created, 0).Format(time.RFC822))
|
||||||
|
|
||||||
OutputMarkdown(in)
|
outputMarkdown(in)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoginsList prints a listing of logins
|
||||||
|
func LoginsList(logins []config.Login, output string) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Name",
|
||||||
|
"URL",
|
||||||
|
"SSHHost",
|
||||||
|
"User",
|
||||||
|
"Default",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, l := range logins {
|
||||||
|
values = append(values, []string{
|
||||||
|
l.Name,
|
||||||
|
l.URL,
|
||||||
|
l.GetSSHHost(),
|
||||||
|
l.User,
|
||||||
|
fmt.Sprint(l.Default),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
outputList(output, headers, values)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,10 +10,10 @@ import (
|
||||||
"github.com/charmbracelet/glamour"
|
"github.com/charmbracelet/glamour"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OutputMarkdown prints markdown to stdout, formatted for terminals.
|
// outputMarkdown prints markdown to stdout, formatted for terminals.
|
||||||
// If the input could not be parsed, it is printed unformatted, the error
|
// If the input could not be parsed, it is printed unformatted, the error
|
||||||
// is returned anyway.
|
// is returned anyway.
|
||||||
func OutputMarkdown(markdown string) error {
|
func outputMarkdown(markdown string) error {
|
||||||
out, err := glamour.Render(markdown, "auto")
|
out, err := glamour.Render(markdown, "auto")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(markdown)
|
fmt.Printf(markdown)
|
||||||
|
|
|
@ -22,3 +22,42 @@ func MilestoneDetails(milestone *gitea.Milestone) {
|
||||||
fmt.Printf("\nDeadline: %s\n", FormatTime(*milestone.Deadline))
|
fmt.Printf("\nDeadline: %s\n", FormatTime(*milestone.Deadline))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MilestonesList prints a listing of milestones
|
||||||
|
func MilestonesList(miles []*gitea.Milestone, output string, state gitea.StateType) {
|
||||||
|
|
||||||
|
headers := []string{
|
||||||
|
"Title",
|
||||||
|
}
|
||||||
|
if state == gitea.StateAll {
|
||||||
|
headers = append(headers, "State")
|
||||||
|
}
|
||||||
|
headers = append(headers,
|
||||||
|
"Open/Closed Issues",
|
||||||
|
"DueDate",
|
||||||
|
)
|
||||||
|
|
||||||
|
var values [][]string
|
||||||
|
|
||||||
|
for _, m := range miles {
|
||||||
|
var deadline = ""
|
||||||
|
|
||||||
|
if m.Deadline != nil && !m.Deadline.IsZero() {
|
||||||
|
deadline = FormatTime(*m.Deadline)
|
||||||
|
}
|
||||||
|
|
||||||
|
item := []string{
|
||||||
|
m.Title,
|
||||||
|
}
|
||||||
|
if state == gitea.StateAll {
|
||||||
|
item = append(item, string(m.State))
|
||||||
|
}
|
||||||
|
item = append(item,
|
||||||
|
fmt.Sprintf("%d/%d", m.OpenIssues, m.ClosedIssues),
|
||||||
|
deadline,
|
||||||
|
)
|
||||||
|
|
||||||
|
values = append(values, item)
|
||||||
|
}
|
||||||
|
outputList(output, headers, values)
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package print
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/sdk/gitea"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NotificationsList prints a listing of notification threads
|
||||||
|
func NotificationsList(news []*gitea.NotificationThread, output string, showRepository bool) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Type",
|
||||||
|
"Index",
|
||||||
|
"Title",
|
||||||
|
}
|
||||||
|
if showRepository {
|
||||||
|
headers = append(headers, "Repository")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, n := range news {
|
||||||
|
if n.Subject == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// if pull or Issue get Index
|
||||||
|
var index string
|
||||||
|
if n.Subject.Type == "Issue" || n.Subject.Type == "Pull" {
|
||||||
|
index = n.Subject.URL
|
||||||
|
urlParts := strings.Split(n.Subject.URL, "/")
|
||||||
|
if len(urlParts) != 0 {
|
||||||
|
index = urlParts[len(urlParts)-1]
|
||||||
|
}
|
||||||
|
index = "#" + index
|
||||||
|
}
|
||||||
|
|
||||||
|
item := []string{n.Subject.Type, index, n.Subject.Title}
|
||||||
|
if showRepository {
|
||||||
|
item = append(item, n.Repository.FullName)
|
||||||
|
}
|
||||||
|
values = append(values, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(values) != 0 {
|
||||||
|
outputList(output, headers, values)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
|
@ -8,11 +8,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
"code.gitea.io/tea/cmd/flags"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// OrganizationsList prints a listing of the organizations
|
// OrganizationsList prints a listing of the organizations
|
||||||
func OrganizationsList(organizations []*gitea.Organization) {
|
func OrganizationsList(organizations []*gitea.Organization, output string) {
|
||||||
if len(organizations) == 0 {
|
if len(organizations) == 0 {
|
||||||
fmt.Println("No organizations found")
|
fmt.Println("No organizations found")
|
||||||
return
|
return
|
||||||
|
@ -41,5 +40,5 @@ func OrganizationsList(organizations []*gitea.Organization) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputList(flags.GlobalOutputValue, headers, values)
|
outputList(output, headers, values)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ package print
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
)
|
)
|
||||||
|
@ -54,5 +55,50 @@ func PullDetails(pr *gitea.PullRequest, reviews []*gitea.PullReview) {
|
||||||
out += "\nNo Conflicts"
|
out += "\nNo Conflicts"
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputMarkdown(out)
|
outputMarkdown(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PullsList prints a listing of pulls
|
||||||
|
func PullsList(prs []*gitea.PullRequest, output string) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Index",
|
||||||
|
"Title",
|
||||||
|
"State",
|
||||||
|
"Author",
|
||||||
|
"Milestone",
|
||||||
|
"Updated",
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(prs) == 0 {
|
||||||
|
outputList(output, headers, values)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pr := range prs {
|
||||||
|
if pr == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
author := pr.Poster.FullName
|
||||||
|
if len(author) == 0 {
|
||||||
|
author = pr.Poster.UserName
|
||||||
|
}
|
||||||
|
mile := ""
|
||||||
|
if pr.Milestone != nil {
|
||||||
|
mile = pr.Milestone.Title
|
||||||
|
}
|
||||||
|
values = append(
|
||||||
|
values,
|
||||||
|
[]string{
|
||||||
|
strconv.FormatInt(pr.Index, 10),
|
||||||
|
pr.Title,
|
||||||
|
string(pr.State),
|
||||||
|
author,
|
||||||
|
mile,
|
||||||
|
FormatTime(*pr.Updated),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
outputList(output, headers, values)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package print
|
||||||
|
|
||||||
|
import (
|
||||||
|
"code.gitea.io/sdk/gitea"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ReleasesList prints a listing of releases
|
||||||
|
func ReleasesList(releases []*gitea.Release, output string) {
|
||||||
|
var values [][]string
|
||||||
|
headers := []string{
|
||||||
|
"Tag-Name",
|
||||||
|
"Title",
|
||||||
|
"Published At",
|
||||||
|
"Status",
|
||||||
|
"Tar URL",
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(releases) == 0 {
|
||||||
|
outputList(output, headers, values)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, release := range releases {
|
||||||
|
status := "released"
|
||||||
|
if release.IsDraft {
|
||||||
|
status = "draft"
|
||||||
|
} else if release.IsPrerelease {
|
||||||
|
status = "prerelease"
|
||||||
|
}
|
||||||
|
values = append(
|
||||||
|
values,
|
||||||
|
[]string{
|
||||||
|
release.TagName,
|
||||||
|
release.Title,
|
||||||
|
FormatTime(release.PublishedAt),
|
||||||
|
status,
|
||||||
|
release.TarURL,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
outputList(output, headers, values)
|
||||||
|
}
|
|
@ -11,7 +11,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
"code.gitea.io/tea/cmd/flags"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type rp = *gitea.Repository
|
type rp = *gitea.Repository
|
||||||
|
@ -60,7 +59,7 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReposList prints a listing of the repos
|
// ReposList prints a listing of the repos
|
||||||
func ReposList(repos []*gitea.Repository, fields []string) {
|
func ReposList(repos []*gitea.Repository, output string, fields []string) {
|
||||||
if len(repos) == 0 {
|
if len(repos) == 0 {
|
||||||
fmt.Println("No repositories found")
|
fmt.Println("No repositories found")
|
||||||
return
|
return
|
||||||
|
@ -91,7 +90,7 @@ func ReposList(repos []*gitea.Repository, fields []string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputList(flags.GlobalOutputValue, fields, values)
|
outputList(output, fields, values)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RepoDetails print an repo formatted to stdout
|
// RepoDetails print an repo formatted to stdout
|
||||||
|
@ -150,7 +149,7 @@ func RepoDetails(repo *gitea.Repository, topics []string) {
|
||||||
tops = fmt.Sprintf("- Topics:\t%s\n", strings.Join(topics, ", "))
|
tops = fmt.Sprintf("- Topics:\t%s\n", strings.Join(topics, ", "))
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputMarkdown(fmt.Sprintf(
|
outputMarkdown(fmt.Sprintf(
|
||||||
"%s%s\n%s\n%s%s%s%s",
|
"%s%s\n%s\n%s%s%s%s",
|
||||||
title,
|
title,
|
||||||
desc,
|
desc,
|
||||||
|
|
|
@ -59,5 +59,5 @@ func TrackedTimesList(times []*gitea.TrackedTime, outputType string, from, until
|
||||||
"User",
|
"User",
|
||||||
"Duration",
|
"Duration",
|
||||||
}
|
}
|
||||||
OutputList(outputType, headers, outputValues)
|
outputList(outputType, headers, outputValues)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package task
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"code.gitea.io/sdk/gitea"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LabelsExport save list of labels to disc
|
||||||
|
func LabelsExport(labels []*gitea.Label, path string) error {
|
||||||
|
f, err := os.Create(path)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
for _, label := range labels {
|
||||||
|
if _, err := fmt.Fprintf(f, "#%s %s\n", label.Color, label.Name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue