38
38
)
39
39
40
40
const (
41
- docCommentForceIncludes = "// +gencrdrefdocs:force"
41
+ docCommentForceIncludes = "+gencrdrefdocs:force"
42
+ docCommentIncludeUnversionedTypes = "+gencrdrefdocs:unversionedTypes"
42
43
)
43
44
44
45
type generatorConfig struct {
@@ -130,22 +131,31 @@ func main() {
130
131
}
131
132
132
133
klog .Infof ("parsing go packages in directory %s" , * flAPIDir )
133
- pkgs , err := parseAPIPackages (* flAPIDir )
134
+ pkgs , unversionedPkgs , err := parseAPIPackages (* flAPIDir )
134
135
if err != nil {
135
136
klog .Fatal (err )
136
137
}
137
138
if len (pkgs ) == 0 {
138
139
klog .Fatalf ("no API packages found in %s" , * flAPIDir )
139
140
}
140
141
141
- apiPackages , err := combineAPIPackages (pkgs )
142
+ var unversionedPkgNames []string
143
+ for _ , uvp := range unversionedPkgs {
144
+ unversionedPkgNames = append (unversionedPkgNames , uvp .Path )
145
+ }
146
+ apiPackages , err := combineAPIPackages (pkgs , unversionedPkgNames )
147
+ if err != nil {
148
+ klog .Fatal (err )
149
+ }
150
+
151
+ unversionedAPIPackages , err := combineAPIPackages (unversionedPkgs , unversionedPkgNames )
142
152
if err != nil {
143
153
klog .Fatal (err )
144
154
}
145
155
146
156
mkOutput := func () (string , error ) {
147
157
var b bytes.Buffer
148
- err := render (& b , apiPackages , config )
158
+ err := render (& b , apiPackages , unversionedAPIPackages , config )
149
159
if err != nil {
150
160
return "" , errors .Wrap (err , "failed to render the result" )
151
161
}
@@ -200,16 +210,17 @@ func groupName(pkg *types.Package) string {
200
210
return ""
201
211
}
202
212
203
- func parseAPIPackages (dir string ) ([]* types.Package , error ) {
213
+ func parseAPIPackages (dir string ) ([]* types.Package , [] * types. Package , error ) {
204
214
b := parser .New ()
205
215
// the following will silently fail (turn on -v=4 to see logs)
206
216
if err := b .AddDirRecursive (* flAPIDir ); err != nil {
207
- return nil , err
217
+ return nil , nil , err
208
218
}
209
219
scan , err := b .FindTypes ()
210
220
if err != nil {
211
- return nil , errors .Wrap (err , "failed to parse pkgs and types" )
221
+ return nil , nil , errors .Wrap (err , "failed to parse pkgs and types" )
212
222
}
223
+ var unversionedPkgs []* types.Package
213
224
var pkgNames []string
214
225
for p := range scan {
215
226
pkg := scan [p ]
@@ -223,7 +234,10 @@ func parseAPIPackages(dir string) ([]*types.Package, error) {
223
234
continue
224
235
}
225
236
226
- if groupName (pkg ) != "" && len (pkg .Types ) > 0 || containsString (pkg .DocComments , docCommentForceIncludes ) {
237
+ if len (pkg .Types ) > 0 && containsString (pkg .DocComments , docCommentIncludeUnversionedTypes ) {
238
+ klog .Infof ("including package=%s as an additional unversioned include" , p )
239
+ unversionedPkgs = append (unversionedPkgs , pkg )
240
+ } else if groupName (pkg ) != "" && len (pkg .Types ) > 0 || containsString (pkg .DocComments , docCommentForceIncludes ) {
227
241
klog .V (3 ).Infof ("package=%v has groupName and has types" , p )
228
242
pkgNames = append (pkgNames , p )
229
243
}
@@ -234,7 +248,7 @@ func parseAPIPackages(dir string) ([]*types.Package, error) {
234
248
klog .Infof ("using package=%s" , p )
235
249
pkgs = append (pkgs , scan [p ])
236
250
}
237
- return pkgs , nil
251
+ return pkgs , unversionedPkgs , nil
238
252
}
239
253
240
254
func containsString (sl []string , str string ) bool {
@@ -248,7 +262,7 @@ func containsString(sl []string, str string) bool {
248
262
249
263
// combineAPIPackages groups the Go packages by the <apiGroup+apiVersion> they
250
264
// offer, and combines the types in them.
251
- func combineAPIPackages (pkgs []* types.Package ) ([]* apiPackage , error ) {
265
+ func combineAPIPackages (pkgs []* types.Package , unversionedPkgNames [] string ) ([]* apiPackage , error ) {
252
266
pkgMap := make (map [string ]* apiPackage )
253
267
var pkgIds []string
254
268
@@ -263,7 +277,7 @@ func combineAPIPackages(pkgs []*types.Package) ([]*apiPackage, error) {
263
277
}
264
278
265
279
for _ , pkg := range pkgs {
266
- apiGroup , apiVersion , err := apiVersionForPackage (pkg )
280
+ apiGroup , apiVersion , err := apiVersionForPackage (pkg , unversionedPkgNames )
267
281
if err != nil {
268
282
return nil , errors .Wrapf (err , "could not get apiVersion for package %s" , pkg .Path )
269
283
}
@@ -597,8 +611,13 @@ func isOptionalMember(m types.Member) bool {
597
611
return ok
598
612
}
599
613
600
- func apiVersionForPackage (pkg * types.Package ) (string , string , error ) {
614
+ func apiVersionForPackage (pkg * types.Package , unversionedPkgNames [] string ) (string , string , error ) {
601
615
group := groupName (pkg )
616
+ for _ , upn := range unversionedPkgNames {
617
+ if upn == pkg .Path {
618
+ return group , "unversioned" , nil
619
+ }
620
+ }
602
621
version := pkg .Name // assumes basename (i.e. "v1" in "core/v1") is apiVersion
603
622
r := `^v\d+((alpha|beta)[a-z0-9]+)?$`
604
623
if ! regexp .MustCompile (r ).MatchString (version ) {
@@ -648,9 +667,9 @@ func constantsOfType(t *types.Type, pkg *apiPackage) []*types.Type {
648
667
return sortTypes (constants )
649
668
}
650
669
651
- func render (w io.Writer , pkgs []* apiPackage , config generatorConfig ) error {
652
- references := findTypeReferences (pkgs )
653
- typePkgMap := extractTypeToPackageMap (pkgs )
670
+ func render (w io.Writer , pkgs []* apiPackage , unversionedPkgs [] * apiPackage , config generatorConfig ) error {
671
+ references := findTypeReferences (append ( pkgs , unversionedPkgs ... ) )
672
+ typePkgMap := extractTypeToPackageMap (append ( pkgs , unversionedPkgs ... ) )
654
673
655
674
t , err := template .New ("" ).Funcs (map [string ]interface {}{
656
675
"isExportedType" : isExportedType ,
0 commit comments