Skip to content

Commit 8f1e513

Browse files
chore: Simplify generate.sh by removing git worktree and using generator-based check (#4120)
1 parent 591699f commit 8f1e513

File tree

4 files changed

+84
-34
lines changed

4 files changed

+84
-34
lines changed

github/gen-accessors.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ package main
2121

2222
import (
2323
"bytes"
24+
"errors"
2425
"flag"
2526
"fmt"
2627
"go/ast"
2728
"go/format"
2829
"go/parser"
2930
"go/token"
31+
"io/fs"
3032
"log"
3133
"os"
3234
"slices"
@@ -39,6 +41,7 @@ const (
3941
)
4042

4143
var (
44+
check = flag.Bool("check", false, "Check whether generated files are up to date")
4245
verbose = flag.Bool("v", false, "Print verbose log messages")
4346

4447
sourceTmpl = template.Must(template.New("source").Parse(source))
@@ -67,6 +70,10 @@ var (
6770
}
6871
)
6972

73+
func isCheck() bool {
74+
return *check || os.Getenv("CHECK") == "1"
75+
}
76+
7077
func logf(fmt string, args ...any) {
7178
if *verbose {
7279
log.Printf(fmt, args...)
@@ -233,6 +240,22 @@ func (t *templateData) dump() error {
233240
return fmt.Errorf("format.Source:\n%v\n%v", buf.String(), err)
234241
}
235242

243+
if isCheck() {
244+
logf("Checking %v...", filename)
245+
old, err := os.ReadFile(filename)
246+
if err != nil {
247+
if errors.Is(err, fs.ErrNotExist) {
248+
return fmt.Errorf("Missing file: %v\n", filename)
249+
}
250+
return err
251+
}
252+
253+
if !bytes.Equal(old, clean) {
254+
return fmt.Errorf("Generated files are out of date. Please run go generate ./... and commit the results")
255+
}
256+
return nil
257+
}
258+
236259
logf("Writing %v...", filename)
237260
if err := os.Chmod(filename, 0o644); err != nil {
238261
return fmt.Errorf("os.Chmod(%q, 0644): %v", filename, err)

github/gen-iterators.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ package main
1414

1515
import (
1616
"bytes"
17+
"errors"
1718
"flag"
1819
"fmt"
1920
"go/ast"
2021
"go/format"
2122
"go/parser"
2223
"go/token"
24+
"io/fs"
2325
"log"
2426
"os"
2527
"reflect"
@@ -34,6 +36,7 @@ const (
3436
)
3537

3638
var (
39+
check = flag.Bool("check", false, "Check whether generated files are up to date")
3740
verbose = flag.Bool("v", false, "Print verbose log messages")
3841

3942
sourceTmpl = template.Must(template.New("source").Funcs(template.FuncMap{
@@ -43,6 +46,10 @@ var (
4346
testTmpl = template.Must(template.New("test").Parse(test))
4447
)
4548

49+
func isCheck() bool {
50+
return *check || os.Getenv("CHECK") == "1"
51+
}
52+
4653
func logf(fmt string, args ...any) {
4754
if *verbose {
4855
log.Printf(fmt, args...)
@@ -599,6 +606,22 @@ func (t *templateData) dump() error {
599606
if err != nil {
600607
return fmt.Errorf("format.Source: %v\n%s", err, buf.String())
601608
}
609+
if isCheck() {
610+
logf("Checking %v...", filename)
611+
old, err := os.ReadFile(filename)
612+
if err != nil {
613+
if errors.Is(err, fs.ErrNotExist) {
614+
return fmt.Errorf("Missing file: %v\n", filename)
615+
}
616+
return err
617+
}
618+
619+
if !bytes.Equal(old, clean) {
620+
return fmt.Errorf("Generated files are out of date. Please run go generate ./... and commit the results")
621+
}
622+
return nil
623+
}
624+
602625
logf("Writing %v...", filename)
603626
return os.WriteFile(filename, clean, 0o644)
604627
}

github/gen-stringify-test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ package main
1717

1818
import (
1919
"bytes"
20+
"errors"
2021
"flag"
2122
"fmt"
2223
"go/ast"
2324
"go/format"
2425
"go/parser"
2526
"go/token"
27+
"io/fs"
2628
"log"
2729
"os"
2830
"strings"
@@ -36,6 +38,7 @@ const (
3638
)
3739

3840
var (
41+
check = flag.Bool("check", false, "Check whether generated files are up to date")
3942
verbose = flag.Bool("v", false, "Print verbose log messages")
4043

4144
// skipStructMethods lists "struct.method" combos to skip.
@@ -83,6 +86,10 @@ var (
8386
sourceTmpl = template.Must(template.New("source").Funcs(funcMap).Parse(source))
8487
)
8588

89+
func isCheck() bool {
90+
return *check || os.Getenv("CHECK") == "1"
91+
}
92+
8693
func main() {
8794
flag.Parse()
8895
fset := token.NewFileSet()
@@ -353,6 +360,22 @@ func (t *templateData) dump() error {
353360
return err
354361
}
355362

363+
if isCheck() {
364+
logf("Checking %v...", t.filename)
365+
old, err := os.ReadFile(t.filename)
366+
if err != nil {
367+
if errors.Is(err, fs.ErrNotExist) {
368+
return fmt.Errorf("Missing file: %v\n", t.filename)
369+
}
370+
return err
371+
}
372+
373+
if !bytes.Equal(old, clean) {
374+
return fmt.Errorf("Generated files are out of date. Please run go generate ./... and commit the results")
375+
}
376+
return nil
377+
}
378+
356379
logf("Writing %v...", t.filename)
357380
if err := os.Chmod(t.filename, 0o644); err != nil {
358381
return fmt.Errorf("os.Chmod(%q, 0644): %v", t.filename, err)

script/generate.sh

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/bin/sh
2-
#/ `script/generate.sh` runs `go generate` on all modules in this repo.
2+
#/ `script/generate.sh` runs `go generate` on repo.
33
#/ It also runs `script/run-check-structfield-settings.sh -fix` to keep linter
44
#/ exceptions in `.golangci.yml` up to date.
55
#/ `script/generate.sh --check` checks that the generated files are up to date.
@@ -8,47 +8,28 @@ set -e
88

99
CDPATH="" cd -- "$(dirname -- "$0")/.."
1010

11+
CHECK_MODE=0
1112
if [ "$1" = "--check" ]; then
12-
GENTEMP="$(mktemp -d)"
13-
git worktree add -q --detach "$GENTEMP"
14-
trap 'git worktree remove -f "$GENTEMP"; rm -rf "$GENTEMP"' EXIT
15-
git diff --name-only --diff-filter=D --no-renames HEAD | while read -r f; do
16-
rm -f "$GENTEMP/$f"
17-
done
18-
git ls-files -com --exclude-standard | while read -r f; do
19-
target="$GENTEMP/$f"
20-
mkdir -p "$(dirname -- "$target")"
21-
cp "$f" "$target"
22-
done
23-
if [ -f "$(pwd)"/bin ]; then
24-
ln -s "$(pwd)"/bin "$GENTEMP"/bin
25-
fi
26-
(
27-
cd "$GENTEMP"
28-
git add .
29-
git -c user.name='bot' -c user.email='bot@localhost' -c commit.gpgsign=false commit -m "generate" -q --allow-empty
30-
script/generate.sh
31-
[ -z "$(git status --porcelain)" ] || {
32-
msg="Generated files are out of date. Please run script/generate.sh and commit the results"
33-
if [ -n "$GITHUB_ACTIONS" ]; then
34-
echo "::error ::$msg"
35-
else
36-
echo "$msg" 1>&2
37-
fi
38-
git diff
39-
exit 1
40-
}
41-
)
42-
exit 0
13+
export CHECK=1
14+
CHECK_MODE=1
4315
fi
4416

17+
go generate ./...
18+
4519
MOD_DIRS="$(git ls-files '*go.mod' | xargs dirname | sort)"
4620

4721
for dir in $MOD_DIRS; do
4822
(
4923
cd "$dir"
50-
go generate ./...
51-
go mod tidy
24+
if [ "$CHECK_MODE" = "1" ]; then
25+
if ! go mod tidy -diff; then
26+
echo "go.mod/go.sum are out of date in $dir"
27+
exit 1
28+
fi
29+
else
30+
go mod tidy
31+
fi
5232
)
5333
done
34+
5435
script/run-check-structfield-settings.sh -fix

0 commit comments

Comments
 (0)