8
8
"io/ioutil"
9
9
"os"
10
10
"path/filepath"
11
+ "sort"
11
12
13
+ "k8s.io/apimachinery/pkg/util/sets"
12
14
"sigs.k8s.io/yaml"
13
15
14
16
"github.com/operator-framework/operator-registry/internal/property"
@@ -75,7 +77,7 @@ func writeToFS(cfg DeclarativeConfig, w fsWriter, rootDir string) error {
75
77
if err := w .MkdirAll (pkgDir , 0777 ); err != nil {
76
78
return err
77
79
}
78
- filename := filepath .Join (pkgDir , fmt .Sprintf ("%s.yaml " , p .Name ))
80
+ filename := filepath .Join (pkgDir , fmt .Sprintf ("%s.json " , p .Name ))
79
81
if err := writeFile (fcfg , w , filename ); err != nil {
80
82
return err
81
83
}
@@ -91,7 +93,7 @@ func writeToFS(cfg DeclarativeConfig, w fsWriter, rootDir string) error {
91
93
gcfg := DeclarativeConfig {
92
94
Others : globals ,
93
95
}
94
- filename := filepath .Join (rootDir , fmt .Sprintf ("%s.yaml " , globalName ))
96
+ filename := filepath .Join (rootDir , fmt .Sprintf ("%s.json " , globalName ))
95
97
if err := writeFile (gcfg , w , filename ); err != nil {
96
98
return err
97
99
}
@@ -124,7 +126,7 @@ func writeObjectFiles(b Bundle, w fsWriter, baseDir string) error {
124
126
125
127
func writeFile (cfg DeclarativeConfig , w fsWriter , filename string ) error {
126
128
buf := & bytes.Buffer {}
127
- if err := writeYAML (cfg , buf ); err != nil {
129
+ if err := WriteJSON (cfg , buf ); err != nil {
128
130
return fmt .Errorf ("write to buffer for %q: %v" , filename , err )
129
131
}
130
132
if err := w .WriteFile (filename , buf .Bytes (), 0666 ); err != nil {
@@ -133,42 +135,28 @@ func writeFile(cfg DeclarativeConfig, w fsWriter, filename string) error {
133
135
return nil
134
136
}
135
137
136
- func writeYAML (cfg DeclarativeConfig , w io.Writer ) error {
137
- enc := newEncoder (w )
138
-
139
- bundlesByPackage := map [string ][]Bundle {}
140
- for _ , b := range cfg .Bundles {
141
- pkgName := b .Package
142
- bundlesByPackage [pkgName ] = append (bundlesByPackage [pkgName ], b )
143
- }
138
+ func WriteJSON (cfg DeclarativeConfig , w io.Writer ) error {
139
+ enc := json .NewEncoder (w )
140
+ enc .SetIndent ("" , " " )
141
+ enc .SetEscapeHTML (false )
142
+ return writeToEncoder (cfg , enc )
143
+ }
144
144
145
- for _ , p := range cfg .Packages {
146
- if err := enc .Encode (p ); err != nil {
147
- return err
148
- }
149
- for _ , b := range bundlesByPackage [p .Name ] {
150
- if err := enc .Encode (b ); err != nil {
151
- return err
152
- }
153
- }
154
- }
155
- for _ , o := range cfg .Others {
156
- if err := enc .Encode (o ); err != nil {
157
- return err
158
- }
159
- }
160
- return nil
145
+ func WriteYAML (cfg DeclarativeConfig , w io.Writer ) error {
146
+ enc := newYAMLEncoder (w )
147
+ return writeToEncoder (cfg , enc )
161
148
}
162
149
163
- type encoder struct {
164
- w io.Writer
150
+ type yamlEncoder struct {
151
+ encodedFirst bool
152
+ w io.Writer
165
153
}
166
154
167
- func newEncoder (w io.Writer ) encoder {
168
- return encoder { w }
155
+ func newYAMLEncoder (w io.Writer ) * yamlEncoder {
156
+ return & yamlEncoder { false , w }
169
157
}
170
158
171
- func (e encoder ) Encode (v interface {}) error {
159
+ func (e * yamlEncoder ) Encode (v interface {}) error {
172
160
var buf bytes.Buffer
173
161
enc := json .NewEncoder (& buf )
174
162
enc .SetEscapeHTML (false )
@@ -179,7 +167,79 @@ func (e encoder) Encode(v interface{}) error {
179
167
if err != nil {
180
168
return err
181
169
}
182
- yamlData = append ([]byte ("---\n " ), yamlData ... )
170
+ if e .encodedFirst {
171
+ yamlData = append ([]byte ("---\n " ), yamlData ... )
172
+ }
173
+ e .encodedFirst = true
183
174
_ , err = e .w .Write (yamlData )
184
175
return err
185
176
}
177
+
178
+ type encoder interface {
179
+ Encode (interface {}) error
180
+ }
181
+
182
+ func writeToEncoder (cfg DeclarativeConfig , enc encoder ) error {
183
+ pkgNames := sets .NewString ()
184
+
185
+ packagesByName := map [string ][]Package {}
186
+ for _ , p := range cfg .Packages {
187
+ pkgName := p .Name
188
+ pkgNames .Insert (pkgName )
189
+ packagesByName [pkgName ] = append (packagesByName [pkgName ], p )
190
+ }
191
+ bundlesByPackage := map [string ][]Bundle {}
192
+ for _ , b := range cfg .Bundles {
193
+ pkgName := b .Package
194
+ pkgNames .Insert (pkgName )
195
+ bundlesByPackage [pkgName ] = append (bundlesByPackage [pkgName ], b )
196
+ }
197
+ othersByPackage := map [string ][]Meta {}
198
+ for _ , o := range cfg .Others {
199
+ pkgName := o .Package
200
+ if pkgName == "" {
201
+ pkgName = globalName
202
+ }
203
+ pkgNames .Insert (pkgName )
204
+ othersByPackage [pkgName ] = append (othersByPackage [pkgName ], o )
205
+ }
206
+
207
+ for _ , pName := range pkgNames .List () {
208
+ if pName == globalName {
209
+ continue
210
+ }
211
+ pkgs := packagesByName [pName ]
212
+ for _ , p := range pkgs {
213
+ if err := enc .Encode (p ); err != nil {
214
+ return err
215
+ }
216
+ }
217
+
218
+ bundles := bundlesByPackage [pName ]
219
+ sort .Slice (bundles , func (i , j int ) bool {
220
+ return bundles [i ].Name < bundles [j ].Name
221
+ })
222
+ for _ , b := range bundles {
223
+ if err := enc .Encode (b ); err != nil {
224
+ return err
225
+ }
226
+ }
227
+
228
+ others := othersByPackage [pName ]
229
+ sort .SliceStable (others , func (i , j int ) bool {
230
+ return others [i ].Schema < others [j ].Schema
231
+ })
232
+ for _ , o := range others {
233
+ if err := enc .Encode (o ); err != nil {
234
+ return err
235
+ }
236
+ }
237
+ }
238
+
239
+ for _ , o := range othersByPackage [globalName ] {
240
+ if err := enc .Encode (o ); err != nil {
241
+ return err
242
+ }
243
+ }
244
+ return nil
245
+ }
0 commit comments