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