1
16
17 package mage
18
19 import (
20 "fmt"
21 "log"
22 "net/url"
23 "os"
24 "path"
25 "path/filepath"
26 "strings"
27
28 "github.com/blang/semver/v4"
29 "github.com/uwu-tools/magex/shx"
30
31 kpath "k8s.io/utils/path"
32 "sigs.k8s.io/release-utils/command"
33 )
34
35 const (
36
37 defaultRepoInfraVersion = "v0.2.5"
38 repoInfraURLBase = "https://raw.githubusercontent.com/kubernetes/repo-infra"
39 )
40
41
42
43 func EnsureBoilerplateScript(version, boilerplateScript string, forceInstall bool) error {
44 found, err := kpath.Exists(kpath.CheckSymlinkOnly, boilerplateScript)
45 if err != nil {
46 return fmt.Errorf(
47 "checking if copyright header boilerplate script (%s) exists: %w",
48 boilerplateScript, err,
49 )
50 }
51
52 if !found || forceInstall {
53 if version == "" {
54 log.Printf(
55 "A verify_boilerplate.py version to install was not specified. Using default version: %s",
56 defaultRepoInfraVersion,
57 )
58
59 version = defaultRepoInfraVersion
60 }
61
62 if !strings.HasPrefix(version, "v") {
63 return fmt.Errorf(
64 "repo-infra version (%s) must begin with a 'v'",
65 version,
66 )
67 }
68
69 if _, err := semver.ParseTolerant(version); err != nil {
70 return fmt.Errorf(
71 "%s was not SemVer-compliant. Cannot continue.: %w",
72 version, err,
73 )
74 }
75
76 binDir := filepath.Dir(boilerplateScript)
77 if err := os.MkdirAll(binDir, 0o755); err != nil {
78 return fmt.Errorf("creating binary directory: %w", err)
79 }
80
81 file, err := os.Create(boilerplateScript)
82 if err != nil {
83 return fmt.Errorf("creating file: %w", err)
84 }
85
86 defer file.Close()
87
88 installURL, err := url.Parse(repoInfraURLBase)
89 if err != nil {
90 return fmt.Errorf("parsing URL: %w", err)
91 }
92
93 installURL.Path = path.Join(
94 installURL.Path,
95 version,
96 "hack",
97 "verify_boilerplate.py",
98 )
99
100 installCmd := command.New(
101 "curl",
102 "-sSfL",
103 installURL.String(),
104 "-o",
105 boilerplateScript,
106 )
107
108 err = installCmd.RunSuccess()
109 if err != nil {
110 return fmt.Errorf("installing verify_boilerplate.py: %w", err)
111 }
112 }
113
114 if err := os.Chmod(boilerplateScript, 0o755); err != nil {
115 return fmt.Errorf("making script executable: %w", err)
116 }
117
118 return nil
119 }
120
121
122 func VerifyBoilerplate(version, binDir, boilerplateDir string, forceInstall bool) error {
123 if _, err := kpath.Exists(kpath.CheckSymlinkOnly, boilerplateDir); err != nil {
124 return fmt.Errorf(
125 "checking if copyright header boilerplate directory (%s) exists: %w",
126 boilerplateDir, err,
127 )
128 }
129
130 boilerplateScript := filepath.Join(binDir, "verify_boilerplate.py")
131
132 if err := EnsureBoilerplateScript(version, boilerplateScript, forceInstall); err != nil {
133 return fmt.Errorf("ensuring copyright header script is installed: %w", err)
134 }
135
136 if err := shx.RunV(
137 boilerplateScript,
138 "--boilerplate-dir",
139 boilerplateDir,
140 ); err != nil {
141 return fmt.Errorf("running copyright header checks: %w", err)
142 }
143
144 return nil
145 }
146
View as plain text