mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-30 16:55:25 +01:00 
			
		
		
		
	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:
		| @@ -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 |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	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) |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	print.LabelsList(labels, flags.GlobalOutputValue) | ||||||
| 	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) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								modules/print/label.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								modules/print/label.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								modules/print/notification.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								modules/print/notification.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								modules/print/release.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								modules/print/release.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								modules/task/labels_export.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								modules/task/labels_export.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 6543
					6543