Source file
src/cmd/api/run.go
Documentation: cmd/api
1
2
3
4
5
6
7
8
9
10 package main
11
12 import (
13 "errors"
14 "fmt"
15 exec "internal/execabs"
16 "internal/goversion"
17 "io/fs"
18 "log"
19 "os"
20 "path/filepath"
21 "runtime"
22 "strings"
23 )
24
25 func goCmd() string {
26 var exeSuffix string
27 if runtime.GOOS == "windows" {
28 exeSuffix = ".exe"
29 }
30 path := filepath.Join(runtime.GOROOT(), "bin", "go"+exeSuffix)
31 if _, err := os.Stat(path); err == nil {
32 return path
33 }
34 return "go"
35 }
36
37 var goroot string
38
39 func main() {
40 log.SetFlags(0)
41 goroot = os.Getenv("GOROOT")
42 if goroot == "" {
43 log.Fatal("No $GOROOT set.")
44 }
45
46 apiDir := filepath.Join(goroot, "api")
47 out, err := exec.Command(goCmd(), "tool", "api",
48 "-c", findAPIDirFiles(apiDir),
49 allowNew(apiDir),
50 "-next", filepath.Join(apiDir, "next.txt"),
51 "-except", filepath.Join(apiDir, "except.txt")).CombinedOutput()
52 if err != nil {
53 log.Fatalf("Error running API checker: %v\n%s", err, out)
54 }
55 fmt.Print(string(out))
56 }
57
58
59
60 func findAPIDirFiles(apiDir string) string {
61 dir, err := os.Open(apiDir)
62 if err != nil {
63 log.Fatal(err)
64 }
65 defer dir.Close()
66 fs, err := dir.Readdirnames(-1)
67 if err != nil {
68 log.Fatal(err)
69 }
70 var apiFiles []string
71 for _, fn := range fs {
72 if strings.HasPrefix(fn, "go1") {
73 apiFiles = append(apiFiles, filepath.Join(apiDir, fn))
74 }
75 }
76 return strings.Join(apiFiles, ",")
77 }
78
79
80 func allowNew(apiDir string) string {
81
82
83 if _, err := os.Stat(filepath.Join(apiDir, fmt.Sprintf("go1.%d.txt", goversion.Version-1))); err != nil {
84 log.Fatalln("Problem with api file for previous release:", err)
85 }
86
87
88
89 _, err := os.Stat(filepath.Join(apiDir, fmt.Sprintf("go1.%d.txt", goversion.Version)))
90 if errors.Is(err, fs.ErrNotExist) {
91
92
93
94 return "-allow_new=true"
95 } else if err == nil {
96
97
98
99
100
101
102
103
104 return "-allow_new=false"
105 } else {
106 log.Fatal(err)
107 }
108 panic("unreachable")
109 }
110
View as plain text