Issues (1)

goscrutinize.go (1 issue)

Severity
1
package main
2
3
import (
4
	"bytes"
5
	"io/ioutil"
6
	"log"
7
	"os"
8
	"os/exec"
9
	"regexp"
10
	"strings"
11
)
12
13
var (
14
	regexGithub    = regexp.MustCompile("^g")
15
	regexBitbucket = regexp.MustCompile("^b")
16
)
17
18
var (
19
	homeEnv                                                  = os.Getenv("HOME")
20
	gopathEnv                                                = os.Getenv("GOPATH")
21
	scrutinizerProjectEnv                                    = os.Getenv("SCRUTINIZER_PROJECT")
22
	projectFull, projectDomain, projectOwner, projectProject string
23
)
24
25
func main() {
26
	// Set up environment variables
27
	if gopathEnv == "" {
28
		gopathEnv = homeEnv + "/go"
29
	}
30
31
	// Set up project
32
	if len(scrutinizerProjectEnv) == 0 {
33
		log.Fatal("Not running without scrutinizer environment. SCRUTINIZER_PROJECT environment variable not found")
34
	}
35
36
	projectFull = regexGithub.ReplaceAllString(scrutinizerProjectEnv, "github.com")
37
	projectFull = regexBitbucket.ReplaceAllString(projectFull, "bitbucket.com")
38
39
	projectParts := strings.Split(projectFull, "/")
40
	if len(projectParts) != 3 {
41
		log.Fatal("Malformed SCRUTINIZER_PROJECT environment variable.")
42
	}
43
	projectDomain = projectParts[0]
44
	projectOwner = projectParts[1]
45
	projectProject = projectParts[2]
46
47
	// Install all dependencies
48
	cmd := exec.Command("go", "get", "-t", "./...")
49
	output, err := cmd.Output()
50
	if err != nil {
51
		exitErr, ok := err.(*exec.ExitError)
52
		if ok && len(exitErr.Stderr) != 0 {
53
			log.Println(string(exitErr.Stderr))
54
		}
55
		log.Println(output)
56
		log.Fatal("go get -t ./...", err)
57
	}
58
59
	// Run metalinter
60
	metalinter()
61
62
	// Run tests and coverage
63
	testAndCoverage()
64
}
65
66
func metalinter() {
0 ignored issues
show
cyclomatic complexity 11 of function metalinter() is high (> 10)
Loading history...
67
	goMetaLinterCmd := gopathEnv + "/bin/gometalinter"
68
69
	// Install gometalinter -- no-op if already installed
70
	cmd := exec.Command("go", "get", "github.com/alecthomas/gometalinter")
71
	_, err := cmd.Output()
72
	if err != nil {
73
		exitErr, ok := err.(*exec.ExitError)
74
		if ok && len(exitErr.Stderr) != 0 {
75
			log.Println(string(exitErr.Stderr))
76
		}
77
		log.Fatal("go get github.com/alecthomas/gometalinter", err)
78
	}
79
80
	// Install all gometalinter dependencies -- no-op if already installed
81
	cmd = exec.Command(goMetaLinterCmd, "--install")
82
	_, err = cmd.Output()
83
	if err != nil {
84
		exitErr, ok := err.(*exec.ExitError)
85
		if ok && len(exitErr.Stderr) != 0 {
86
			log.Println(string(exitErr.Stderr))
87
		}
88
		log.Fatal(goMetaLinterCmd, "--install", err)
89
	}
90
91
	// Configure the metalinter
92
	if _, err = os.Stat("go-scrutinize.config"); os.IsNotExist(err) {
93
		cmd = exec.Command(goMetaLinterCmd, "./...", "--checkstyle", "--deadline=1m")
94
	} else {
95
		cmd = exec.Command(goMetaLinterCmd, "./...", "--checkstyle", "--deadline=1m", "--config=go-scrutinize.config")
96
	}
97
98
	// Run the metalinter -- note that will return non-zero exit status
99
	out, err := cmd.Output()
100
	if err != nil {
101
		exitErr := err.(*exec.ExitError)
102
		if len(exitErr.Stderr) != 0 {
103
			log.Println(string(exitErr.Stderr))
104
		}
105
	}
106
107
	// Write the output from the metalinter
108
	err = ioutil.WriteFile("checkstyle_report.xml", out, os.ModePerm)
109
	if err != nil {
110
		log.Fatal("Unable to write checkstyle_report.xml - ", err)
111
	}
112
}
113
114
func testAndCoverage() {
115
	goConvCmd := gopathEnv + "/bin/gocov"
116
	goConvXMLCmd := gopathEnv + "/bin/gocov-xml"
117
118
	// Install the coverage tool covov
119
	cmd := exec.Command("go", "get", "github.com/axw/gocov/...")
120
	_, err := cmd.Output()
121
	if err != nil {
122
		exitErr := err.(*exec.ExitError)
123
		if len(exitErr.Stderr) != 0 {
124
			log.Println(string(exitErr.Stderr))
125
		}
126
		log.Fatal("go", "get", "github.com/axw/gocov/...", err)
127
	}
128
129
	// Install the coverage file translation tool gocov-xml
130
	cmd = exec.Command("go", "get", "github.com/AlekSi/gocov-xml")
131
	_, err = cmd.Output()
132
	if err != nil {
133
		exitErr := err.(*exec.ExitError)
134
		if len(exitErr.Stderr) != 0 {
135
			log.Println(string(exitErr.Stderr))
136
		}
137
		log.Fatal("go", "get", "github.com/AlekSi/gocov-xml", err)
138
	}
139
140
	// Run tests with coverage
141
	cmd = exec.Command(goConvCmd, "test", "./...", "-race", "-v")
142
	cmd.Stderr = os.Stderr // pipe stderr directly
143
	gocovout, err := cmd.Output()
144
	if err != nil {
145
		log.Fatal(goConvCmd, "test", "./...", "-race", "-v", err)
146
	}
147
148
	// Convert to clover format
149
	cmd = exec.Command(goConvXMLCmd)
150
	cmd.Stdin = bytes.NewReader(gocovout)
151
	xmlout, err := cmd.Output()
152
	if err != nil {
153
		exitErr := err.(*exec.ExitError)
154
		if len(exitErr.Stderr) != 0 {
155
			log.Println(string(exitErr.Stderr))
156
		}
157
		log.Fatal(goConvXMLCmd, err)
158
	}
159
160
	// Rewrite all filenames to use /home/scrutinizer/build paths
161
	coveragexml := strings.Replace(string(xmlout), gopathEnv+"/src/"+projectFull, "/home/scrutinizer/build", -1)
162
163
	// Write the output from the metalinter
164
	err = ioutil.WriteFile("coverage.xml", []byte(coveragexml), os.ModePerm)
165
	if err != nil {
166
		log.Fatal("Unable to write coverage.xml - ", err)
167
	}
168
169
}
170