mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2025-01-09 18:40:17 +01:00
125 lines
2.5 KiB
Go
125 lines
2.5 KiB
Go
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// +build ignore
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"flag"
|
||
|
"go/format"
|
||
|
"io/ioutil"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"strings"
|
||
|
"text/template"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
goRepoPath = 1 << iota
|
||
|
packagePath
|
||
|
)
|
||
|
|
||
|
var tmpl = template.Must(template.New("").Parse(`// Created by go generate; DO NOT EDIT
|
||
|
// Copyright 2014 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package gosrc
|
||
|
|
||
|
const (
|
||
|
goRepoPath = {{.goRepoPath}}
|
||
|
packagePath = {{.packagePath}}
|
||
|
)
|
||
|
|
||
|
var pathFlags = map[string]int{
|
||
|
{{range $k, $v := .pathFlags}}{{printf "%q" $k}}: {{$v}},
|
||
|
{{end}} }
|
||
|
|
||
|
var validTLDs = map[string]bool{
|
||
|
{{range $v := .validTLDs}}{{printf "%q" $v}}: true,
|
||
|
{{end}} }
|
||
|
`))
|
||
|
|
||
|
var output = flag.String("output", "data.go", "file name to write")
|
||
|
|
||
|
func main() {
|
||
|
log.SetFlags(0)
|
||
|
log.SetPrefix("gen: ")
|
||
|
flag.Parse()
|
||
|
if flag.NArg() != 0 {
|
||
|
log.Fatal("usage: decgen [--output filename]")
|
||
|
}
|
||
|
|
||
|
// Build map of standard repository path flags.
|
||
|
|
||
|
cmd := exec.Command("go", "list", "std", "cmd")
|
||
|
p, err := cmd.Output()
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
pathFlags := map[string]int{
|
||
|
"builtin": packagePath | goRepoPath,
|
||
|
"C": packagePath,
|
||
|
}
|
||
|
for _, path := range strings.Fields(string(p)) {
|
||
|
pathFlags[path] |= packagePath | goRepoPath
|
||
|
for {
|
||
|
i := strings.LastIndex(path, "/")
|
||
|
if i < 0 {
|
||
|
break
|
||
|
}
|
||
|
path = path[:i]
|
||
|
pathFlags[path] |= goRepoPath
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Get list of valid TLDs.
|
||
|
|
||
|
resp, err := http.Get("https://data.iana.org/TLD/tlds-alpha-by-domain.txt")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
p, err = ioutil.ReadAll(resp.Body)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
|
||
|
var validTLDs []string
|
||
|
for _, line := range strings.Split(string(p), "\n") {
|
||
|
line = strings.TrimSpace(line)
|
||
|
if len(line) == 0 || line[0] == '#' {
|
||
|
continue
|
||
|
}
|
||
|
validTLDs = append(validTLDs, "."+strings.ToLower(line))
|
||
|
}
|
||
|
|
||
|
// Generate output.
|
||
|
|
||
|
var buf bytes.Buffer
|
||
|
err = tmpl.Execute(&buf, map[string]interface{}{
|
||
|
"output": *output,
|
||
|
"goRepoPath": goRepoPath,
|
||
|
"packagePath": packagePath,
|
||
|
"pathFlags": pathFlags,
|
||
|
"validTLDs": validTLDs,
|
||
|
})
|
||
|
if err != nil {
|
||
|
log.Fatal("template error:", err)
|
||
|
}
|
||
|
source, err := format.Source(buf.Bytes())
|
||
|
if err != nil {
|
||
|
log.Fatal("source format error:", err)
|
||
|
}
|
||
|
fd, err := os.Create(*output)
|
||
|
_, err = fd.Write(source)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|