1
1
package me .earth .headlessmc .launcher .launch ;
2
2
3
3
import lombok .CustomLog ;
4
+ import me .earth .headlessmc .launcher .util .Pair ;
4
5
import me .earth .headlessmc .launcher .version .Argument ;
5
6
import me .earth .headlessmc .launcher .version .Library ;
6
7
import me .earth .headlessmc .launcher .version .Version ;
9
10
import java .util .ArrayList ;
10
11
import java .util .List ;
11
12
import java .util .function .Function ;
13
+ import java .util .stream .Collectors ;
12
14
13
15
@ CustomLog
14
16
class VersionMerger extends DelegatingVersion {
@@ -43,7 +45,7 @@ public String getAssetsUrl() {
43
45
44
46
@ Override
45
47
public List <Library > getLibraries () {
46
- return merge ( Version :: getLibraries );
48
+ return mergeLibraries ( );
47
49
}
48
50
49
51
@ Override
@@ -68,11 +70,32 @@ private <T> List<T> merge(Function<Version, List<T>> func) {
68
70
result .addAll (list );
69
71
}
70
72
});
73
+
71
74
return result ;
72
75
}
73
76
74
77
private <T > T get (Function <Version , T > func ) {
75
78
return FamilyUtil .iterateParents (version , () -> null , func );
76
79
}
77
80
81
+ private List <Library > mergeLibraries () {
82
+ List <Pair <Library , Version >> result = new ArrayList <>();
83
+ FamilyUtil .iterateTopDown (version , v -> {
84
+ for (Library library : v .getLibraries ()) {
85
+ // The behaviour seems to be that child versions overwrite
86
+ // libraries of their parent version with the same package and name.
87
+ // overwriting.getValue().equals(v) is there because a version itself might
88
+ // contain libraries with similar packages and names, like this:
89
+ // io.netty:netty-transport-native-epoll:4.1.97.Final:linux-x86_64
90
+ // io.netty:netty-transport-native-epoll:4.1.97.Final:linux-aarch_64
91
+ result .removeIf (overwriting -> !overwriting .getValue ().equals (v )
92
+ && overwriting .getKey ().getPackage ().equals (library .getPackage ())
93
+ && overwriting .getKey ().getNameAfterPackage ().equals (library .getNameAfterPackage ()));
94
+ result .add (new Pair <>(library , v ));
95
+ }
96
+ });
97
+
98
+ return result .stream ().map (Pair ::getKey ).collect (Collectors .toList ());
99
+ }
100
+
78
101
}
0 commit comments