49
49
50
50
var (
51
51
skipExtensionFlags skipExtensionFlag
52
+ spdx spdxFlag
52
53
53
54
holder = flag .String ("c" , "Google LLC" , "copyright holder" )
54
55
license = flag .String ("l" , "apache" , "license type: apache, bsd, mit, mpl" )
58
59
checkonly = flag .Bool ("check" , false , "check only mode: verify presence of license headers and exit with non-zero code if missing" )
59
60
)
60
61
62
+ func init () {
63
+ flag .Usage = func () {
64
+ fmt .Fprintln (os .Stderr , helpText )
65
+ flag .PrintDefaults ()
66
+ }
67
+ flag .Var (& skipExtensionFlags , "skip" , "To skip files to check/add the header file, for example: -skip rb -skip go" )
68
+ flag .Var (& spdx , "s" , "Include SPDX identifier in license header. Set -s=only to only include SPDX identifier." )
69
+ }
70
+
61
71
type skipExtensionFlag []string
62
72
63
73
func (i * skipExtensionFlag ) String () string {
@@ -69,41 +79,54 @@ func (i *skipExtensionFlag) Set(value string) error {
69
79
return nil
70
80
}
71
81
72
- func main () {
73
- flag .Usage = func () {
74
- fmt .Fprintln (os .Stderr , helpText )
75
- flag .PrintDefaults ()
82
+ // spdxFlag defines the line flag behavior for specifying SPDX support.
83
+ type spdxFlag string
84
+
85
+ const (
86
+ spdxOff spdxFlag = ""
87
+ spdxOn spdxFlag = "true" // value set by flag package on bool flag
88
+ spdxOnly spdxFlag = "only"
89
+ )
90
+
91
+ // IsBoolFlag causes a bare '-s' flag to be set as the string 'true'. This
92
+ // allows the use of the bare '-s' or setting a string '-s=only'.
93
+ func (i * spdxFlag ) IsBoolFlag () bool { return true }
94
+ func (i * spdxFlag ) String () string { return string (* i ) }
95
+
96
+ func (i * spdxFlag ) Set (value string ) error {
97
+ v := spdxFlag (value )
98
+ if v != spdxOn && v != spdxOnly {
99
+ return fmt .Errorf ("error: flag 's' expects '%v' or '%v'" , spdxOn , spdxOnly )
76
100
}
77
- flag .Var (& skipExtensionFlags , "skip" , "To skip files to check/add the header file, for example: -skip rb -skip go" )
101
+ * i = v
102
+ return nil
103
+ }
104
+
105
+ func main () {
78
106
flag .Parse ()
79
107
if flag .NArg () == 0 {
80
108
flag .Usage ()
81
109
os .Exit (1 )
82
110
}
83
111
84
- data := & copyrightData {
112
+ // map legacy license values
113
+ if t , ok := legacyLicenseTypes [* license ]; ok {
114
+ * license = t
115
+ }
116
+
117
+ data := licenseData {
85
118
Year : * year ,
86
119
Holder : * holder ,
120
+ SPDXID : * license ,
87
121
}
88
122
89
- var t * template.Template
90
- if * licensef != "" {
91
- d , err := ioutil .ReadFile (* licensef )
92
- if err != nil {
93
- log .Printf ("license file: %v" , err )
94
- os .Exit (1 )
95
- }
96
- t , err = template .New ("" ).Parse (string (d ))
97
- if err != nil {
98
- log .Printf ("license file: %v" , err )
99
- os .Exit (1 )
100
- }
101
- } else {
102
- t = licenseTemplate [* license ]
103
- if t == nil {
104
- log .Printf ("unknown license: %s" , * license )
105
- os .Exit (1 )
106
- }
123
+ tpl , err := fetchTemplate (* license , * licensef , spdx )
124
+ if err != nil {
125
+ log .Fatal (err )
126
+ }
127
+ t , err := template .New ("" ).Parse (tpl )
128
+ if err != nil {
129
+ log .Fatal (err )
107
130
}
108
131
109
132
// process at most 1000 files in parallel
@@ -189,7 +212,7 @@ func walk(ch chan<- *file, start string) {
189
212
// addLicense add a license to the file if missing.
190
213
//
191
214
// It returns true if the file was updated.
192
- func addLicense (path string , fmode os.FileMode , tmpl * template.Template , data * copyrightData ) (bool , error ) {
215
+ func addLicense (path string , fmode os.FileMode , tmpl * template.Template , data licenseData ) (bool , error ) {
193
216
var lic []byte
194
217
var err error
195
218
lic , err = licenseHeader (path , tmpl , data )
@@ -227,32 +250,32 @@ func fileHasLicense(path string) (bool, error) {
227
250
return hasLicense (b ) || isGenerated (b ), nil
228
251
}
229
252
230
- func licenseHeader (path string , tmpl * template.Template , data * copyrightData ) ([]byte , error ) {
253
+ func licenseHeader (path string , tmpl * template.Template , data licenseData ) ([]byte , error ) {
231
254
var lic []byte
232
255
var err error
233
256
switch fileExtension (path ) {
234
257
default :
235
258
return nil , nil
236
259
case ".c" , ".h" , ".gv" :
237
- lic , err = prefix (tmpl , data , "/*" , " * " , " */" )
260
+ lic , err = executeTemplate (tmpl , data , "/*" , " * " , " */" )
238
261
case ".js" , ".mjs" , ".cjs" , ".jsx" , ".tsx" , ".css" , ".scss" , ".sass" , ".tf" , ".ts" :
239
- lic , err = prefix (tmpl , data , "/**" , " * " , " */" )
262
+ lic , err = executeTemplate (tmpl , data , "/**" , " * " , " */" )
240
263
case ".cc" , ".cpp" , ".cs" , ".go" , ".hh" , ".hpp" , ".java" , ".m" , ".mm" , ".proto" , ".rs" , ".scala" , ".swift" , ".dart" , ".groovy" , ".kt" , ".kts" , ".v" , ".sv" :
241
- lic , err = prefix (tmpl , data , "" , "// " , "" )
264
+ lic , err = executeTemplate (tmpl , data , "" , "// " , "" )
242
265
case ".py" , ".sh" , ".yaml" , ".yml" , ".dockerfile" , "dockerfile" , ".rb" , "gemfile" , ".tcl" , ".bzl" :
243
- lic , err = prefix (tmpl , data , "" , "# " , "" )
266
+ lic , err = executeTemplate (tmpl , data , "" , "# " , "" )
244
267
case ".el" , ".lisp" :
245
- lic , err = prefix (tmpl , data , "" , ";; " , "" )
268
+ lic , err = executeTemplate (tmpl , data , "" , ";; " , "" )
246
269
case ".erl" :
247
- lic , err = prefix (tmpl , data , "" , "% " , "" )
270
+ lic , err = executeTemplate (tmpl , data , "" , "% " , "" )
248
271
case ".hs" , ".sql" , ".sdl" :
249
- lic , err = prefix (tmpl , data , "" , "-- " , "" )
272
+ lic , err = executeTemplate (tmpl , data , "" , "-- " , "" )
250
273
case ".html" , ".xml" , ".vue" :
251
- lic , err = prefix (tmpl , data , "<!--" , " " , "-->" )
274
+ lic , err = executeTemplate (tmpl , data , "<!--" , " " , "-->" )
252
275
case ".php" :
253
- lic , err = prefix (tmpl , data , "" , "// " , "" )
276
+ lic , err = executeTemplate (tmpl , data , "" , "// " , "" )
254
277
case ".ml" , ".mli" , ".mll" , ".mly" :
255
- lic , err = prefix (tmpl , data , "(**" , " " , "*)" )
278
+ lic , err = executeTemplate (tmpl , data , "(**" , " " , "*)" )
256
279
}
257
280
return lic , err
258
281
}
@@ -308,5 +331,6 @@ func hasLicense(b []byte) bool {
308
331
n = len (b )
309
332
}
310
333
return bytes .Contains (bytes .ToLower (b [:n ]), []byte ("copyright" )) ||
311
- bytes .Contains (bytes .ToLower (b [:n ]), []byte ("mozilla public" ))
334
+ bytes .Contains (bytes .ToLower (b [:n ]), []byte ("mozilla public" )) ||
335
+ bytes .Contains (bytes .ToLower (b [:n ]), []byte ("SPDX-License-Identifier" ))
312
336
}
0 commit comments