1package main 2 3import ( 4 "encoding/json" 5 "flag" 6 "io/ioutil" 7 "log" 8 "os" 9 "os/exec" 10 "path/filepath" 11 "text/template" 12) 13 14var ( 15 sourcePath = flag.String("source", "", "directory path containing license files") 16 tmplPath = flag.String("template", "", "file path to notice template") 17) 18 19type license struct { 20 Filename string 21 Path string 22 Text string 23} 24 25func main() { 26 flag.Parse() 27 28 if *sourcePath == "" || *tmplPath == "" { 29 log.Fatal("must provide flags 'source' and 'template'") 30 } 31 32 tmpl, err := template.ParseFiles(*tmplPath) 33 if err != nil { 34 log.Fatal(err) 35 } 36 37 var licenses []license 38 39 data, err := exec.Command("go", "mod", "edit", "-json").Output() 40 if err != nil { 41 log.Fatal(err) 42 } 43 var modInfo = struct { 44 Module struct { 45 Path string 46 } 47 }{} 48 if err := json.Unmarshal(data, &modInfo); err != nil { 49 log.Fatal(err) 50 } 51 52 if err := filepath.Walk(*sourcePath, func(path string, info os.FileInfo, err error) error { 53 if err != nil { 54 return err 55 } 56 if info.IsDir() { 57 return nil 58 } 59 60 p, err := filepath.Rel(*sourcePath, filepath.Dir(path)) 61 if err != nil { 62 log.Fatal(err) 63 } 64 65 if p == modInfo.Module.Path { 66 return nil 67 } 68 69 t, err := ioutil.ReadFile(path) 70 if err != nil { 71 log.Fatal(err) 72 } 73 74 licenses = append(licenses, license{ 75 Filename: filepath.Base(path), 76 Path: p, 77 Text: string(t), 78 }) 79 80 return nil 81 }); err != nil { 82 log.Fatal(err) 83 } 84 85 if err := tmpl.Execute(os.Stdout, licenses); err != nil { 86 log.Fatal(err) 87 } 88} 89