Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 231bcf4

Browse files
committedMay 5, 2021
revert WriteDir to use JSON, but keep WriteYAML support
Signed-off-by: Joe Lanford <[email protected]>
1 parent 24d0ad3 commit 231bcf4

File tree

2 files changed

+97
-37
lines changed

2 files changed

+97
-37
lines changed
 

‎internal/declcfg/write.go

+93-33
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import (
88
"io/ioutil"
99
"os"
1010
"path/filepath"
11+
"sort"
1112

13+
"k8s.io/apimachinery/pkg/util/sets"
1214
"sigs.k8s.io/yaml"
1315

1416
"github.com/operator-framework/operator-registry/internal/property"
@@ -75,7 +77,7 @@ func writeToFS(cfg DeclarativeConfig, w fsWriter, rootDir string) error {
7577
if err := w.MkdirAll(pkgDir, 0777); err != nil {
7678
return err
7779
}
78-
filename := filepath.Join(pkgDir, fmt.Sprintf("%s.yaml", p.Name))
80+
filename := filepath.Join(pkgDir, fmt.Sprintf("%s.json", p.Name))
7981
if err := writeFile(fcfg, w, filename); err != nil {
8082
return err
8183
}
@@ -91,7 +93,7 @@ func writeToFS(cfg DeclarativeConfig, w fsWriter, rootDir string) error {
9193
gcfg := DeclarativeConfig{
9294
Others: globals,
9395
}
94-
filename := filepath.Join(rootDir, fmt.Sprintf("%s.yaml", globalName))
96+
filename := filepath.Join(rootDir, fmt.Sprintf("%s.json", globalName))
9597
if err := writeFile(gcfg, w, filename); err != nil {
9698
return err
9799
}
@@ -124,7 +126,7 @@ func writeObjectFiles(b Bundle, w fsWriter, baseDir string) error {
124126

125127
func writeFile(cfg DeclarativeConfig, w fsWriter, filename string) error {
126128
buf := &bytes.Buffer{}
127-
if err := writeYAML(cfg, buf); err != nil {
129+
if err := WriteJSON(cfg, buf); err != nil {
128130
return fmt.Errorf("write to buffer for %q: %v", filename, err)
129131
}
130132
if err := w.WriteFile(filename, buf.Bytes(), 0666); err != nil {
@@ -133,42 +135,28 @@ func writeFile(cfg DeclarativeConfig, w fsWriter, filename string) error {
133135
return nil
134136
}
135137

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+
}
144144

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)
161148
}
162149

163-
type encoder struct {
164-
w io.Writer
150+
type yamlEncoder struct {
151+
encodedFirst bool
152+
w io.Writer
165153
}
166154

167-
func newEncoder(w io.Writer) encoder {
168-
return encoder{w}
155+
func newYAMLEncoder(w io.Writer) *yamlEncoder {
156+
return &yamlEncoder{false, w}
169157
}
170158

171-
func (e encoder) Encode(v interface{}) error {
159+
func (e *yamlEncoder) Encode(v interface{}) error {
172160
var buf bytes.Buffer
173161
enc := json.NewEncoder(&buf)
174162
enc.SetEscapeHTML(false)
@@ -179,7 +167,79 @@ func (e encoder) Encode(v interface{}) error {
179167
if err != nil {
180168
return err
181169
}
182-
yamlData = append([]byte("---\n"), yamlData...)
170+
if e.encodedFirst {
171+
yamlData = append([]byte("---\n"), yamlData...)
172+
}
173+
e.encodedFirst = true
183174
_, err = e.w.Write(yamlData)
184175
return err
185176
}
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+
}

‎internal/declcfg/write_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ func TestWriteDir(t *testing.T) {
8989
}
9090

9191
expectedEntryNames := []string{
92-
fmt.Sprintf("%s.yaml", globalName),
92+
fmt.Sprintf("%s.json", globalName),
9393
"anakin",
9494
"boba-fett",
9595
}
9696
require.ElementsMatch(t, expectedEntryNames, entryNames)
9797

98-
anakinFilename := filepath.Join(testDir, "anakin", "anakin.yaml")
98+
anakinFilename := filepath.Join(testDir, "anakin", "anakin.json")
9999
anakinFile, err := os.Open(anakinFilename)
100100
require.NoError(t, err)
101101
defer anakinFile.Close()
@@ -105,7 +105,7 @@ func TestWriteDir(t *testing.T) {
105105
assert.Len(t, anakin.Bundles, 3)
106106
assert.Len(t, anakin.Others, 1)
107107

108-
bobaFettFilename := filepath.Join(testDir, "boba-fett", "boba-fett.yaml")
108+
bobaFettFilename := filepath.Join(testDir, "boba-fett", "boba-fett.json")
109109
bobaFettFile, err := os.Open(bobaFettFilename)
110110
require.NoError(t, err)
111111
defer bobaFettFile.Close()
@@ -115,7 +115,7 @@ func TestWriteDir(t *testing.T) {
115115
assert.Len(t, bobaFett.Bundles, 2)
116116
assert.Len(t, bobaFett.Others, 1)
117117

118-
globalFilename := filepath.Join(testDir, fmt.Sprintf("%s.yaml", globalName))
118+
globalFilename := filepath.Join(testDir, fmt.Sprintf("%s.json", globalName))
119119
globalFile, err := os.Open(globalFilename)
120120
require.NoError(t, err)
121121
globals, err := readYAMLOrJSON(globalFile)

0 commit comments

Comments
 (0)
Please sign in to comment.