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