summaryrefslogtreecommitdiff
path: root/build.go
diff options
context:
space:
mode:
authorAlexander Neumann <alexander@bumpern.de>2015-08-19 20:11:48 +0200
committerAlexander Neumann <alexander@bumpern.de>2015-08-19 20:24:52 +0200
commit59751645be1a90f0ecf6fe3c66454a4776c55446 (patch)
tree428b7852acf03448257477ff8140b737187607b3 /build.go
parenta37431e9633d7301615a0d7cdf3dba6f3dea4b4f (diff)
build.go: allow running tests in temporary GOPATH
Diffstat (limited to 'build.go')
-rw-r--r--build.go62
1 files changed, 53 insertions, 9 deletions
diff --git a/build.go b/build.go
index 1e62384bc..f429c63d3 100644
--- a/build.go
+++ b/build.go
@@ -18,6 +18,7 @@ import (
var (
verbose bool
keepGopath bool
+ runTests bool
)
const timeFormat = "2006-01-02 15:04:05"
@@ -32,6 +33,21 @@ func specialDir(name string) bool {
return base[0] == '_' || base[0] == '.'
}
+// excludePath returns true if the file should not be copied to the new GOPATH.
+func excludePath(name string) bool {
+ ext := path.Ext(name)
+ if ext == ".go" || ext == ".s" {
+ return false
+ }
+
+ parentDir := filepath.Base(filepath.Dir(name))
+ if parentDir == "testdata" {
+ return false
+ }
+
+ return true
+}
+
// updateGopath builds a valid GOPATH at dst, with all Go files in src/ copied
// to dst/prefix/, so calling
//
@@ -60,8 +76,7 @@ func updateGopath(dst, src, prefix string) error {
return nil
}
- ext := path.Ext(name)
- if ext != ".go" && ext != ".s" {
+ if excludePath(name) {
return nil
}
@@ -133,7 +148,10 @@ func showUsage(output io.Writer) {
fmt.Fprintf(output, "USAGE: go run build.go OPTIONS\n")
fmt.Fprintf(output, "\n")
fmt.Fprintf(output, "OPTIONS:\n")
- fmt.Fprintf(output, " -v --verbose output more messages\n")
+ fmt.Fprintf(output, " -v --verbose output more messages\n")
+ fmt.Fprintf(output, " -t --tags specify additional build tags\n")
+ fmt.Fprintf(output, " -k --keep-gopath do not remove the GOPATH after build\n")
+ fmt.Fprintf(output, " -T --test run tests\n")
}
func verbosePrintf(message string, args ...interface{}) {
@@ -170,6 +188,18 @@ func build(gopath string, args ...string) error {
return cmd.Run()
}
+// test runs "go test args..." with GOPATH set to gopath.
+func test(gopath string, args ...string) error {
+ args = append([]string{"test"}, args...)
+ cmd := exec.Command("go", args...)
+ cmd.Env = append(cleanEnv(), "GOPATH="+gopath)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ verbosePrintf("go %s\n", args)
+
+ return cmd.Run()
+}
+
// getVersion returns a version string, either from the file VERSION in the
// current directory or from git.
func getVersion() string {
@@ -218,6 +248,8 @@ func main() {
case "-t", "-tags", "--tags":
skipNext = true
buildTags = strings.Split(params[i+1], " ")
+ case "-T", "--test":
+ runTests = true
case "-h":
showUsage(os.Stdout)
default:
@@ -258,6 +290,17 @@ func main() {
die("copying files from %v to %v failed: %v\n", root, gopath, err)
}
+ defer func() {
+ if !keepGopath {
+ verbosePrintf("remove %v\n", gopath)
+ if err = os.RemoveAll(gopath); err != nil {
+ die("remove GOPATH at %s failed: %v\n", err)
+ }
+ } else {
+ fmt.Printf("leaving temporary GOPATH at %v\n", gopath)
+ }
+ }()
+
output := "restic"
if runtime.GOOS == "windows" {
output = "restic.exe"
@@ -277,14 +320,15 @@ func main() {
err = build(gopath, args...)
if err != nil {
fmt.Fprintf(os.Stderr, "build failed: %v\n", err)
+ return
}
- if !keepGopath {
- verbosePrintf("remove %v\n", gopath)
- if err = os.RemoveAll(gopath); err != nil {
- die("remove GOPATH at %s failed: %v\n", err)
+ if runTests {
+ verbosePrintf("running tests\n")
+
+ err = test(gopath, "github.com/restic/restic/...")
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "build failed: %v\n", err)
}
- } else {
- fmt.Printf("leaving temporary GOPATH at %v\n", gopath)
}
}