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