func parseInputVersions() (paths []string, groups []types.GroupVersions, gvToPath map[types.GroupVersion]string, err error) { var seenGroups = make(map[types.Group]*types.GroupVersions) gvToPath = make(map[types.GroupVersion]string) for _, input := range *inputVersions { gvPath, gvString := parsePathGroupVersion(input) gv, err := types.ToGroupVersion(gvString) if err != nil { return nil, nil, nil, err } if group, ok := seenGroups[gv.Group]; ok { (*seenGroups[gv.Group]).Versions = append(group.Versions, gv.Version) } else { seenGroups[gv.Group] = &types.GroupVersions{ Group: gv.Group, Versions: []types.Version{gv.Version}, } } path := versionToPath(gvPath, gv.Group.String(), gv.Version.String()) paths = append(paths, path) gvToPath[gv] = path } var groupNames []string for groupName := range seenGroups { groupNames = append(groupNames, groupName.String()) } sort.Strings(groupNames) for _, groupName := range groupNames { groups = append(groups, *seenGroups[types.Group(groupName)]) } return paths, groups, gvToPath, nil }
// Packages makes the client package definition. func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } boilerplate = append(boilerplate, []byte(generatedBy())...) customArgs, ok := arguments.CustomArgs.(*CustomArgs) if !ok { glog.Fatalf("Wrong CustomArgs type: %T", arguments.CustomArgs) } var packageList generator.Packages typesForGroupVersion := make(map[clientgentypes.GroupVersion][]*types.Type) groupVersions := make(map[string]clientgentypes.GroupVersions) for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(inputDir) objectMeta, err := objectMetaForPackage(p) if err != nil { glog.Fatal(err) } if objectMeta == nil { // no types in this package had genclient continue } var gv clientgentypes.GroupVersion if isInternal(objectMeta) { lastSlash := strings.LastIndex(p.Path, "/") if lastSlash == -1 { glog.Fatalf("error constructing internal group version for package %q", p.Path) } gv.Group = clientgentypes.Group(p.Path[lastSlash+1:]) } else { parts := strings.Split(p.Path, "/") gv.Group = clientgentypes.Group(parts[len(parts)-2]) gv.Version = clientgentypes.Version(parts[len(parts)-1]) } var typesToGenerate []*types.Type for _, t := range p.Types { // filter out types which dont have genclient=true. if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { continue } // filter out types which have noMethods if extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true { continue } typesToGenerate = append(typesToGenerate, t) if _, ok := typesForGroupVersion[gv]; !ok { typesForGroupVersion[gv] = []*types.Type{} } typesForGroupVersion[gv] = append(typesForGroupVersion[gv], t) } if len(typesToGenerate) == 0 { continue } icGroupName := namer.IC(gv.Group.NonEmpty()) groupVersionsEntry, ok := groupVersions[icGroupName] if !ok { groupVersionsEntry = clientgentypes.GroupVersions{ Group: gv.Group, } } groupVersionsEntry.Versions = append(groupVersionsEntry.Versions, gv.Version) groupVersions[icGroupName] = groupVersionsEntry orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} typesToGenerate = orderer.OrderTypes(typesToGenerate) packageList = append(packageList, versionPackage(arguments.OutputPackagePath, gv, boilerplate, typesToGenerate, customArgs.InternalClientSetPackage, customArgs.VersionedClientSetPackage, customArgs.ListersPackage)) } packageList = append(packageList, factoryInterfacePackage(arguments.OutputPackagePath, boilerplate, customArgs.InternalClientSetPackage, customArgs.VersionedClientSetPackage, typesForGroupVersion)) packageList = append(packageList, factoryPackage(arguments.OutputPackagePath, boilerplate, groupVersions, customArgs.InternalClientSetPackage, customArgs.VersionedClientSetPackage, typesForGroupVersion)) for _, groupVersionsEntry := range groupVersions { packageList = append(packageList, groupPackage(arguments.OutputPackagePath, groupVersionsEntry, boilerplate)) } return packageList }
// Packages makes the client package definition. func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } boilerplate = append(boilerplate, []byte(generatedBy())...) var packageList generator.Packages for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(inputDir) objectMeta, err := objectMetaForPackage(p) if err != nil { glog.Fatal(err) } if objectMeta == nil { // no types in this package had genclient continue } var gv clientgentypes.GroupVersion var internalGVPkg string if isInternal(objectMeta) { lastSlash := strings.LastIndex(p.Path, "/") if lastSlash == -1 { glog.Fatalf("error constructing internal group version for package %q", p.Path) } gv.Group = clientgentypes.Group(p.Path[lastSlash+1:]) internalGVPkg = p.Path } else { parts := strings.Split(p.Path, "/") gv.Group = clientgentypes.Group(parts[len(parts)-2]) gv.Version = clientgentypes.Version(parts[len(parts)-1]) internalGVPkg = strings.Join(parts[0:len(parts)-1], "/") } var typesToGenerate []*types.Type for _, t := range p.Types { // filter out types which dont have genclient=true. if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { continue } typesToGenerate = append(typesToGenerate, t) } orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} typesToGenerate = orderer.OrderTypes(typesToGenerate) packagePath := filepath.Join(arguments.OutputPackagePath, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())) packageList = append(packageList, &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &expansionGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "expansion_generated", }, packagePath: filepath.Join(arguments.OutputBase, packagePath), types: typesToGenerate, }) for _, t := range typesToGenerate { generators = append(generators, &listerGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(t.Name.Name), }, outputPackage: arguments.OutputPackagePath, groupVersion: gv, internalGVPkg: internalGVPkg, typeToGenerate: t, imports: generator.NewImportTracker(), objectMeta: objectMeta, }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // piggy-back on types that are tagged for client-gen return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, }) } return packageList }