diff --git a/cmd/sii-missing-classes/go.mod b/cmd/sii-missing-classes/go.mod new file mode 100644 index 0000000..9ddeac6 --- /dev/null +++ b/cmd/sii-missing-classes/go.mod @@ -0,0 +1,12 @@ +module github.com/Luzifer/sii/cmd/sii-missing-classes + +go 1.13 + +replace github.com/Luzifer/sii => ../../ + +require ( + github.com/Luzifer/go_helpers/v2 v2.10.0 + github.com/Luzifer/rconfig/v2 v2.2.1 + github.com/Luzifer/sii v0.0.0-20191211000354-9e3185ab7f66 + github.com/sirupsen/logrus v1.4.2 +) diff --git a/cmd/sii-missing-classes/go.sum b/cmd/sii-missing-classes/go.sum new file mode 100644 index 0000000..ad91385 --- /dev/null +++ b/cmd/sii-missing-classes/go.sum @@ -0,0 +1,25 @@ +github.com/Luzifer/go_helpers/v2 v2.10.0 h1:rA3945P6tH1PKRdcVD+nAdAWojfgwX8wQm/jjUNPmfg= +github.com/Luzifer/go_helpers/v2 v2.10.0/go.mod h1:ZnWxPjyCdQ4rZP3kNiMSUW/7FigU1X9Rz8XopdJ5ZCU= +github.com/Luzifer/rconfig/v2 v2.2.1 h1:zcDdLQlnlzwcBJ8E0WFzOkQE1pCMn3EbX0dFYkeTczg= +github.com/Luzifer/rconfig/v2 v2.2.1/go.mod h1:OKIX0/JRZrPJ/ZXXWklQEFXA6tBfWaljZbW37w+sqBw= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/leekchan/gtf v0.0.0-20190214083521-5fba33c5b00b/go.mod h1:thNruaSwydMhkQ8dXzapABF9Sc1Tz08ZBcDdgott9RA= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/validator.v2 v2.0.0-20180514200540-135c24b11c19 h1:WB265cn5OpO+hK3pikC9hpP1zI/KTwmyMFKloW9eOVc= +gopkg.in/validator.v2 v2.0.0-20180514200540-135c24b11c19/go.mod h1:o4V0GXN9/CAmCsvJ0oXYZvrZOe7syiDZSN1GWGZTGzc= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/cmd/sii-missing-classes/main.go b/cmd/sii-missing-classes/main.go new file mode 100644 index 0000000..a01a0e2 --- /dev/null +++ b/cmd/sii-missing-classes/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "fmt" + "os" + "reflect" + "sort" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/Luzifer/go_helpers/v2/str" + "github.com/Luzifer/sii" + + "github.com/Luzifer/rconfig/v2" +) + +var ( + cfg = struct { + LogLevel string `flag:"log-level" default:"info" description:"Log level (debug, info, warn, error, fatal)"` + VersionAndExit bool `flag:"version" default:"false" description:"Prints current version and exits"` + }{} + + version = "dev" +) + +func init() { + if err := rconfig.ParseAndValidate(&cfg); err != nil { + log.Fatalf("Unable to parse commandline options: %s", err) + } + + if cfg.VersionAndExit { + fmt.Printf("sii-missing-blocks %s\n", version) + os.Exit(0) + } + + if l, err := log.ParseLevel(cfg.LogLevel); err != nil { + log.WithError(err).Fatal("Unable to parse log level") + } else { + log.SetLevel(l) + } +} + +func main() { + if len(rconfig.Args()) != 2 { + log.Fatal("Missing filename to analyze") + } + + filename := rconfig.Args()[1] + + log.WithField("filename", filename).Info("Loading file") + unit, err := sii.ReadUnitFile(filename) + if err != nil { + log.Fatalf("Unable to parse input file: %s", err) + } + + var unknownClasses []string + + for _, e := range unit.Entries { + if reflect.TypeOf(e).Elem() == reflect.TypeOf(sii.RawBlock{}) { + log.WithFields(log.Fields{ + "class": e.Class(), + "name": e.Name(), + }).Debug("Found raw block") + + if !str.StringInSlice(e.Class(), unknownClasses) { + unknownClasses = append(unknownClasses, e.Class()) + } + } + } + + if len(unknownClasses) == 0 { + log.Info("No unknown classes found") + return + } + + sort.Strings(unknownClasses) + + log.WithField("count", len(unknownClasses)).Info("Found unknown classes") + + fmt.Println(strings.Join(unknownClasses, "\n")) +}