diff options
Diffstat (limited to 'modules/repository/license.go')
-rw-r--r-- | modules/repository/license.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/modules/repository/license.go b/modules/repository/license.go new file mode 100644 index 00000000..6ac3547e --- /dev/null +++ b/modules/repository/license.go @@ -0,0 +1,113 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repository + +import ( + "bufio" + "bytes" + "fmt" + "regexp" + "strings" + + "code.gitea.io/gitea/modules/options" +) + +type LicenseValues struct { + Owner string + Email string + Repo string + Year string +} + +func GetLicense(name string, values *LicenseValues) ([]byte, error) { + data, err := options.License(name) + if err != nil { + return nil, fmt.Errorf("GetRepoInitFile[%s]: %w", name, err) + } + return fillLicensePlaceholder(name, values, data), nil +} + +func fillLicensePlaceholder(name string, values *LicenseValues, origin []byte) []byte { + placeholder := getLicensePlaceholder(name) + + scanner := bufio.NewScanner(bytes.NewReader(origin)) + output := bytes.NewBuffer(nil) + for scanner.Scan() { + line := scanner.Text() + if placeholder.MatchLine == nil || placeholder.MatchLine.MatchString(line) { + for _, v := range placeholder.Owner { + line = strings.ReplaceAll(line, v, values.Owner) + } + for _, v := range placeholder.Email { + line = strings.ReplaceAll(line, v, values.Email) + } + for _, v := range placeholder.Repo { + line = strings.ReplaceAll(line, v, values.Repo) + } + for _, v := range placeholder.Year { + line = strings.ReplaceAll(line, v, values.Year) + } + } + output.WriteString(line + "\n") + } + + return output.Bytes() +} + +type licensePlaceholder struct { + Owner []string + Email []string + Repo []string + Year []string + MatchLine *regexp.Regexp +} + +func getLicensePlaceholder(name string) *licensePlaceholder { + // Some universal placeholders. + // If you want to add a new one, make sure you have check it by `grep -r 'NEW_WORD' options/license` and all of them are placeholders. + ret := &licensePlaceholder{ + Owner: []string{ + "<name of author>", + "<owner>", + "[NAME]", + "[name of copyright owner]", + "[name of copyright holder]", + "<COPYRIGHT HOLDERS>", + "<copyright holders>", + "<AUTHOR>", + "<author's name or designee>", + "[one or more legally recognised persons or entities offering the Work under the terms and conditions of this Licence]", + }, + Email: []string{ + "[EMAIL]", + }, + Repo: []string{ + "<program>", + "<one line to give the program's name and a brief idea of what it does.>", + }, + Year: []string{ + "<year>", + "[YEAR]", + "{YEAR}", + "[yyyy]", + "[Year]", + "[year]", + }, + } + + // Some special placeholders for specific licenses. + // It's unsafe to apply them to all licenses. + switch name { + case "0BSD": + return &licensePlaceholder{ + Owner: []string{"AUTHOR"}, + Email: []string{"EMAIL"}, + Year: []string{"YEAR"}, + MatchLine: regexp.MustCompile(`Copyright \(C\) YEAR by AUTHOR EMAIL`), // there is another AUTHOR in the file, but it's not a placeholder + } + + // Other special placeholders can be added here. + } + return ret +} |