1
0
mirror of https://github.com/coreos/ignition.git synced 2026-02-06 18:47:54 +01:00
Files
ignition/internal/doc/main.go
yasminvalim 74ac98e5d4 internal/doc/main: Wrap inner loop to trigger defer
Wrap the inner loop code in an anonymous function to make sure that
defer calls are triggered for each iteration of the loop and join all
errors as needed.

Diff best viewed with whitespace changes hidden.

Fixes lint:
```
Error return value of `f.Close` is not checked (errcheck)
```
2025-08-07 12:37:44 +02:00

136 lines
3.4 KiB
Go

// Copyright 2023 Red Hat, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
_ "embed"
"errors"
"fmt"
"io/fs"
"os"
"path/filepath"
"text/template"
"github.com/coreos/go-semver/semver"
"github.com/coreos/ignition/v2/config/doc"
v30 "github.com/coreos/ignition/v2/config/v3_0/types"
v31 "github.com/coreos/ignition/v2/config/v3_1/types"
v32 "github.com/coreos/ignition/v2/config/v3_2/types"
v33 "github.com/coreos/ignition/v2/config/v3_3/types"
v34 "github.com/coreos/ignition/v2/config/v3_4/types"
v35 "github.com/coreos/ignition/v2/config/v3_5/types"
v36 "github.com/coreos/ignition/v2/config/v3_6_experimental/types"
)
var (
//go:embed header.md
headerRaw string
header = template.Must(template.New("header").Parse(headerRaw))
)
func generate(dir string) error {
configs := []struct {
version string
config any
}{
// generate in inverse order of website navbar
{"3.6.0-experimental", v36.Config{}},
{"3.0.0", v30.Config{}},
{"3.1.0", v31.Config{}},
{"3.2.0", v32.Config{}},
{"3.3.0", v33.Config{}},
{"3.4.0", v34.Config{}},
{"3.5.0", v35.Config{}},
}
if err := os.MkdirAll(dir, 0755); err != nil {
return err
}
// parse input config
comps, err := doc.IgnitionComponents()
if err != nil {
return err
}
for i, c := range configs {
if err := func() (err error) {
ver := *semver.New(c.version)
// clean up any previous experimental spec doc, for use
// during spec stabilization
experimentalPath := filepath.Join(dir, fmt.Sprintf("configuration-v%d_%d_experimental.md", ver.Major, ver.Minor))
if err := os.Remove(experimentalPath); err != nil && !errors.Is(err, fs.ErrNotExist) {
return err
}
// open file
var path string
switch ver.PreRelease {
case "":
path = filepath.Join(dir, fmt.Sprintf("configuration-v%d_%d.md", ver.Major, ver.Minor))
case "experimental":
path = experimentalPath
default:
panic(fmt.Errorf("unexpected prerelease: %v", ver.PreRelease))
}
f, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
if err != nil {
return err
}
defer func() {
err = errors.Join(err, f.Close())
}()
// write header
args := struct {
Version semver.Version
NavOrder int
}{
Version: ver,
NavOrder: 50 - i,
}
if err := header.Execute(f, args); err != nil {
return fmt.Errorf("writing header for %s: %w", c.version, err)
}
// write docs
vers := doc.VariantVersions{
doc.IGNITION_VARIANT: ver,
}
if err := comps.Generate(vers, c.config, nil, f); err != nil {
return fmt.Errorf("generating doc for %s: %w", c.version, err)
}
return nil
}(); err != nil {
return err
}
}
return nil
}
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s <directory>\n", os.Args[0])
os.Exit(1)
}
if err := generate(os.Args[1]); err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err)
os.Exit(1)
}
}