-
Notifications
You must be signed in to change notification settings - Fork 50
/
CoverallPayloadWriter.scala
131 lines (97 loc) · 3.51 KB
/
CoverallPayloadWriter.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package org.scoverage.coveralls
import java.io.{File, FileInputStream}
import java.security.{DigestInputStream, MessageDigest}
import sbt.Logger
import com.fasterxml.jackson.core.{ JsonFactory, JsonEncoding }
class CoverallPayloadWriter(
repoRootDir: File,
coverallsFile: File,
repoToken: Option[String],
service: Option[CIService],
gitClient: GitClient) {
val repoRootDirStr = repoRootDir.getCanonicalPath.replace(File.separator, "/") + "/"
import gitClient._
val gen = generator(coverallsFile)
def generator(file: File) = {
if (!file.getParentFile.exists) file.getParentFile.mkdirs
val factory = new JsonFactory
factory.createGenerator(file, JsonEncoding.UTF8)
}
def start() {
gen.writeStartObject()
def writeOpt(fieldName: String, holder: Option[String]) =
holder foreach { gen.writeStringField(fieldName, _) }
writeOpt("repo_token", repoToken)
writeOpt("service_name", service.map(_.name))
writeOpt("service_job_id", service.flatMap(_.jobId))
writeOpt("service_pull_request", service.flatMap(_.pullRequest))
// to provide an unique additional label in jobs with multiple submissions
writeOpt("flag_name", sys.env.get("COVERALLS_FLAG_NAME"))
addGitInfo
gen.writeFieldName("source_files")
gen.writeStartArray()
}
private def addGitInfo() {
gen.writeFieldName("git")
gen.writeStartObject()
gen.writeFieldName("head")
gen.writeStartObject()
val commitInfo = lastCommit()
gen.writeStringField("id", commitInfo.id)
gen.writeStringField("author_name", commitInfo.authorName)
gen.writeStringField("author_email", commitInfo.authorEmail)
gen.writeStringField("committer_name", commitInfo.committerName)
gen.writeStringField("committer_email", commitInfo.committerEmail)
gen.writeStringField("message", commitInfo.shortMessage)
gen.writeEndObject()
gen.writeStringField("branch",
service.flatMap(_.currentBranch).getOrElse(gitClient.currentBranch)
)
gen.writeFieldName("remotes")
gen.writeStartArray()
addGitRemotes(remotes)
gen.writeEndArray()
gen.writeEndObject()
}
private def addGitRemotes(remotes: Seq[String]) {
remotes.foreach( remote => {
gen.writeStartObject()
gen.writeStringField("name", remote)
gen.writeStringField("url", remoteUrl(remote))
gen.writeEndObject()
})
}
def addSourceFile(report: SourceFileReport) {
// create a name relative to the project root (rather than the module root)
// this is needed so that coveralls can find the file in git.
val fileName = report.file.replace(repoRootDirStr, "")
gen.writeStartObject()
gen.writeStringField("name", fileName)
val sourceDigest = computeSourceDigest(report.file)
gen.writeStringField("source_digest", sourceDigest)
gen.writeFieldName("coverage")
gen.writeStartArray()
report.lineCoverage.foreach {
case Some(x) => gen.writeNumber(x)
case _ => gen.writeNull()
}
gen.writeEndArray()
gen.writeEndObject()
}
private def computeSourceDigest(path: String) = {
val buffer = new Array[Byte](8192)
val md5 = MessageDigest.getInstance("MD5")
val dis = new DigestInputStream(new FileInputStream(new File(path)), md5)
try { while (dis.read(buffer) != -1) { } } finally { dis.close() }
md5.digest.map("%02x".format(_)).mkString.toUpperCase
}
def end(): Unit = {
gen.writeEndArray()
gen.writeEndObject()
gen.flush()
gen.close()
}
def flush(): Unit = {
gen.flush()
}
}