mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-31 01:05:26 +01:00 
			
		
		
		
	 b868d30434
			
		
	
	b868d30434
	
	
	
		
			
			Co-authored-by: techknowlogick <hello@techknowlogick.com> Co-committed-by: techknowlogick <hello@techknowlogick.com>
		
			
				
	
	
		
			157 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2020 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package print
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 
 | |
| 	"code.gitea.io/sdk/gitea"
 | |
| 	"github.com/enescakir/emoji"
 | |
| )
 | |
| 
 | |
| // IssueDetails print an issue rendered to stdout
 | |
| func IssueDetails(issue *gitea.Issue, reactions []*gitea.Reaction) {
 | |
| 	out := fmt.Sprintf(
 | |
| 		"# #%d %s (%s)\n@%s created %s\n\n%s\n",
 | |
| 		issue.Index,
 | |
| 		issue.Title,
 | |
| 		issue.State,
 | |
| 		issue.Poster.UserName,
 | |
| 		FormatTime(issue.Created, false),
 | |
| 		issue.Body,
 | |
| 	)
 | |
| 
 | |
| 	if len(reactions) > 0 {
 | |
| 		out += fmt.Sprintf("\n---\n\n%s\n", formatReactions(reactions))
 | |
| 	}
 | |
| 
 | |
| 	_ = outputMarkdown(out, getRepoURL(issue.HTMLURL))
 | |
| }
 | |
| 
 | |
| func formatReactions(reactions []*gitea.Reaction) string {
 | |
| 	reactionCounts := make(map[string]uint16)
 | |
| 	for _, r := range reactions {
 | |
| 		reactionCounts[r.Reaction]++
 | |
| 	}
 | |
| 
 | |
| 	reactionStrings := make([]string, 0, len(reactionCounts))
 | |
| 	for reaction, count := range reactionCounts {
 | |
| 		reactionStrings = append(reactionStrings, fmt.Sprintf("%dx :%s:", count, reaction))
 | |
| 	}
 | |
| 
 | |
| 	return emoji.Parse(strings.Join(reactionStrings, "  |  "))
 | |
| }
 | |
| 
 | |
| // IssuesPullsList prints a listing of issues & pulls
 | |
| func IssuesPullsList(issues []*gitea.Issue, output string, fields []string) {
 | |
| 	printIssues(issues, output, fields)
 | |
| }
 | |
| 
 | |
| // IssueFields are all available fields to print with IssuesList()
 | |
| var IssueFields = []string{
 | |
| 	"index",
 | |
| 	"state",
 | |
| 	"kind",
 | |
| 	"author",
 | |
| 	"author-id",
 | |
| 	"url",
 | |
| 
 | |
| 	"title",
 | |
| 	"body",
 | |
| 
 | |
| 	"created",
 | |
| 	"updated",
 | |
| 	"deadline",
 | |
| 
 | |
| 	"assignees",
 | |
| 	"milestone",
 | |
| 	"labels",
 | |
| 	"comments",
 | |
| 	"owner",
 | |
| 	"repo",
 | |
| }
 | |
| 
 | |
| func printIssues(issues []*gitea.Issue, output string, fields []string) {
 | |
| 	labelMap := map[int64]string{}
 | |
| 	printables := make([]printable, len(issues))
 | |
| 	machineReadable := isMachineReadable(output)
 | |
| 
 | |
| 	for i, x := range issues {
 | |
| 		// pre-serialize labels for performance
 | |
| 		for _, label := range x.Labels {
 | |
| 			if _, ok := labelMap[label.ID]; !ok {
 | |
| 				labelMap[label.ID] = formatLabel(label, !machineReadable, "")
 | |
| 			}
 | |
| 		}
 | |
| 		// store items with printable interface
 | |
| 		printables[i] = &printableIssue{x, &labelMap}
 | |
| 	}
 | |
| 
 | |
| 	t := tableFromItems(fields, printables, machineReadable)
 | |
| 	t.print(output)
 | |
| }
 | |
| 
 | |
| type printableIssue struct {
 | |
| 	*gitea.Issue
 | |
| 	formattedLabels *map[int64]string
 | |
| }
 | |
| 
 | |
| func (x printableIssue) FormatField(field string, machineReadable bool) string {
 | |
| 	switch field {
 | |
| 	case "index":
 | |
| 		return fmt.Sprintf("%d", x.Index)
 | |
| 	case "state":
 | |
| 		return string(x.State)
 | |
| 	case "kind":
 | |
| 		if x.PullRequest != nil {
 | |
| 			return "Pull"
 | |
| 		}
 | |
| 		return "Issue"
 | |
| 	case "author":
 | |
| 		return formatUserName(x.Poster)
 | |
| 	case "author-id":
 | |
| 		return x.Poster.UserName
 | |
| 	case "url":
 | |
| 		return x.HTMLURL
 | |
| 	case "title":
 | |
| 		return x.Title
 | |
| 	case "body":
 | |
| 		return x.Body
 | |
| 	case "created":
 | |
| 		return FormatTime(x.Created, machineReadable)
 | |
| 	case "updated":
 | |
| 		return FormatTime(x.Updated, machineReadable)
 | |
| 	case "deadline":
 | |
| 		if x.Deadline == nil {
 | |
| 			return ""
 | |
| 		}
 | |
| 		return FormatTime(*x.Deadline, machineReadable)
 | |
| 	case "milestone":
 | |
| 		if x.Milestone != nil {
 | |
| 			return x.Milestone.Title
 | |
| 		}
 | |
| 		return ""
 | |
| 	case "labels":
 | |
| 		labels := make([]string, len(x.Labels))
 | |
| 		for i, l := range x.Labels {
 | |
| 			labels[i] = (*x.formattedLabels)[l.ID]
 | |
| 		}
 | |
| 		return strings.Join(labels, " ")
 | |
| 	case "assignees":
 | |
| 		assignees := make([]string, len(x.Assignees))
 | |
| 		for i, a := range x.Assignees {
 | |
| 			assignees[i] = formatUserName(a)
 | |
| 		}
 | |
| 		return strings.Join(assignees, " ")
 | |
| 	case "comments":
 | |
| 		return fmt.Sprintf("%d", x.Comments)
 | |
| 	case "owner":
 | |
| 		return x.Repository.Owner
 | |
| 	case "repo":
 | |
| 		return x.Repository.Name
 | |
| 	}
 | |
| 	return ""
 | |
| }
 |