Passed
Push — master ( 987d1a...9e8f37 )
by Patrick D
10:15 queued 08:34
created

goscrutinize.go (7 issues)

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