spf13--cobra/cobra/cmd/licenses.go

121 lines
3.3 KiB
Go
Raw Normal View History

// Copyright © 2021 Steve Francia <spf@spf13.com>.
2015-10-28 16:51:48 +00:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Parts inspired by https://github.com/ryanuber/go-license
package cmd
import (
"fmt"
"strings"
"time"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
2015-10-28 16:51:48 +00:00
2017-04-29 12:53:52 +00:00
// Licenses contains all possible licenses a user can choose from.
var Licenses = make(map[string]License)
2015-10-28 16:51:48 +00:00
2017-04-29 12:53:52 +00:00
// License represents a software license agreement, containing the Name of
// the license, its possible matches (on the command line as given to cobra),
2015-11-23 09:39:02 +00:00
// the header to be used with each file on the file's creating, and the text
// of the license
2015-10-28 16:51:48 +00:00
type License struct {
Name string // The type of license in use
PossibleMatches []string // Similar names to guess
Text string // License text data
Header string // License header for source files
}
func init() {
// Allows a user to not use a license.
Licenses["none"] = License{"None", []string{"none", "false"}, "", ""}
2017-04-20 15:34:10 +00:00
initApache2()
initMit()
initBsdClause3()
initBsdClause2()
initGpl2()
initGpl3()
2017-04-20 18:46:09 +00:00
initLgpl()
2017-04-20 18:48:21 +00:00
initAgpl()
2015-10-28 16:51:48 +00:00
}
2017-04-29 12:53:52 +00:00
// getLicense returns license specified by user in flag or in config.
// If user didn't specify the license, it returns none
2017-04-29 12:53:52 +00:00
//
2017-04-29 10:02:02 +00:00
// TODO: Inspect project for existing license
func getLicense() License {
2017-04-29 10:02:02 +00:00
// If explicitly flagged, use that.
if userLicense != "" {
2017-04-29 10:02:02 +00:00
return findLicense(userLicense)
}
2017-04-29 10:02:02 +00:00
// If user wants to have custom license, use that.
if viper.IsSet("license.header") || viper.IsSet("license.text") {
2017-04-29 10:02:02 +00:00
return License{Header: viper.GetString("license.header"),
Text: viper.GetString("license.text")}
2017-04-29 10:02:02 +00:00
}
// If user wants to have built-in license, use that.
if viper.IsSet("license") {
return findLicense(viper.GetString("license"))
}
// If user didn't set any license, use none by default
return Licenses["none"]
}
func copyrightLine() string {
author := viper.GetString("author")
2017-07-30 15:14:01 +00:00
year := viper.GetString("year") // For tests.
if year == "" {
year = time.Now().Format("2006")
}
return "Copyright © " + year + " " + author
}
2017-04-29 12:53:52 +00:00
// findLicense looks for License object of built-in licenses.
// If it didn't find license, then the app will be terminated and
// error will be printed.
2017-04-29 10:02:02 +00:00
func findLicense(name string) License {
found := matchLicense(name)
if found == "" {
cobra.CheckErr(fmt.Errorf("unknown license: " + name))
2017-04-29 10:02:02 +00:00
}
return Licenses[found]
}
2017-04-29 12:53:52 +00:00
// matchLicense compares the given a license name
// to PossibleMatches of all built-in licenses.
// It returns blank string, if name is blank string or it didn't find
// then appropriate match to name.
2017-04-29 10:02:02 +00:00
func matchLicense(name string) string {
if name == "" {
return ""
}
for key, lic := range Licenses {
for _, match := range lic.PossibleMatches {
2017-04-29 10:02:02 +00:00
if strings.EqualFold(name, match) {
return key
}
}
}
2017-04-29 10:02:02 +00:00
return ""
}