refactor template parsing logic
Move the logic for selecting a license template based on user input into a standalone func (fetchTemplate), and add test cases for all code paths. Delay parsing predefined license templates. This allows the new fetchTemplate method to modify these templates before returning in the future (to add SPDX license information). Add tests to ensure that these templates must always parse properly. Rename copyrightData type to licenseData, since we will soon begin to add more than just copyright data here (SPDX ID). Rename prefix func to executeTemplate, since this better describes what the function is doing. These are all refactoring and cleanup changes; no behavioral changes.
This commit is contained in:
64
main.go
64
main.go
@@ -58,6 +58,14 @@ var (
|
||||
checkonly = flag.Bool("check", false, "check only mode: verify presence of license headers and exit with non-zero code if missing")
|
||||
)
|
||||
|
||||
func init() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintln(os.Stderr, helpText)
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
flag.Var(&skipExtensionFlags, "skip", "To skip files to check/add the header file, for example: -skip rb -skip go")
|
||||
}
|
||||
|
||||
type skipExtensionFlag []string
|
||||
|
||||
func (i *skipExtensionFlag) String() string {
|
||||
@@ -70,40 +78,24 @@ func (i *skipExtensionFlag) Set(value string) error {
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintln(os.Stderr, helpText)
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
flag.Var(&skipExtensionFlags, "skip", "To skip files to check/add the header file, for example: -skip rb -skip go")
|
||||
flag.Parse()
|
||||
if flag.NArg() == 0 {
|
||||
flag.Usage()
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
data := ©rightData{
|
||||
data := licenseData{
|
||||
Year: *year,
|
||||
Holder: *holder,
|
||||
}
|
||||
|
||||
var t *template.Template
|
||||
if *licensef != "" {
|
||||
d, err := ioutil.ReadFile(*licensef)
|
||||
if err != nil {
|
||||
log.Printf("license file: %v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
t, err = template.New("").Parse(string(d))
|
||||
if err != nil {
|
||||
log.Printf("license file: %v", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
} else {
|
||||
t = licenseTemplate[*license]
|
||||
if t == nil {
|
||||
log.Printf("unknown license: %s", *license)
|
||||
os.Exit(1)
|
||||
}
|
||||
tpl, err := fetchTemplate(*license, *licensef)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
t, err := template.New("").Parse(tpl)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// process at most 1000 files in parallel
|
||||
@@ -189,7 +181,7 @@ func walk(ch chan<- *file, start string) {
|
||||
// addLicense add a license to the file if missing.
|
||||
//
|
||||
// It returns true if the file was updated.
|
||||
func addLicense(path string, fmode os.FileMode, tmpl *template.Template, data *copyrightData) (bool, error) {
|
||||
func addLicense(path string, fmode os.FileMode, tmpl *template.Template, data licenseData) (bool, error) {
|
||||
var lic []byte
|
||||
var err error
|
||||
lic, err = licenseHeader(path, tmpl, data)
|
||||
@@ -227,32 +219,32 @@ func fileHasLicense(path string) (bool, error) {
|
||||
return hasLicense(b) || isGenerated(b), nil
|
||||
}
|
||||
|
||||
func licenseHeader(path string, tmpl *template.Template, data *copyrightData) ([]byte, error) {
|
||||
func licenseHeader(path string, tmpl *template.Template, data licenseData) ([]byte, error) {
|
||||
var lic []byte
|
||||
var err error
|
||||
switch fileExtension(path) {
|
||||
default:
|
||||
return nil, nil
|
||||
case ".c", ".h", ".gv":
|
||||
lic, err = prefix(tmpl, data, "/*", " * ", " */")
|
||||
lic, err = executeTemplate(tmpl, data, "/*", " * ", " */")
|
||||
case ".js", ".mjs", ".cjs", ".jsx", ".tsx", ".css", ".scss", ".sass", ".tf", ".ts":
|
||||
lic, err = prefix(tmpl, data, "/**", " * ", " */")
|
||||
lic, err = executeTemplate(tmpl, data, "/**", " * ", " */")
|
||||
case ".cc", ".cpp", ".cs", ".go", ".hh", ".hpp", ".java", ".m", ".mm", ".proto", ".rs", ".scala", ".swift", ".dart", ".groovy", ".kt", ".kts", ".v", ".sv":
|
||||
lic, err = prefix(tmpl, data, "", "// ", "")
|
||||
lic, err = executeTemplate(tmpl, data, "", "// ", "")
|
||||
case ".py", ".sh", ".yaml", ".yml", ".dockerfile", "dockerfile", ".rb", "gemfile", ".tcl", ".bzl":
|
||||
lic, err = prefix(tmpl, data, "", "# ", "")
|
||||
lic, err = executeTemplate(tmpl, data, "", "# ", "")
|
||||
case ".el", ".lisp":
|
||||
lic, err = prefix(tmpl, data, "", ";; ", "")
|
||||
lic, err = executeTemplate(tmpl, data, "", ";; ", "")
|
||||
case ".erl":
|
||||
lic, err = prefix(tmpl, data, "", "% ", "")
|
||||
lic, err = executeTemplate(tmpl, data, "", "% ", "")
|
||||
case ".hs", ".sql", ".sdl":
|
||||
lic, err = prefix(tmpl, data, "", "-- ", "")
|
||||
lic, err = executeTemplate(tmpl, data, "", "-- ", "")
|
||||
case ".html", ".xml", ".vue":
|
||||
lic, err = prefix(tmpl, data, "<!--", " ", "-->")
|
||||
lic, err = executeTemplate(tmpl, data, "<!--", " ", "-->")
|
||||
case ".php":
|
||||
lic, err = prefix(tmpl, data, "", "// ", "")
|
||||
lic, err = executeTemplate(tmpl, data, "", "// ", "")
|
||||
case ".ml", ".mli", ".mll", ".mly":
|
||||
lic, err = prefix(tmpl, data, "(**", " ", "*)")
|
||||
lic, err = executeTemplate(tmpl, data, "(**", " ", "*)")
|
||||
}
|
||||
return lic, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user