Repository navigation
Expand file tree
/
Copy pathoutput.go
More file actions
120 lines (105 loc) · 2.69 KB
/
Copy pathoutput.go
File metadata and controls
120 lines (105 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package main
import (
"encoding/json"
"fmt"
"io"
"regexp"
"strings"
"text/tabwriter"
"time"
)
func newTabWriter(w io.Writer) *tabwriter.Writer {
return tabwriter.NewWriter(w, 0, 0, 2, ' ', 0)
}
func cleanID(id string) string {
return strings.TrimPrefix(strings.TrimSpace(id), ":")
}
func truncate(value string, limit int) string {
value = strings.Join(strings.Fields(value), " ")
if len(value) <= limit {
return value
}
if limit <= 3 {
return value[:limit]
}
return value[:limit-3] + "..."
}
func formatTime(value time.Time) string {
if value.IsZero() {
return ""
}
return value.Format(time.RFC3339)
}
func firstNonEmpty(values ...string) string {
for _, value := range values {
if strings.TrimSpace(value) != "" {
return value
}
}
return ""
}
func extractPRURL(response errorLog) string {
if response.ResolutionURL != nil && strings.TrimSpace(*response.ResolutionURL) != "" {
return strings.TrimSpace(*response.ResolutionURL)
}
if response.ResolutionMetadata == nil {
return ""
}
if value, ok := response.ResolutionMetadata["pr_url"].(string); ok && strings.TrimSpace(value) != "" {
return strings.TrimSpace(value)
}
actions, ok := response.ResolutionMetadata["actions"].(map[string]any)
if !ok {
return ""
}
pr, ok := actions["pr"].(map[string]any)
if !ok {
return ""
}
if value, ok := pr["url"].(string); ok {
return strings.TrimSpace(value)
}
return ""
}
func statusUserLabel(user statusUser) string {
name := strings.TrimSpace(user.Name)
email := strings.TrimSpace(user.Email)
if name != "" && email != "" {
if user.Role != "" {
return fmt.Sprintf("%s <%s> (%s)", name, email, user.Role)
}
return fmt.Sprintf("%s <%s>", name, email)
}
if email != "" {
if user.Role != "" {
return fmt.Sprintf("%s (%s)", email, user.Role)
}
return email
}
return user.ID
}
func statusEntityLabel(name, id string) string {
name = strings.TrimSpace(name)
id = strings.TrimSpace(id)
if name != "" && id != "" {
return fmt.Sprintf("%s (%s)", name, id)
}
if name != "" {
return name
}
return id
}
func statusCountsLabel(counts map[string]int) string {
if counts == nil {
counts = map[string]int{}
}
statuses := []string{"pending", "processing", "completed", "failed", "skipped"}
parts := make([]string, 0, len(statuses))
for _, status := range statuses {
parts = append(parts, fmt.Sprintf("%s=%d", status, counts[status]))
}
return strings.Join(parts, " ")
}
var projectIDPattern = regexp.MustCompile(`(?i)^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)
func validProjectID(value string) bool { return projectIDPattern.MatchString(value) }
func (c *cli) writeJSON(value any) error { return json.NewEncoder(c.stdout).Encode(value) }