custom license from file

This commit is contained in:
Brad Rydzewski
2017-12-07 16:03:18 -08:00
committed by Jacob McCann
parent 486fb589fd
commit c63d25f5fc
2 changed files with 38 additions and 21 deletions

44
main.go
View File

@@ -20,6 +20,7 @@ import (
"bytes" "bytes"
"flag" "flag"
"fmt" "fmt"
"html/template"
"io/ioutil" "io/ioutil"
"log" "log"
"os" "os"
@@ -46,6 +47,7 @@ Flags:
var ( var (
holder = flag.String("c", "Google LLC", "copyright holder") holder = flag.String("c", "Google LLC", "copyright holder")
license = flag.String("l", "apache", "license type: apache, bsd, mit") license = flag.String("l", "apache", "license type: apache, bsd, mit")
licensef = flag.String("f", "", "license file")
year = flag.Int("y", time.Now().Year(), "year") year = flag.Int("y", time.Now().Year(), "year")
) )
@@ -65,6 +67,26 @@ func main() {
Holder: *holder, Holder: *holder,
} }
var t *template.Template
if *licensef != "" {
d, err := ioutil.ReadFile(*licensef)
if err != nil {
log.Printf("template error: %s", err)
os.Exit(1)
}
t, err = template.New("").Parse(string(d))
if err != nil {
log.Printf("template error: %s", err)
os.Exit(1)
}
} else {
t = licenseTemplate[*license]
if t == nil {
log.Printf("unknown license: %s", *license)
os.Exit(1)
}
}
// process at most 1000 files in parallel // process at most 1000 files in parallel
ch := make(chan *file, 1000) ch := make(chan *file, 1000)
done := make(chan struct{}) done := make(chan struct{})
@@ -73,7 +95,7 @@ func main() {
for f := range ch { for f := range ch {
wg.Add(1) wg.Add(1)
go func(f *file) { go func(f *file) {
err := addLicense(f.path, f.mode, *license, data) err := addLicense(f.path, f.mode, t, data)
if err != nil { if err != nil {
log.Printf("%s: %v", f.path, err) log.Printf("%s: %v", f.path, err)
} }
@@ -110,30 +132,30 @@ func walk(ch chan<- *file, start string) {
}) })
} }
func addLicense(path string, fmode os.FileMode, typ string, data *copyrightData) error { func addLicense(path string, fmode os.FileMode, tmpl *template.Template, data *copyrightData) error {
var lic []byte var lic []byte
var err error var err error
switch filepath.Ext(path) { switch filepath.Ext(path) {
default: default:
return nil return nil
case ".c", ".h": case ".c", ".h":
lic, err = prefix(typ, data, "/*", " * ", " */") lic, err = prefix(tmpl, data, "/*", " * ", " */")
case ".js", ".jsx", ".tsx", ".css", ".tf": case ".js", ".jsx", ".tsx", ".css", ".tf":
lic, err = prefix(typ, data, "/**", " * ", " */") lic, err = prefix(tmpl, data, "/**", " * ", " */")
case ".cc", ".cpp", ".cs", ".go", ".hh", ".hpp", ".java", ".m", ".mm", ".proto", ".rs", ".scala", ".swift", ".dart": case ".cc", ".cpp", ".cs", ".go", ".hh", ".hpp", ".java", ".m", ".mm", ".proto", ".rs", ".scala", ".swift", ".dart":
lic, err = prefix(typ, data, "", "// ", "") lic, err = prefix(tmpl, data, "", "// ", "")
case ".py", ".sh", ".yaml", ".yml": case ".py", ".sh", ".yaml", ".yml":
lic, err = prefix(typ, data, "", "# ", "") lic, err = prefix(tmpl, data, "", "# ", "")
case ".el", ".lisp": case ".el", ".lisp":
lic, err = prefix(typ, data, "", ";; ", "") lic, err = prefix(tmpl, data, "", ";; ", "")
case ".erl": case ".erl":
lic, err = prefix(typ, data, "", "% ", "") lic, err = prefix(tmpl, data, "", "% ", "")
case ".hs", ".sql": case ".hs", ".sql":
lic, err = prefix(typ, data, "", "-- ", "") lic, err = prefix(tmpl, data, "", "-- ", "")
case ".html", ".xml": case ".html", ".xml":
lic, err = prefix(typ, data, "<!--", " ", "-->") lic, err = prefix(tmpl, data, "<!--", " ", "-->")
case ".php": case ".php":
lic, err = prefix(typ, data, "<?php", "// ", "?>") lic, err = prefix(tmpl, data, "<?php", "// ", "?>")
} }
if err != nil || lic == nil { if err != nil || lic == nil {
return err return err

View File

@@ -36,14 +36,9 @@ type copyrightData struct {
Holder string Holder string
} }
// prefix will execute a license template l with data d // prefix will execute a license template t with data d
// and prefix the result with top, middle and bottom. // and prefix the result with top, middle and bottom.
func prefix(l string, d *copyrightData, top, mid, bot string) ([]byte, error) { func prefix(t *template.Template, d *copyrightData, top, mid, bot string) ([]byte, error) {
t := licenseTemplate[l]
if t == nil {
return nil, fmt.Errorf("unknown license: %s", l)
}
var buf bytes.Buffer var buf bytes.Buffer
if err := t.Execute(&buf, d); err != nil { if err := t.Execute(&buf, d); err != nil {
return nil, err return nil, err