Skip to content

Commit 562ad3d

Browse files
committed
Merge branch 'support_multiple_configurations' into trunk
Conflicts: src/main/kotlin/com/jakewharton/gradle/dependencies/treeDiff.kt src/test/fixtures/single/expected.txt
2 parents c85d2aa + 149cfc0 commit 562ad3d

File tree

12 files changed

+6512
-7
lines changed

12 files changed

+6512
-7
lines changed

src/main/kotlin/com/jakewharton/gradle/dependencies/treeDiff.kt

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,85 @@ import java.util.ArrayDeque
66

77
@JvmName("diff")
88
fun dependencyTreeDiff(old: String, new: String): String {
9-
val oldPaths = findDependencyPaths(old)
10-
val newPaths = findDependencyPaths(new)
9+
val olds = dependencies(old)
10+
val news = dependencies(new)
11+
12+
val addedConfigurations = news.keys - olds.keys
13+
val removedConfigurations = olds.keys - news.keys
14+
val matchingConfigurations = news.keys intersect olds.keys
15+
16+
val added = addedConfigurations
17+
.associateWith { dependencyTreeDiff(emptyList(), news.getValue(it)) }
18+
.mapKeys { "+$it" }
19+
.mapValues { it.value.takeIf(String::isNotEmpty) ?: "No dependencies\n" }
20+
val removed = removedConfigurations
21+
.associateWith { dependencyTreeDiff(olds.getValue(it), emptyList()) }
22+
.mapKeys { "-$it" }
23+
.mapValues { it.value.takeIf(String::isNotEmpty) ?: "No dependencies\n" }
24+
val modified = matchingConfigurations
25+
.associateWith { dependencyTreeDiff(olds.getValue(it), news.getValue(it)) }
26+
// Ignore configurations that didn't change at all.
27+
.filter { it.value != "" }
28+
29+
return (modified + added + removed)
30+
.entries
31+
.joinToString(separator = "\n") { (configuration, diff) ->
32+
"${configuration}\n${diff}"
33+
}
34+
}
35+
36+
private enum class DependencyScanState {
37+
LOOKING,
38+
SCANNING,
39+
}
40+
41+
private fun dependencies(old: String): Map<String, List<String>> {
42+
val configurations = mutableMapOf<String, List<String>>()
43+
var state = DependencyScanState.LOOKING
44+
var configuration = "String to Satisfy Kotlin Compiler"
45+
val dependencies = mutableListOf<String>()
46+
old
47+
.split(Regex("\r?\n"))
48+
.fold("<unknown configuration>") { prev, curr ->
49+
when (state) {
50+
DependencyScanState.LOOKING -> {
51+
if (curr.startsWith("+--- ") || curr.startsWith("\\---") || curr == "No dependencies" ) {
52+
// Found first line of dependencies, save configuration and collect all of them.
53+
configuration = prev
54+
dependencies.add(curr)
55+
state = DependencyScanState.SCANNING
56+
} else {
57+
// Continue `reduce`, skipping over unknown lines.
58+
}
59+
}
60+
61+
DependencyScanState.SCANNING -> {
62+
if (curr.isEmpty()) {
63+
val cleanDependencies = if (dependencies.size == 1 && dependencies[0] == "No dependencies") {
64+
// Remove dependencies from configurations with only "No dependencies" so tree diff doesn't process it.
65+
emptyList()
66+
} else {
67+
// Make a copy of the mutable list to prevent leaking mutations into result.
68+
dependencies.toList()
69+
}
70+
if (configurations.putIfAbsent(configuration, cleanDependencies) != null) {
71+
error("Unsupported input: multiple unknown configurations")
72+
}
73+
dependencies.clear()
74+
state = DependencyScanState.LOOKING
75+
} else {
76+
dependencies.add(curr)
77+
}
78+
}
79+
}
80+
curr
81+
}
82+
return configurations
83+
}
84+
85+
private fun dependencyTreeDiff(oldLines: List<String>, newLines: List<String>): String {
86+
val oldPaths = findDependencyPaths(oldLines)
87+
val newPaths = findDependencyPaths(newLines)
1188

1289
val removedTree = buildTree(oldPaths - newPaths)
1390
val addedTree = buildTree(newPaths - oldPaths)
@@ -17,11 +94,7 @@ fun dependencyTreeDiff(old: String, new: String): String {
1794
}
1895
}
1996

20-
private fun findDependencyPaths(text: String): Set<List<String>> {
21-
val dependencyLines = text.split(Regex("\r?\n"))
22-
.dropWhile { !it.startsWith("+--- ") && !it.startsWith("\\---") }
23-
.takeWhile { it.isNotEmpty() }
24-
97+
private fun findDependencyPaths(dependencyLines: List<String>): Set<List<String>> {
2598
val dependencyPaths = mutableSetOf<List<String>>()
2699
val stack = ArrayDeque<String>()
27100
for (dependencyLine in dependencyLines) {
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
apiDependenciesMetadata
2+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
3+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
4+
- \--- org.jetbrains:annotations:13.0
5+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
6+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
7+
+ | +--- org.jetbrains:annotations:13.0
8+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
9+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
10+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
11+
12+
compileClasspath - Compile classpath for compilation 'main' (target (jvm)).
13+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
14+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
15+
- \--- org.jetbrains:annotations:13.0
16+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
17+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
18+
+ | +--- org.jetbrains:annotations:13.0
19+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
20+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
21+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
22+
23+
implementationDependenciesMetadata
24+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
25+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
26+
- \--- org.jetbrains:annotations:13.0
27+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
28+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
29+
+ | +--- org.jetbrains:annotations:13.0
30+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
31+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
32+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
33+
34+
kotlinCompilerClasspath
35+
-\--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.0
36+
- +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
37+
- | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
38+
- | \--- org.jetbrains:annotations:13.0
39+
- +--- org.jetbrains.kotlin:kotlin-script-runtime:1.4.0
40+
- +--- org.jetbrains.kotlin:kotlin-reflect:1.4.0
41+
- | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 (*)
42+
- +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.0
43+
- \--- org.jetbrains.intellij.deps:trove4j:1.0.20181211
44+
+\--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.5.0
45+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
46+
+ | +--- org.jetbrains:annotations:13.0
47+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
48+
+ +--- org.jetbrains.kotlin:kotlin-script-runtime:1.5.0
49+
+ +--- org.jetbrains.kotlin:kotlin-reflect:1.5.0
50+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
51+
+ +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.5.0
52+
+ \--- org.jetbrains.intellij.deps:trove4j:1.0.20181211
53+
54+
kotlinCompilerPluginClasspath
55+
-\--- org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.4.0
56+
- +--- org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.4.0
57+
- | +--- org.jetbrains.kotlin:kotlin-scripting-common:1.4.0
58+
- | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
59+
- | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
60+
- | | | \--- org.jetbrains:annotations:13.0
61+
- | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7
62+
- | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.4.0 (*)
63+
- | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.71 -> 1.4.0
64+
- | +--- org.jetbrains.kotlin:kotlin-scripting-jvm:1.4.0
65+
- | | +--- org.jetbrains.kotlin:kotlin-script-runtime:1.4.0
66+
- | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 (*)
67+
- | | \--- org.jetbrains.kotlin:kotlin-scripting-common:1.4.0 (*)
68+
- | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 (*)
69+
- | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7 (*)
70+
- \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 (*)
71+
72+
kotlinKlibCommonizerClasspath
73+
-\--- org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.4.0
74+
- +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
75+
- | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
76+
- | \--- org.jetbrains:annotations:13.0
77+
- \--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.0
78+
- +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 (*)
79+
- +--- org.jetbrains.kotlin:kotlin-script-runtime:1.4.0
80+
- +--- org.jetbrains.kotlin:kotlin-reflect:1.4.0
81+
- | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 (*)
82+
- +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.0
83+
- \--- org.jetbrains.intellij.deps:trove4j:1.0.20181211
84+
+\--- org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.5.0
85+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
86+
+ | +--- org.jetbrains:annotations:13.0
87+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
88+
+ \--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.5.0
89+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
90+
+ +--- org.jetbrains.kotlin:kotlin-script-runtime:1.5.0
91+
+ +--- org.jetbrains.kotlin:kotlin-reflect:1.5.0
92+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
93+
+ +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.5.0
94+
+ \--- org.jetbrains.intellij.deps:trove4j:1.0.20181211
95+
96+
runtimeClasspath - Runtime classpath of compilation 'main' (target (jvm)).
97+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
98+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
99+
- \--- org.jetbrains:annotations:13.0
100+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
101+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
102+
+ | +--- org.jetbrains:annotations:13.0
103+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
104+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
105+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
106+
107+
testCompileClasspath - Compile classpath for compilation 'test' (target (jvm)).
108+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
109+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
110+
- \--- org.jetbrains:annotations:13.0
111+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
112+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
113+
+ | +--- org.jetbrains:annotations:13.0
114+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
115+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
116+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
117+
118+
testImplementationDependenciesMetadata
119+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
120+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
121+
- \--- org.jetbrains:annotations:13.0
122+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
123+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
124+
+ | +--- org.jetbrains:annotations:13.0
125+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
126+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
127+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
128+
129+
testRuntimeClasspath - Runtime classpath of compilation 'test' (target (jvm)).
130+
-\--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0
131+
- +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0
132+
- \--- org.jetbrains:annotations:13.0
133+
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.0
134+
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
135+
+ | +--- org.jetbrains:annotations:13.0
136+
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
137+
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.0
138+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
139+
140+
+apiElements-published (n)=
141+
No dependencies
142+
143+
+kotlinCompilerPluginClasspathMain - Kotlin compiler plugins for compilation 'main' (target (jvm))=+\--- org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.5.0
144+
+ +--- org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.5.0
145+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0
146+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
147+
+ | | | +--- org.jetbrains:annotations:13.0
148+
+ | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
149+
+ | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8
150+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.5.0 (*)
151+
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.71 -> 1.5.0
152+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-jvm:1.5.0
153+
+ | | +--- org.jetbrains.kotlin:kotlin-script-runtime:1.5.0
154+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
155+
+ | | \--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0 (*)
156+
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
157+
+ | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8 (*)
158+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
159+
160+
+\--- org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.5.0
161+
+ +--- org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.5.0
162+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0
163+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
164+
+ | | | +--- org.jetbrains:annotations:13.0
165+
+ | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
166+
+ | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8
167+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.5.0 (*)
168+
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.71 -> 1.5.0
169+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-jvm:1.5.0
170+
+ | | +--- org.jetbrains.kotlin:kotlin-script-runtime:1.5.0
171+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
172+
+ | | \--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0 (*)
173+
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
174+
+ | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8 (*)
175+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
176+
177+
+kotlinCompilerPluginClasspathTest - Kotlin compiler plugins for compilation 'test' (target (jvm))=+\--- org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.5.0
178+
+ +--- org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.5.0
179+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0
180+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
181+
+ | | | +--- org.jetbrains:annotations:13.0
182+
+ | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
183+
+ | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8
184+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.5.0 (*)
185+
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.71 -> 1.5.0
186+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-jvm:1.5.0
187+
+ | | +--- org.jetbrains.kotlin:kotlin-script-runtime:1.5.0
188+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
189+
+ | | \--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0 (*)
190+
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
191+
+ | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8 (*)
192+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
193+
194+
+\--- org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.5.0
195+
+ +--- org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.5.0
196+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0
197+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0
198+
+ | | | +--- org.jetbrains:annotations:13.0
199+
+ | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0
200+
+ | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8
201+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.5.0 (*)
202+
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.3.71 -> 1.5.0
203+
+ | +--- org.jetbrains.kotlin:kotlin-scripting-jvm:1.5.0
204+
+ | | +--- org.jetbrains.kotlin:kotlin-script-runtime:1.5.0
205+
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
206+
+ | | \--- org.jetbrains.kotlin:kotlin-scripting-common:1.5.0 (*)
207+
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
208+
+ | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8 (*)
209+
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.5.0 (*)
210+
211+
+runtimeElements-published (n)=
212+
No dependencies
213+
214+
--api (n)=
215+
No dependencies
216+
217+
--runtime (n)=
218+
No dependencies
219+
220+
-compile - Dependencies for compilation 'main' (target (jvm)) (deprecated, use 'implementation ' instead).=
221+
No dependencies
222+
223+
-runtime - Runtime dependencies for compilation 'main' (target (jvm)) (deprecated, use 'runtimeOnly ' instead).=
224+
No dependencies
225+
226+
-testCompile - Dependencies for compilation 'test' (target (jvm)) (deprecated, use 'testImplementation ' instead).=
227+
No dependencies
228+
229+
-testRuntime - Runtime dependencies for compilation 'test' (target (jvm)) (deprecated, use 'testRuntimeOnly ' instead).=
230+
No dependencies

0 commit comments

Comments
 (0)