Skip to content

Commit c5bca0e

Browse files
authored
Merge pull request #177 from danger/coroutines-compatibility
Coroutines compatibility
2 parents f58661a + 25a242b commit c5bca0e

File tree

7 files changed

+80
-28
lines changed

7 files changed

+80
-28
lines changed

.github/workflows/ci.yml

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ jobs:
2020

2121
- name: Install Kotlin
2222
run: |
23-
curl -o kotlin-compiler.zip -L https://github.com/JetBrains/kotlin/releases/download/v1.4.31/kotlin-compiler-1.4.31.zip
23+
curl -o kotlin-compiler.zip -L https://github.com/JetBrains/kotlin/releases/download/v1.5.10/kotlin-compiler-1.5.10.zip
2424
2525
if [[ "$OSTYPE" != "darwin"* ]]
2626
then
2727
sudo chmod -R a+rwx /usr/local/
28+
29+
unzip -d /usr/local/bin kotlin-compiler.zip
30+
echo "/usr/local/bin/kotlinc/bin" >> $GITHUB_PATH
31+
rm -rf kotlin-compiler.zip
2832
fi
29-
30-
unzip -d /usr/local/bin kotlin-compiler.zip
31-
echo "/usr/local/bin/kotlinc/bin" >> $GITHUB_PATH
32-
rm -rf kotlin-compiler.zip
3333
3434
- uses: actions/setup-node@v2
3535
with:

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
-->
1313
## Master
1414

15+
- Coroutines compatibility [@gianluz] - [#177](https://github.com/danger/kotlin/pull/177)
1516
- Improving error message for when a DangerPlugin was not registered [@rojanthomas] - [#181](https://github.com/danger/kotlin/pull/181)
1617
- Fix body parameter in github models [@tegorov] - [#175](https://github.com/danger/kotlin/pull/175)
1718

Dangerfile_ci.df.kts

+27
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@
88
//Testing plugin
99
@file:DependsOn("danger-kotlin-sample-plugin-sample.jar")
1010

11+
import kotlinx.coroutines.async
12+
import kotlinx.coroutines.delay
13+
import kotlinx.coroutines.runBlocking
14+
import kotlinx.datetime.Clock
1115
import org.apache.commons.text.WordUtils
1216
import systems.danger.kotlin.*
17+
import systems.danger.kotlin.models.danger.DangerDSL
1318
import systems.danger.samples.plugin.SamplePlugin
1419

1520
register plugin SamplePlugin
@@ -49,4 +54,26 @@ danger(args) {
4954
warn(WordUtils.capitalize("please consider to create new files in Kotlin"), it, 1)
5055
}
5156
}
57+
58+
// Coroutines checks in parallel test
59+
val current = Clock.System.now()
60+
runBlocking {
61+
val task1 = async { expensiveCheck("1", 1000) }
62+
val task2 = async { expensiveCheck("2", 3000) }
63+
val task3 = async { expensiveCheck("3", 2000) }
64+
val task4 = async { expensiveCheck("4", 5000) }
65+
task1.await()
66+
task2.await()
67+
task3.await()
68+
task4.await()
69+
}
70+
val after = Clock.System.now()
71+
val runningTime = after.minus(current)
72+
message("Coroutines checks terminated - runningFor $runningTime")
73+
}
74+
75+
suspend fun DangerDSL.expensiveCheck(name: String, runForMillis: Long) {
76+
// Example expensive check
77+
delay(runForMillis)
78+
message("Coroutine $name terminated in $runForMillis ms")
5279
}

danger-kotlin-library/src/main/kotlin/systems/danger/kotlin/MainDangerRunner.kt

+22-14
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package systems.danger.kotlin
22

33
import systems.danger.kotlin.json.JsonParser
4+
import systems.danger.kotlin.models.danger.ConcurrentDangerResults
45
import systems.danger.kotlin.models.danger.DSL
56
import systems.danger.kotlin.models.danger.DangerDSL
6-
import systems.danger.kotlin.models.danger.DangerResults
77
import systems.danger.kotlin.models.git.FilePath
88
import systems.danger.kotlin.sdk.DangerContext
99
import systems.danger.kotlin.sdk.Violation
1010
import java.io.File
11+
import java.util.concurrent.atomic.AtomicReference
1112

1213
/**
1314
* Main Danger runner
@@ -23,23 +24,23 @@ internal class MainDangerRunner(jsonInputFilePath: FilePath, jsonOutputPath: Fil
2324

2425
val danger: DangerDSL = JsonParser.decodeJson<DSL>(jsonInputFilePath).danger
2526

26-
private val dangerResults: DangerResults = DangerResults()
27+
private val concurrentDangerResults: ConcurrentDangerResults = ConcurrentDangerResults()
2728

2829
override val fails: List<Violation>
2930
get() {
30-
return dangerResults.fails.toList()
31+
return concurrentDangerResults.fails.get()
3132
}
3233
override val warnings: List<Violation>
3334
get() {
34-
return dangerResults.warnings.toList()
35+
return concurrentDangerResults.warnings.get()
3536
}
3637
override val messages: List<Violation>
3738
get() {
38-
return dangerResults.messages.toList()
39+
return concurrentDangerResults.messages.get()
3940
}
4041
override val markdowns: List<Violation>
4142
get() {
42-
return dangerResults.markdowns.toList()
43+
return concurrentDangerResults.markdowns.get()
4344
}
4445

4546

@@ -95,27 +96,34 @@ internal class MainDangerRunner(jsonInputFilePath: FilePath, jsonOutputPath: Fil
9596
}
9697

9798
private fun warn(violation: Violation) {
98-
dangerResults.warnings.add(violation)
99-
commit()
99+
concurrentDangerResults.warnings.updateWith(violation)
100100
}
101101

102102
private fun fail(violation: Violation) {
103-
dangerResults.fails.add(violation)
104-
commit()
103+
concurrentDangerResults.fails.updateWith(violation)
105104
}
106105

107106
private fun message(violation: Violation) {
108-
dangerResults.messages.add(violation)
109-
commit()
107+
concurrentDangerResults.messages.updateWith(violation)
110108
}
111109

112110
private fun markdown(violation: Violation) {
113-
dangerResults.markdowns.add(violation)
111+
concurrentDangerResults.markdowns.updateWith(violation)
112+
}
113+
114+
private fun AtomicReference<MutableList<Violation>>.updateWith(violation: Violation) {
115+
this.getAndUpdate {
116+
it.apply {
117+
add(violation)
118+
}
119+
}
114120
commit()
115121
}
116122

117123
// commit all the inline violations into the json output file
118124
private fun commit() {
119-
JsonParser.encodeJson(dangerResults, jsonOutputFile)
125+
synchronized(this) {
126+
JsonParser.encodeJson(concurrentDangerResults.toDangerResults(), jsonOutputFile)
127+
}
120128
}
121129
}

danger-kotlin-library/src/main/kotlin/systems/danger/kotlin/models/danger/DangerResults.kt

+16-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kotlinx.serialization.Serializable
66
import kotlinx.serialization.UseSerializers
77
import systems.danger.kotlin.sdk.Violation
88
import systems.danger.kotlin.models.serializers.ViolationSerializer
9+
import java.util.concurrent.atomic.AtomicReference
910

1011
@Serializable
1112
internal data class Meta(
@@ -15,9 +16,20 @@ internal data class Meta(
1516

1617
@Serializable
1718
internal data class DangerResults(
18-
var fails: MutableList<Violation> = mutableListOf(),
19-
var warnings: MutableList<Violation> = mutableListOf(),
20-
var messages: MutableList<Violation> = mutableListOf(),
21-
var markdowns: MutableList<Violation> = mutableListOf(),
19+
val fails: List<Violation>,
20+
val warnings: List<Violation>,
21+
val messages: List<Violation>,
22+
val markdowns: List<Violation>,
2223
val meta: Meta = Meta()
2324
)
25+
26+
internal data class ConcurrentDangerResults(
27+
val fails: AtomicReference<MutableList<Violation>> = AtomicReference(mutableListOf()),
28+
val warnings: AtomicReference<MutableList<Violation>> = AtomicReference(mutableListOf()),
29+
val messages: AtomicReference<MutableList<Violation>> = AtomicReference(mutableListOf()),
30+
val markdowns: AtomicReference<MutableList<Violation>> = AtomicReference(mutableListOf())
31+
) {
32+
fun toDangerResults() = DangerResults(
33+
fails.get(), warnings.get(), messages.get(), markdowns.get()
34+
)
35+
}

dependencyVersions.gradle

+8-4
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,28 @@ project.ext.groupIdOkio = 'com.squareup.okio'
2020
project.ext.artifactIdOkio = 'okio'
2121

2222
// Kotlin
23-
project.ext.versionKotlin = '1.5.0'
23+
project.ext.versionKotlin = '1.5.10'
2424
project.ext.groupIdKotlin = 'org.jetbrains.kotlin'
2525
project.ext.groupIdKotlinx = 'org.jetbrains.kotlinx'
2626
project.ext.artifactIdKotlinMain = 'kotlin-main-kts'
2727
project.ext.artifactIdKotlinSerializationJson = 'kotlinx-serialization-json'
2828
project.ext.artifactIdKotlinDatetime = "kotlinx-datetime"
29-
project.ext.versionKotlinSerializationJson = '1.0.1'
30-
project.ext.versionKotlinDatetime = '0.1.1'
29+
project.ext.artifactIdKotlinCoroutines = "kotlinx-coroutines-core"
30+
project.ext.versionKotlinSerializationJson = '1.2.1'
31+
project.ext.versionKotlinDatetime = '0.2.0'
32+
project.ext.versionKotlinCoroutines = '1.5.0'
3133

3234
ext.kotlin = [
3335
mainKts: "$groupIdKotlin:$artifactIdKotlinMain:$versionKotlin",
3436
serialization: "$groupIdKotlinx:$artifactIdKotlinSerializationJson:$versionKotlinSerializationJson",
35-
datetime: "$groupIdKotlinx:$artifactIdKotlinDatetime:$versionKotlinDatetime"
37+
datetime: "$groupIdKotlinx:$artifactIdKotlinDatetime:$versionKotlinDatetime",
38+
coroutines: "$groupIdKotlinx:$artifactIdKotlinCoroutines:$versionKotlinCoroutines"
3639
]
3740
ext.kotlinDependencies = group {
3841
includeJar kotlin.mainKts
3942
includeRecursiveJar kotlin.serialization
4043
includeRecursiveJar kotlin.datetime
44+
includeRecursiveJar kotlin.coroutines
4145
}
4246

4347
// Testing

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
kotlinVersion=1.5.0
1+
kotlinVersion=1.5.10
22
kotlin.code.style=official
33
systemProp.org.gradle.internal.publish.checksums.insecure=true

0 commit comments

Comments
 (0)