289b30715d
This commit converts the dependency management from Godeps to the vendor folder, also switching the tool from godep to trash. Since the upstream tool lacks a few features proposed via a few PRs, until those PRs are merged in (if), use github.com/karalabe/trash. You can update dependencies via trash --update. All dependencies have been updated to their latest version. Parts of the build system are reworked to drop old notions of Godeps and invocation of the go vet command so that it doesn't run against the vendor folder, as that will just blow up during vetting. The conversion drops OpenCL (and hence GPU mining support) from ethash and our codebase. The short reasoning is that there's noone to maintain and having opencl libs in our deps messes up builds as go install ./... tries to build them, failing with unsatisfied link errors for the C OpenCL deps. golang.org/x/net/context is not vendored in. We expect it to be fetched by the user (i.e. using go get). To keep ci.go builds reproducible the package is "vendored" in build/_vendor.
163 lines
4.4 KiB
Go
163 lines
4.4 KiB
Go
// Copyright 2015 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
|
|
|
|
// This file generates derivative tables based on the language package itself.
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"reflect"
|
|
"sort"
|
|
"strings"
|
|
|
|
"golang.org/x/text/internal/gen"
|
|
"golang.org/x/text/language"
|
|
"golang.org/x/text/unicode/cldr"
|
|
)
|
|
|
|
var (
|
|
test = flag.Bool("test", false,
|
|
"test existing tables; can be used to compare web data with package data.")
|
|
|
|
draft = flag.String("draft",
|
|
"contributed",
|
|
`Minimal draft requirements (approved, contributed, provisional, unconfirmed).`)
|
|
)
|
|
|
|
func main() {
|
|
gen.Init()
|
|
|
|
// Read the CLDR zip file.
|
|
r := gen.OpenCLDRCoreZip()
|
|
defer r.Close()
|
|
|
|
d := &cldr.Decoder{}
|
|
data, err := d.DecodeZip(r)
|
|
if err != nil {
|
|
log.Fatalf("DecodeZip: %v", err)
|
|
}
|
|
|
|
w := gen.NewCodeWriter()
|
|
defer func() {
|
|
buf := &bytes.Buffer{}
|
|
|
|
if _, err = w.WriteGo(buf, "language"); err != nil {
|
|
log.Fatalf("Error formatting file index.go: %v", err)
|
|
}
|
|
|
|
// Since we're generating a table for our own package we need to rewrite
|
|
// doing the equivalent of go fmt -r 'language.b -> b'. Using
|
|
// bytes.Replace will do.
|
|
out := bytes.Replace(buf.Bytes(), []byte("language."), nil, -1)
|
|
if err := ioutil.WriteFile("index.go", out, 0600); err != nil {
|
|
log.Fatalf("Could not create file index.go: %v", err)
|
|
}
|
|
}()
|
|
|
|
m := map[language.Tag]bool{}
|
|
for _, lang := range data.Locales() {
|
|
// We include all locales unconditionally to be consistent with en_US.
|
|
// We want en_US, even though it has no data associated with it.
|
|
|
|
// TODO: put any of the languages for which no data exists at the end
|
|
// of the index. This allows all components based on ICU to use that
|
|
// as the cutoff point.
|
|
// if x := data.RawLDML(lang); false ||
|
|
// x.LocaleDisplayNames != nil ||
|
|
// x.Characters != nil ||
|
|
// x.Delimiters != nil ||
|
|
// x.Measurement != nil ||
|
|
// x.Dates != nil ||
|
|
// x.Numbers != nil ||
|
|
// x.Units != nil ||
|
|
// x.ListPatterns != nil ||
|
|
// x.Collations != nil ||
|
|
// x.Segmentations != nil ||
|
|
// x.Rbnf != nil ||
|
|
// x.Annotations != nil ||
|
|
// x.Metadata != nil {
|
|
|
|
// TODO: support POSIX natively, albeit non-standard.
|
|
tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1))
|
|
m[tag] = true
|
|
// }
|
|
}
|
|
// Include locales for plural rules, which uses a different structure.
|
|
for _, plurals := range data.Supplemental().Plurals {
|
|
for _, rules := range plurals.PluralRules {
|
|
for _, lang := range strings.Split(rules.Locales, " ") {
|
|
m[language.Make(lang)] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
var core, special []language.Tag
|
|
|
|
for t := range m {
|
|
if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" {
|
|
log.Fatalf("Unexpected extension %v in %v", x, t)
|
|
}
|
|
if len(t.Variants()) == 0 && len(t.Extensions()) == 0 {
|
|
core = append(core, t)
|
|
} else {
|
|
special = append(special, t)
|
|
}
|
|
}
|
|
|
|
w.WriteComment(`
|
|
NumCompactTags is the number of common tags. The maximum tag is
|
|
NumCompactTags-1.`)
|
|
w.WriteConst("NumCompactTags", len(core)+len(special))
|
|
|
|
sort.Sort(byAlpha(special))
|
|
w.WriteVar("specialTags", special)
|
|
|
|
// TODO: order by frequency?
|
|
sort.Sort(byAlpha(core))
|
|
|
|
// Size computations are just an estimate.
|
|
w.Size += int(reflect.TypeOf(map[uint32]uint16{}).Size())
|
|
w.Size += len(core) * 6 // size of uint32 and uint16
|
|
|
|
fmt.Fprintln(w)
|
|
fmt.Fprintln(w, "var coreTags = map[uint32]uint16{")
|
|
fmt.Fprintln(w, "0x0: 0, // und")
|
|
i := len(special) + 1 // Und and special tags already written.
|
|
for _, t := range core {
|
|
if t == language.Und {
|
|
continue
|
|
}
|
|
fmt.Fprint(w.Hash, t, i)
|
|
b, s, r := t.Raw()
|
|
fmt.Fprintf(w, "0x%s%s%s: %d, // %s\n",
|
|
getIndex(b, 3), // 3 is enough as it is guaranteed to be a compact number
|
|
getIndex(s, 2),
|
|
getIndex(r, 3),
|
|
i, t)
|
|
i++
|
|
}
|
|
fmt.Fprintln(w, "}")
|
|
}
|
|
|
|
// getIndex prints the subtag type and extracts its index of size nibble.
|
|
// If the index is less than n nibbles, the result is prefixed with 0s.
|
|
func getIndex(x interface{}, n int) string {
|
|
s := fmt.Sprintf("%#v", x) // s is of form Type{typeID: 0x00}
|
|
s = s[strings.Index(s, "0x")+2 : len(s)-1]
|
|
return strings.Repeat("0", n-len(s)) + s
|
|
}
|
|
|
|
type byAlpha []language.Tag
|
|
|
|
func (a byAlpha) Len() int { return len(a) }
|
|
func (a byAlpha) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
func (a byAlpha) Less(i, j int) bool { return a[i].String() < a[j].String() }
|