mirror of
https://github.com/miniflux/v2.git
synced 2024-09-09 20:59:48 +02:00
54 lines
1.5 KiB
Go
54 lines
1.5 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.
|
||
|
|
||
|
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
|
||
|
}
|