2023-05-05 16:46:17 +03:00
// 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"
)
2023-09-06 15:08:51 +03:00
type LicenseValues struct {
2023-05-05 16:46:17 +03:00
Owner string
Email string
Repo string
Year string
}
2023-09-06 15:08:51 +03:00
func GetLicense ( name string , values * LicenseValues ) ( [ ] byte , error ) {
2023-05-05 16:46:17 +03:00
data , err := options . License ( name )
if err != nil {
return nil , fmt . Errorf ( "GetRepoInitFile[%s]: %w" , name , err )
}
return fillLicensePlaceholder ( name , values , data ) , nil
}
2023-09-06 15:08:51 +03:00
func fillLicensePlaceholder ( name string , values * LicenseValues , origin [ ] byte ) [ ] byte {
2023-05-05 16:46:17 +03:00
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.
2024-07-17 20:19:36 +03:00
if name == "0BSD" {
2023-05-05 16:46:17 +03:00
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
}