hook/types.go
package hook
import (
"errors"
"fmt"
"livingit.de/code/git-commit/hook/config"
v2 "livingit.de/code/git-commit/hook/v2"
"livingit.de/code/go-hookhelper"
"livingit.de/code/versioned"
)
type (
// Validator defines which methods must be runnable
Validator interface {
Validate(commitMessage []string) (bool, error)
}
)
// NewForVersion returns a hook implementation
func NewForVersion(commitMessageFile string) (Validator, error) {
version, err := getVersion(commitMessageFile)
if err != nil {
return nil, err
}
switch version {
case "1":
return nil, errors.New("v1 is removed from utility")
case "2":
return v2.LoadConfig()
case "":
return v2.LoadConfig()
}
return nil, fmt.Errorf("no version %s known", version)
}
// getVersion reads the version of global and local configuration
// and returns the version after some validations
func getVersion(commitMessageFile string) (string, error) {
global, globalVersion, err := getGlobalVersion()
if err != nil {
return "", err
}
local, localVersion, err := getLocalVersion(commitMessageFile)
if err != nil {
return "", err
}
return hookhelper.OptimisticVersion(global, local, globalVersion, localVersion)
}
// getLocalVersion returns version data from project configuration
// file
func getLocalVersion(commitMessageFile string) ([]byte, string, error) {
v := versioned.NewVersionReader()
local, err := config.LoadProjectConfigFileContent(commitMessageFile)
if err != nil {
return nil, "", err
}
if nil != local {
localVersion, err := v.YAML.GetVersion(local)
if err != nil {
return local, "", err
}
return local, localVersion, nil
}
return nil, "", nil
}
// getGlobalVersion returns version data from global configuration
// file
func getGlobalVersion() ([]byte, string, error) {
v := versioned.NewVersionReader()
global, err := config.LoadGlobalConfigFileContent()
if err != nil {
return nil, "", err
}
if nil != global {
version, err := v.YAML.GetVersion(global)
return global, version, err
}
return nil, "", nil
}