podman
118 строк · 2.6 Кб
1package validate2
3import (4"fmt"5"os"6"path/filepath"7
8"github.com/sirupsen/logrus"9"github.com/vbatts/git-validation/git"10)
11
12// Runner is the for processing a set of rules against a range of commits
13type Runner struct {14Root string15Rules []Rule16Results Results
17Verbose bool18CommitRange string // if this is empty, then it will default to FETCH_HEAD, then HEAD19}
20
21// NewRunner returns an initiallized Runner.
22func NewRunner(root string, rules []Rule, commitrange string, verbose bool) (*Runner, error) {23newroot, err := filepath.Abs(root)24if err != nil {25return nil, fmt.Errorf("failed to get absolute path of %q: %s", root, err)26}27if commitrange == "" {28var err error29cwd, err := os.Getwd()30if err != nil {31return nil, err32}33defer func() {34if err := os.Chdir(cwd); err != nil {35logrus.Warnf("changing working directory to %q failed: %s", cwd, err)36}37}()38
39if err := os.Chdir(newroot); err != nil {40return nil, err41}42commitrange, err = git.FetchHeadCommit()43if err != nil {44commitrange, err = git.HeadCommit()45if err != nil {46return nil, err47}48}49}50return &Runner{51Root: newroot,52Rules: rules,53CommitRange: commitrange,54Verbose: verbose,55}, nil56}
57
58// Run processes the rules for each commit in the range provided
59func (r *Runner) Run() error {60cwd, err := os.Getwd()61if err != nil {62return err63}64defer func() {65if err := os.Chdir(cwd); err != nil {66logrus.Warnf("changing working directory to %q failed: %s", cwd, err)67}68}()69
70if err := os.Chdir(r.Root); err != nil {71return err72}73
74// collect the entries75c, err := git.Commits(r.CommitRange)76if err != nil {77return err78}79
80// run them and show results81for _, commit := range c {82if os.Getenv("QUIET") == "" {83fmt.Printf(" * %s %q ... ", commit["abbreviated_commit"], commit["subject"])84}85vr := Commit(commit, r.Rules)86r.Results = append(r.Results, vr...)87_, fail := vr.PassFail()88if os.Getenv("QUIET") != "" {89if fail != 0 {90for _, res := range vr {91if !res.Pass {92fmt.Printf(" %s - FAIL - %s\n", commit["abbreviated_commit"], res.Msg)93}94}95}96// everything else in the loop is printing output.97// If we're quiet, then just continue98continue99}100if fail == 0 {101fmt.Println("PASS")102} else {103fmt.Println("FAIL")104}105for _, res := range vr {106if r.Verbose {107if res.Pass {108fmt.Printf(" - PASS - %s\n", res.Msg)109} else {110fmt.Printf(" - FAIL - %s\n", res.Msg)111}112} else if !res.Pass {113fmt.Printf(" - FAIL - %s\n", res.Msg)114}115}116}117return nil118}
119