go gen improvements (#524)

Remove the "gen" directory and move directives_generate.go out of it.
Add a build ignore tag so it isn't build by default. Cleanup the go gen
invocations so there are not seen as package docs.

Simplify the code a bit and don't run go gen twice.
This commit is contained in:
Miek Gieben 2017-02-14 19:23:18 +00:00 committed by GitHub
parent a5f3cb5fe5
commit 98c86f3f9f
7 changed files with 140 additions and 145 deletions

View file

@ -50,7 +50,7 @@ clean:
.PHONY: gen
gen:
go generate ./core/...
go generate coredns.go
.PHONY: distclean
distclean: clean

View file

@ -1,7 +1,4 @@
// Package core registers the server and all plugins we support.
// Additional middleware packages
//go:generate go run ../gen/directives_generate.go ../middleware.cfg
package core
import (

View file

@ -1,4 +1,3 @@
//go:generate go run ../../gen/directives_generate.go ../../middleware.cfg
package dnsserver
import (

View file

@ -1,7 +1,6 @@
// generated by directives_generate.go; DO NOT EDIT
package dnsserver
// Directives are registered in the order they should be
// executed.
//
@ -11,27 +10,27 @@ package dnsserver
// care what middleware above them are doing.
var directives = []string{
"root",
"bind",
"trace",
"health",
"pprof",
"prometheus",
"errors",
"log",
"chaos",
"cache",
"rewrite",
"loadbalance",
"dnssec",
"file",
"auto",
"secondary",
"etcd",
"kubernetes",
"reverse",
"proxy",
"httpprox",
"whoami",
"erratic",
"root",
"bind",
"trace",
"health",
"pprof",
"prometheus",
"errors",
"log",
"chaos",
"cache",
"rewrite",
"loadbalance",
"dnssec",
"file",
"auto",
"secondary",
"etcd",
"kubernetes",
"reverse",
"proxy",
"httpprox",
"whoami",
"erratic",
}

View file

@ -1,5 +1,7 @@
package main
//go:generate go run directives_generate.go
import "github.com/miekg/coredns/coremain"
func main() {

114
directives_generate.go Normal file
View file

@ -0,0 +1,114 @@
//+build ignore
package main
import (
"bufio"
"go/format"
"io/ioutil"
"log"
"os"
"sort"
"strconv"
"strings"
)
func main() {
mi := make(map[string]string, 0)
md := make(map[int]string, 0)
file, err := os.Open(middlewareFile)
fatalIfErr(err)
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if !strings.HasPrefix(line, `//`) && !strings.HasPrefix(line, "#") {
items := strings.Split(line, ":")
if len(items) == 3 {
if priority, err := strconv.Atoi(items[0]); err == nil {
md[priority] = items[1]
}
if items[2] != "" {
if strings.Contains(items[2], "/") {
mi[items[1]] = items[2]
} else {
mi[items[1]] = middlewarePath + items[2]
}
}
}
}
}
genImports("core/zmiddleware.go", "core", mi)
genDirectives("core/dnsserver/zdirectives.go", "dnsserver", md)
}
func genImports(file, pack string, mi map[string]string) {
outs := header + "package " + pack + "\n\n" + "import ("
if len(mi) > 0 {
outs += "\n"
}
for _, v := range mi {
outs += `_ "` + v + `\` + "\n"
}
outs += ")\n"
res, err := format.Source([]byte(outs))
fatalIfErr(err)
err = ioutil.WriteFile(file, res, 0644)
fatalIfErr(err)
}
func genDirectives(file, pack string, md map[int]string) {
outs := header + "package " + pack + "\n\n"
outs += `
// Directives are registered in the order they should be
// executed.
//
// Ordering is VERY important. Every middleware will
// feel the effects of all other middleware below
// (after) them during a request, but they must not
// care what middleware above them are doing.
var directives = []string{
`
var orders []int
for k := range md {
orders = append(orders, k)
}
sort.Ints(orders)
for _, k := range orders {
outs += `"` + md[k] + `",` + "\n"
}
outs += "}\n"
res, err := format.Source([]byte(outs))
fatalIfErr(err)
err = ioutil.WriteFile(file, res, 0644)
fatalIfErr(err)
}
func fatalIfErr(err error) {
if err != nil {
log.Fatal(err)
}
}
const (
middlewarePath = "github.com/miekg/coredns/middleware/"
middlewareFile = "middleware.cfg"
header = "// generated by directives_generate.go; DO NOT EDIT\n"
)

View file

@ -1,116 +0,0 @@
package main
import (
"bufio"
"io/ioutil"
"os"
"sort"
"strconv"
"strings"
)
var middlewarePath = "github.com/miekg/coredns/middleware/"
var header = "// generated by directives_generate.go; DO NOT EDIT\n"
func main() {
mwFile := os.Args[1]
mi := make(map[string]string, 0)
md := make(map[int]string, 0)
if file, err := os.Open(mwFile); err == nil {
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if !strings.HasPrefix(line, `//`) && !strings.HasPrefix(line, "#") {
items := strings.Split(line, ":")
if len(items) == 3 {
if priority, err := strconv.Atoi(items[0]); err == nil {
md[priority] = items[1]
}
if items[2] != "" {
if strings.Contains(items[2], "/") {
mi[items[1]] = items[2]
} else {
mi[items[1]] = middlewarePath + items[2]
}
}
}
}
}
var orders []int
for k := range md {
orders = append(orders, k)
}
sort.Ints(orders)
if os.Getenv("GOPACKAGE") == "core" {
genImports("zmiddleware.go", mi)
}
if os.Getenv("GOPACKAGE") == "dnsserver" {
genDirectives("zdirectives.go", md)
}
} else {
os.Exit(1)
}
os.Exit(0)
}
func genImports(file string, mi map[string]string) {
outs := header + "package " + os.Getenv("GOPACKAGE") + "\n\n" + "import ("
if len(mi) > 0 {
outs += "\n"
}
for _, v := range mi {
outs += " _ \"" + v + "\"\n"
}
outs += ")\n"
err := ioutil.WriteFile(file, []byte(outs), 0644)
if err != nil {
os.Exit(1)
}
}
func genDirectives(file string, md map[int]string) {
outs := header + "package " + os.Getenv("GOPACKAGE") + "\n\n"
outs += `
// Directives are registered in the order they should be
// executed.
//
// Ordering is VERY important. Every middleware will
// feel the effects of all other middleware below
// (after) them during a request, but they must not
// care what middleware above them are doing.
var directives = []string{
`
var orders []int
for k := range md {
orders = append(orders, k)
}
sort.Ints(orders)
for _, k := range orders {
outs += " \"" + md[k] + "\",\n"
}
outs += "}\n"
err := ioutil.WriteFile(file, []byte(outs), 0644)
if err != nil {
os.Exit(1)
}
}