diff options
author | Daniel Baumann <daniel@debian.org> | 2024-10-18 20:33:49 +0200 |
---|---|---|
committer | Daniel Baumann <daniel@debian.org> | 2024-12-12 23:57:56 +0100 |
commit | e68b9d00a6e05b3a941f63ffb696f91e554ac5ec (patch) | |
tree | 97775d6c13b0f416af55314eb6a89ef792474615 /build/generate-go-licenses.go | |
parent | Initial commit. (diff) | |
download | forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.tar.xz forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.zip |
Adding upstream version 9.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to '')
-rw-r--r-- | build/generate-go-licenses.go | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/build/generate-go-licenses.go b/build/generate-go-licenses.go new file mode 100644 index 0000000..22ef817 --- /dev/null +++ b/build/generate-go-licenses.go @@ -0,0 +1,132 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//go:build ignore + +package main + +import ( + "encoding/json" + "fmt" + "io/fs" + "os" + "path" + "path/filepath" + "regexp" + "sort" + "strings" + + "code.gitea.io/gitea/modules/container" +) + +// regexp is based on go-license, excluding README and NOTICE +// https://github.com/google/go-licenses/blob/master/licenses/find.go +var licenseRe = regexp.MustCompile(`^(?i)((UN)?LICEN(S|C)E|COPYING).*$`) + +type LicenseEntry struct { + Name string `json:"name"` + Path string `json:"path"` + LicenseText string `json:"licenseText"` +} + +func main() { + if len(os.Args) != 3 { + fmt.Println("usage: go run generate-go-licenses.go <base-dir> <out-json-file>") + os.Exit(1) + } + + base, out := os.Args[1], os.Args[2] + + // Add ext for excluded files because license_test.go will be included for some reason. + // And there are more files that should be excluded, check with: + // + // go run github.com/google/go-licenses@v1.6.0 save . --force --save_path=.go-licenses 2>/dev/null + // find .go-licenses -type f | while read FILE; do echo "${$(basename $FILE)##*.}"; done | sort -u + // AUTHORS + // COPYING + // LICENSE + // Makefile + // NOTICE + // gitignore + // go + // md + // mod + // sum + // toml + // txt + // yml + // + // It could be removed once we have a better regex. + excludedExt := container.SetOf(".gitignore", ".go", ".mod", ".sum", ".toml", ".yml") + + var paths []string + err := filepath.WalkDir(base, func(path string, entry fs.DirEntry, err error) error { + if err != nil { + return err + } + if entry.IsDir() || !licenseRe.MatchString(entry.Name()) || excludedExt.Contains(filepath.Ext(entry.Name())) { + return nil + } + paths = append(paths, path) + return nil + }) + if err != nil { + panic(err) + } + + sort.Strings(paths) + + var entries []LicenseEntry + + { + licenseText, err := os.ReadFile("LICENSE") + if err != nil { + panic(err) + } + + entries = append(entries, LicenseEntry{ + Name: "codeberg.org/forgejo/forgejo", + Path: "codeberg.org/forgejo/forgejo/GPL-3.0-or-later", + LicenseText: string(licenseText), + }) + } + + for _, filePath := range paths { + licenseText, err := os.ReadFile(filePath) + if err != nil { + panic(err) + } + + pkgPath := filepath.ToSlash(filePath) + pkgPath = strings.TrimPrefix(pkgPath, base+"/") + pkgName := path.Dir(pkgPath) + + // There might be a bug somewhere in go-licenses that sometimes interprets the + // root package as "." and sometimes as "code.gitea.io/gitea". Workaround by + // removing both of them for the sake of stable output. + if pkgName == "." || pkgName == "code.gitea.io/gitea" { + continue + } + + entries = append(entries, LicenseEntry{ + Name: pkgName, + Path: pkgPath, + LicenseText: string(licenseText), + }) + } + + jsonBytes, err := json.MarshalIndent(entries, "", " ") + if err != nil { + panic(err) + } + + // Ensure file has a final newline + if jsonBytes[len(jsonBytes)-1] != '\n' { + jsonBytes = append(jsonBytes, '\n') + } + + err = os.WriteFile(out, jsonBytes, 0o644) + if err != nil { + panic(err) + } +} |