package dco import ( "regexp" "strings" "github.com/vbatts/git-validation/git" "github.com/vbatts/git-validation/validate" ) func init() { validate.RegisterRule(DcoRule) } var ( // ValidDCO is the regexp for signed off DCO ValidDCO = regexp.MustCompile(`^Signed-off-by: ([^<]+) <([^<>@]+@[^<>]+)>$`) // DcoRule is the rule being registered DcoRule = validate.Rule{ Name: "DCO", Description: "makes sure the commits are signed", Run: ValidateDCO, Default: true, } ) // ValidateDCO checks that the commit has been signed off, per the DCO process func ValidateDCO(r validate.Rule, c git.CommitEntry) (vr validate.Result) { vr.CommitEntry = c if len(strings.Split(c["parent"], " ")) > 1 { vr.Pass = true vr.Msg = "merge commits do not require DCO" return vr } hasValid := false for _, line := range strings.Split(c["body"], "\n") { if ValidDCO.MatchString(line) { hasValid = true } } if !hasValid { vr.Pass = false vr.Msg = "does not have a valid DCO" } else { vr.Pass = true vr.Msg = "has a valid DCO" } return vr }