OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / golang.org / x / text / internal / testtext / codesize.go
diff --git a/vendor/golang.org/x/text/internal/testtext/codesize.go b/vendor/golang.org/x/text/internal/testtext/codesize.go
new file mode 100644 (file)
index 0000000..5fc5eae
--- /dev/null
@@ -0,0 +1,53 @@
+// 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.
+
+package testtext
+
+import (
+       "bytes"
+       "fmt"
+       "io/ioutil"
+       "os"
+       "os/exec"
+       "path/filepath"
+       "runtime"
+)
+
+// CodeSize builds the given code sample and returns the binary size or en error
+// if an error occurred. The code sample typically will look like this:
+//     package main
+//     import "golang.org/x/text/somepackage"
+//     func main() {
+//         somepackage.Func() // reference Func to cause it to be linked in.
+//     }
+// See dict_test.go in the display package for an example.
+func CodeSize(s string) (int, error) {
+       // Write the file.
+       tmpdir, err := ioutil.TempDir(os.TempDir(), "testtext")
+       if err != nil {
+               return 0, fmt.Errorf("testtext: failed to create tmpdir: %v", err)
+       }
+       defer os.RemoveAll(tmpdir)
+       filename := filepath.Join(tmpdir, "main.go")
+       if err := ioutil.WriteFile(filename, []byte(s), 0644); err != nil {
+               return 0, fmt.Errorf("testtext: failed to write main.go: %v", err)
+       }
+
+       // Build the binary.
+       w := &bytes.Buffer{}
+       cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), "build", "-o", "main")
+       cmd.Dir = tmpdir
+       cmd.Stderr = w
+       cmd.Stdout = w
+       if err := cmd.Run(); err != nil {
+               return 0, fmt.Errorf("testtext: failed to execute command: %v\nmain.go:\n%vErrors:%s", err, s, w)
+       }
+
+       // Determine the size.
+       fi, err := os.Stat(filepath.Join(tmpdir, "main"))
+       if err != nil {
+               return 0, fmt.Errorf("testtext: failed to get file info: %v", err)
+       }
+       return int(fi.Size()), nil
+}