Skip to content

Commit e004e3d

Browse files
committed
Ensure every site configures markup
This avoids needing to notice and play whack-a-mole when things aren't configured as we expect. Also, add a --fix mode which will try to fix things for you.
1 parent 70aa8b2 commit e004e3d

File tree

4 files changed

+109
-4
lines changed

4 files changed

+109
-4
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package main
2+
3+
type hugoToml struct {
4+
Markup *hugoTomlMarkup `toml:"markup"`
5+
}
6+
7+
type hugoTomlMarkup struct {
8+
TableOfContents *hugoTomlTableOfContents `toml:"tableOfContents"`
9+
Goldmark *hugoTomlGoldmark `toml:"goldmark"`
10+
}
11+
12+
type hugoTomlTableOfContents struct {
13+
Endlevel *int `toml:"endLevel"`
14+
Ordered *bool `toml:"ordered"`
15+
StartLevel *int `toml:"startLevel"`
16+
}
17+
18+
type hugoTomlGoldmark struct {
19+
Renderer *hugoTomlGoldmarkRenderer `toml:"renderer"`
20+
Parser *hugoTomlGoldmarkParser `toml:"parser"`
21+
}
22+
23+
type hugoTomlGoldmarkRenderer struct {
24+
Unsafe *bool `toml:"unsafe"`
25+
}
26+
27+
type hugoTomlGoldmarkParser struct {
28+
Attribute *hugoTomlGoldmarkParserAttribute `toml:"attribute"`
29+
}
30+
31+
type hugoTomlGoldmarkParserAttribute struct {
32+
Block *bool `toml:"block"`
33+
Title *bool `toml:"title"`
34+
}

tooling/go/cmd/site-consistency/main.go

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,15 @@ import (
99
"os"
1010
"path/filepath"
1111
"sort"
12+
13+
"github.com/BurntSushi/toml"
1214
)
1315

1416
func main() {
1517
var rootDirectory string
18+
var fix bool
1619
flag.StringVar(&rootDirectory, "root-dir", ".", "Root directory to search for hugo.toml files in")
20+
flag.BoolVar(&fix, "fix", false, "Fix problems, rather than reporting them")
1721
flag.Parse()
1822

1923
var directoriesToCheck []string
@@ -35,10 +39,14 @@ func main() {
3539
var errors []string
3640
for _, directoryToCheck := range directoriesToCheck {
3741
for _, expectedSymlink := range []string{"config", "deploy-netlify.sh", "netlify.toml"} {
38-
if errorToReport, ok := checkForParentSymlink(directoryToCheck, expectedSymlink); !ok {
42+
if errorToReport, ok := checkForParentSymlink(directoryToCheck, expectedSymlink, fix); !ok {
3943
errors = append(errors, errorToReport)
4044
}
4145
}
46+
47+
if errorToReport := checkForMarkupConfig(filepath.Join(directoryToCheck, "hugo.toml"), fix); errorToReport != nil {
48+
errors = append(errors, errorToReport.Error())
49+
}
4250
}
4351

4452
for _, errorToReport := range errors {
@@ -51,13 +59,19 @@ func main() {
5159

5260
// checkForParentSymlink checks that a symlink exists in the directory with expectedLinkName pointing at something in the parent directory with the same name.
5361
// It returns a bool indicating whether things were correct, and if the bool is false, returns a non-empty string describing the problem suitable for displaying to a user.
54-
func checkForParentSymlink(directoryToCheck, expectedLinkName string) (string, bool) {
62+
func checkForParentSymlink(directoryToCheck, expectedLinkName string, fix bool) (string, bool) {
5563
expectedDestination := filepath.Join("..", "tooling", "common-config", expectedLinkName)
5664
path := filepath.Join(directoryToCheck, expectedLinkName)
5765
fileInfo, err := os.Lstat(path)
5866
if err != nil {
5967
reason := fmt.Sprintf("an error occurred looking it up: %v", err)
6068
if errors.Is(err, fs.ErrNotExist) {
69+
if fix {
70+
if err := os.Symlink(expectedDestination, path); err != nil {
71+
panic(fmt.Sprintf("Failed to create symlink %s: %v", path, err))
72+
}
73+
return "", true
74+
}
6175
reason = "it didn't exist"
6276
}
6377
return formatError(path, expectedDestination, reason), false
@@ -78,3 +92,58 @@ func checkForParentSymlink(directoryToCheck, expectedLinkName string) (string, b
7892
func formatError(path, expectedDestination, reason string) string {
7993
return fmt.Sprintf("Expected %s to be a symlink pointing at %s but %s", path, expectedDestination, reason)
8094
}
95+
96+
func checkForMarkupConfig(path string, fix bool) error {
97+
var config hugoToml
98+
bytes, err := os.ReadFile(path)
99+
if err != nil {
100+
return fmt.Errorf("failed to read %s: %w", path, err)
101+
}
102+
if err := toml.Unmarshal(bytes, &config); err != nil {
103+
return fmt.Errorf("failed to decode %s as toml: %w", path, err)
104+
}
105+
106+
want := &hugoTomlMarkup{
107+
TableOfContents: &hugoTomlTableOfContents{
108+
Endlevel: ptr(2),
109+
Ordered: ptr(true),
110+
StartLevel: ptr(2),
111+
},
112+
Goldmark: &hugoTomlGoldmark{
113+
Renderer: &hugoTomlGoldmarkRenderer{
114+
Unsafe: ptr(true),
115+
},
116+
Parser: &hugoTomlGoldmarkParser{
117+
Attribute: &hugoTomlGoldmarkParserAttribute{
118+
Block: ptr(true),
119+
Title: ptr(true),
120+
},
121+
},
122+
},
123+
}
124+
if config.Markup != want {
125+
wantConfig := hugoToml{
126+
Markup: want,
127+
}
128+
marshalledWant, err := toml.Marshal(wantConfig)
129+
if err != nil {
130+
panic(fmt.Sprintf("failed to marshal known-good toml: %v", err))
131+
}
132+
if fix && config.Markup == nil {
133+
var out []byte
134+
out = append(out, bytes...)
135+
out = append(out, '\n', '\n')
136+
out = append(out, marshalledWant...)
137+
if err := os.WriteFile(path, out, 0644); err != nil {
138+
panic(fmt.Sprintf("failed to fix %s: %v", path, err))
139+
}
140+
return nil
141+
}
142+
return fmt.Errorf("%s had wrong or missing [markup] section. Add this:\n%s", path, string(marshalledWant))
143+
}
144+
return nil
145+
}
146+
147+
func ptr[T any](v T) *T {
148+
return &v
149+
}

tooling/go/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ module github.com/CodeYourFuture/curriculum/tooling/go
33
go 1.21.5
44

55
require (
6+
github.com/BurntSushi/toml v1.4.0
7+
github.com/adrg/frontmatter v0.2.0
68
github.com/stretchr/testify v1.8.4
79
golang.org/x/mod v0.14.0
810
)
911

1012
require (
11-
github.com/BurntSushi/toml v0.3.1 // indirect
12-
github.com/adrg/frontmatter v0.2.0 // indirect
1313
github.com/davecgh/go-spew v1.1.1 // indirect
1414
github.com/pmezard/go-difflib v1.0.0 // indirect
1515
gopkg.in/yaml.v2 v2.3.0 // indirect

tooling/go/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
22
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
4+
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
35
github.com/adrg/frontmatter v0.2.0 h1:/DgnNe82o03riBd1S+ZDjd43wAmC6W35q67NHeLkPd4=
46
github.com/adrg/frontmatter v0.2.0/go.mod h1:93rQCj3z3ZlwyxxpQioRKC1wDLto4aXHrbqIsnH9wmE=
57
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=

0 commit comments

Comments
 (0)