@@ -31,7 +31,7 @@ type Manifest2822 struct {
31
31
type Manifest2822Entry struct {
32
32
control.Paragraph
33
33
34
- Maintainers []string `delim:"," strip:"\n\r\t "`
34
+ Maintainers []Manifest2822Maintainer `delim:"," strip:"\n\r\t "`
35
35
36
36
Tags []string `delim:"," strip:"\n\r\t "`
37
37
SharedTags []string `delim:"," strip:"\n\r\t "`
@@ -53,6 +53,12 @@ type Manifest2822Entry struct {
53
53
Constraints []string `delim:"," strip:"\n\r\t "`
54
54
}
55
55
56
+ type Manifest2822Maintainer struct {
57
+ Name string
58
+ Email string
59
+ Handle string
60
+ }
61
+
56
62
var (
57
63
DefaultArchitecture = "amd64"
58
64
@@ -75,7 +81,7 @@ func deepCopyStringsMap(a map[string]string) map[string]string {
75
81
76
82
func (entry Manifest2822Entry ) Clone () Manifest2822Entry {
77
83
// SLICES! grr
78
- entry .Maintainers = append ([]string {}, entry .Maintainers ... )
84
+ entry .Maintainers = append ([]Manifest2822Maintainer {}, entry .Maintainers ... )
79
85
entry .Tags = append ([]string {}, entry .Tags ... )
80
86
entry .SharedTags = append ([]string {}, entry .SharedTags ... )
81
87
entry .Architectures = append ([]string {}, entry .Architectures ... )
@@ -104,7 +110,11 @@ func (entry *Manifest2822Entry) CleanDirectoryValues() {
104
110
const StringSeparator2822 = ", "
105
111
106
112
func (entry Manifest2822Entry ) MaintainersString () string {
107
- return strings .Join (entry .Maintainers , StringSeparator2822 )
113
+ maintainers := []string {}
114
+ for _ , maint := range entry .Maintainers {
115
+ maintainers = append (maintainers , maint .String ())
116
+ }
117
+ return strings .Join (maintainers , StringSeparator2822 )
108
118
}
109
119
110
120
func (entry Manifest2822Entry ) TagsString () string {
@@ -454,11 +464,31 @@ var (
454
464
MaintainersRegex = regexp .MustCompile (`^(` + MaintainersNameRegex + `)(?:\s+<(` + MaintainersEmailRegex + `)>)?\s+[(]@(` + MaintainersGitHubRegex + `)[)]$` )
455
465
)
456
466
467
+ func (maint Manifest2822Maintainer ) String () string {
468
+ ret := []string {maint .Name }
469
+ if maint .Email != "" {
470
+ ret = append (ret , "<" + maint .Email + ">" )
471
+ }
472
+ ret = append (ret , "(@" + maint .Handle + ")" )
473
+ return strings .Join (ret , " " )
474
+ }
475
+
476
+ func (maint * Manifest2822Maintainer ) UnmarshalControl (data string ) error {
477
+ if matches := MaintainersRegex .FindStringSubmatch (data ); len (matches ) > 0 {
478
+ maint .Name = matches [1 ]
479
+ maint .Email = matches [2 ]
480
+ maint .Handle = matches [3 ]
481
+ return nil
482
+ }
483
+ return fmt .Errorf ("invalid Maintainers: %q (expected format %q)" , data , MaintainersFormat )
484
+ }
485
+
457
486
func (entry Manifest2822Entry ) InvalidMaintainers () []string {
458
487
invalid := []string {}
459
488
for _ , maintainer := range entry .Maintainers {
460
- if ! MaintainersRegex .MatchString (maintainer ) {
461
- invalid = append (invalid , maintainer )
489
+ // normally these would already be caught by the parsing regex, but just in case someone made an invalid object by hand or something, let's re-validate
490
+ if maintainer .Name == "" || maintainer .Handle == "" {
491
+ invalid = append (invalid , maintainer .String ())
462
492
}
463
493
}
464
494
return invalid
0 commit comments