Skip to content

Commit 4df8b4d

Browse files
committed
Clearly indicate if a configuration was added/removed and support "No dependencies".
1 parent 72f5325 commit 4df8b4d

File tree

4 files changed

+765
-8
lines changed

4 files changed

+765
-8
lines changed

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

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,21 @@ fun dependencyTreeDiff(old: String, new: String): String {
1414
val removedConfigurations = olds.keys - news.keys
1515
val matchingConfigurations = news.keys intersect olds.keys
1616

17-
val added = addedConfigurations.associateWith { dependencyTreeDiff(emptyList(), news.getValue(it)) }
18-
val removed = removedConfigurations.associateWith { dependencyTreeDiff(olds.getValue(it), emptyList()) }
19-
val modified = matchingConfigurations.associateWith { dependencyTreeDiff(olds.getValue(it), news.getValue(it)) }
20-
21-
return (added + modified + removed)
22-
.entries
17+
val added = addedConfigurations
18+
.associateWith { dependencyTreeDiff(emptyList(), news.getValue(it)) }
19+
.mapKeys { "+$it" }
20+
.mapValues { it.value.takeIf(String::isNotEmpty) ?: "No dependencies\n" }
21+
val removed = removedConfigurations
22+
.associateWith { dependencyTreeDiff(olds.getValue(it), emptyList()) }
23+
.mapKeys { "-$it" }
24+
.mapValues { it.value.takeIf(String::isNotEmpty) ?: "No dependencies\n" }
25+
val modified = matchingConfigurations
26+
.associateWith { dependencyTreeDiff(olds.getValue(it), news.getValue(it)) }
2327
// Ignore configurations that didn't change at all.
2428
.filter { it.value != "" }
29+
30+
return (modified + added + removed)
31+
.entries
2532
.joinToString(separator = "\n") { (configuration, diff) ->
2633
"${configuration}\n${diff}"
2734
}
@@ -44,7 +51,7 @@ private fun dependencies(text: String): Map<String, List<String>> {
4451
.fold("<unknown configuration>") { prev, curr ->
4552
when (state) {
4653
DependencyScanState.LOOKING -> {
47-
if (curr.startsWith("+--- ") || curr.startsWith("\\---")) {
54+
if (curr.startsWith("+--- ") || curr.startsWith("\\---") || curr == "No dependencies" ) {
4855
// Found first line of dependencies, save configuration and collect all of them.
4956
configuration = prev
5057
dependencies.add(curr)
@@ -56,7 +63,14 @@ private fun dependencies(text: String): Map<String, List<String>> {
5663

5764
DependencyScanState.SCANNING -> {
5865
if (curr.isEmpty()) {
59-
if (configurations.putIfAbsent(configuration, dependencies.toList()) != null) {
66+
val cleanDependencies = if (dependencies.size == 1 && dependencies[0] == "No dependencies") {
67+
// Remove dependencies from configurations with only "No dependencies" so tree diff doesn't process it.
68+
emptyList()
69+
} else {
70+
// Make a copy of the mutable list to prevent leaking mutations into result.
71+
dependencies.toList()
72+
}
73+
if (configurations.putIfAbsent(configuration, cleanDependencies) != null) {
6074
error("Unsupported input: multiple unknown configurations")
6175
}
6276
dependencies.clear()
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)