@@ -16,11 +16,15 @@ package add
16
16
17
17
import (
18
18
"fmt"
19
+ "io/ioutil"
20
+ "os"
21
+ "path/filepath"
19
22
20
23
"github.com/operator-framework/operator-sdk/cmd/operator-sdk/internal/genutil"
21
24
"github.com/operator-framework/operator-sdk/internal/pkg/scaffold"
22
25
"github.com/operator-framework/operator-sdk/internal/pkg/scaffold/input"
23
26
"github.com/operator-framework/operator-sdk/internal/util/projutil"
27
+ "github.com/pkg/errors"
24
28
25
29
log "github.com/sirupsen/logrus"
26
30
"github.com/spf13/cobra"
@@ -102,10 +106,16 @@ func apiRun(cmd *cobra.Command, args []string) error {
102
106
Repo : projutil .CheckAndGetProjectGoPkg (),
103
107
AbsProjectPath : absProjectPath ,
104
108
}
105
-
106
109
s := & scaffold.Scaffold {}
110
+
111
+ // Check if any package files for this API group dir exist, and if not
112
+ // scaffold a stub.go to prevent erroneous gengo parse errors.
113
+ stub := & scaffold.Stub {Resource : r }
114
+ if err := scaffoldIfNoPkgFileExists (s , cfg , stub ); err != nil {
115
+ return errors .Wrap (err , "scaffold stub file" )
116
+ }
117
+
107
118
err = s .Execute (cfg ,
108
- & scaffold.Stub {Resource : r },
109
119
& scaffold.Types {Resource : r },
110
120
& scaffold.AddToScheme {Resource : r },
111
121
& scaffold.Register {Resource : r },
@@ -135,3 +145,26 @@ func apiRun(cmd *cobra.Command, args []string) error {
135
145
log .Info ("API generation complete." )
136
146
return nil
137
147
}
148
+
149
+ // scaffoldIfNoPkgFileExists executes f using s and cfg if no go files
150
+ // in f's directory exist.
151
+ func scaffoldIfNoPkgFileExists (s * scaffold.Scaffold , cfg * input.Config , f input.File ) error {
152
+ i , err := f .GetInput ()
153
+ if err != nil {
154
+ return errors .Wrapf (err , "error getting file %s input" , i .Path )
155
+ }
156
+ groupDir := filepath .Dir (i .Path )
157
+ gdInfos , err := ioutil .ReadDir (groupDir )
158
+ if err != nil && ! os .IsNotExist (err ) {
159
+ return errors .Wrapf (err , "error reading dir %s" , groupDir )
160
+ }
161
+ if err == nil {
162
+ for _ , info := range gdInfos {
163
+ if ! info .IsDir () && filepath .Ext (info .Name ()) == ".go" {
164
+ return nil
165
+ }
166
+ }
167
+ }
168
+ // err must be a non-existence error or no go files exist, so execute f.
169
+ return s .Execute (cfg , f )
170
+ }
0 commit comments