@@ -16,15 +16,21 @@ import net.mamoe.mirai.utils.MiraiLogger
16
16
import net.mamoe.mirai.utils.debug
17
17
import net.mamoe.mirai.utils.verbose
18
18
import org.apache.maven.repository.internal.MavenRepositorySystemUtils
19
+ import org.codehaus.plexus.util.ReaderFactory
20
+ import org.codehaus.plexus.util.xml.pull.MXParser
21
+ import org.codehaus.plexus.util.xml.pull.XmlPullParser
19
22
import org.eclipse.aether.RepositorySystem
20
23
import org.eclipse.aether.RepositorySystemSession
24
+ import org.eclipse.aether.artifact.Artifact
21
25
import org.eclipse.aether.artifact.DefaultArtifact
22
26
import org.eclipse.aether.collection.CollectRequest
23
27
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory
24
28
import org.eclipse.aether.graph.Dependency
25
29
import org.eclipse.aether.graph.DependencyFilter
26
30
import org.eclipse.aether.repository.LocalRepository
27
31
import org.eclipse.aether.repository.RemoteRepository
32
+ import org.eclipse.aether.repository.WorkspaceReader
33
+ import org.eclipse.aether.repository.WorkspaceRepository
28
34
import org.eclipse.aether.resolution.DependencyRequest
29
35
import org.eclipse.aether.resolution.DependencyResult
30
36
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory
@@ -33,6 +39,7 @@ import org.eclipse.aether.spi.locator.ServiceLocator
33
39
import org.eclipse.aether.transfer.AbstractTransferListener
34
40
import org.eclipse.aether.transfer.TransferEvent
35
41
import org.eclipse.aether.transport.http.HttpTransporterFactory
42
+ import java.io.File
36
43
37
44
38
45
@Suppress(" DEPRECATION" , " MemberVisibilityCanBePrivate" )
@@ -63,6 +70,8 @@ internal class JvmPluginDependencyDownloader(
63
70
" mirai-core-utils" ,
64
71
" mirai-core-utils-jvm" ,
65
72
" mirai-core-utils-android" ,
73
+ " mirai-console" ,
74
+ " mirai-console-terminal" ,
66
75
)
67
76
) return @DependencyFilter false
68
77
}
@@ -96,12 +105,99 @@ internal class JvmPluginDependencyDownloader(
96
105
logger.warning(event.exception)
97
106
}
98
107
}
108
+ val userHome = System .getProperty(" user.home" )
109
+ fun findMavenLocal (): File {
110
+ val mavenHome = File (userHome, " .m2" )
111
+ fun findFromSettingsXml (): File ? {
112
+ val settings = File (mavenHome, " settings.xml" )
113
+ if (! settings.isFile) return null
114
+ ReaderFactory .newXmlReader(settings).use { reader ->
115
+ val parser = MXParser ()
116
+ parser.setInput(reader)
117
+
118
+ var eventType = parser.eventType
119
+ var joinedSettings = false
120
+ while (eventType != XmlPullParser .END_DOCUMENT ) {
121
+ when (eventType) {
122
+ XmlPullParser .START_TAG -> {
123
+ if (! joinedSettings) {
124
+ if (parser.name != " settings" ) {
125
+ return null
126
+ }
127
+ joinedSettings = true
128
+ } else {
129
+ if (parser.name == " localRepository" ) {
130
+ val loc = File (parser.nextText())
131
+ if (loc.isDirectory) return loc
132
+ return null
133
+ } else {
134
+ parser.skipSubTree()
135
+ }
136
+ }
137
+ }
138
+ // else -> parser.skipSubTree()
139
+ }
140
+ eventType = parser.next()
141
+ }
142
+ }
143
+ return null
144
+ }
145
+ return kotlin.runCatching {
146
+ findFromSettingsXml()
147
+ }.onFailure { error ->
148
+ logger.warning(error)
149
+ }.getOrNull() ? : File (mavenHome, " repository" )
150
+ }
151
+
152
+ fun findGradleDepCache (): File {
153
+ return File (userHome, " .gradle/caches/modules-2/files-2.1" )
154
+ }
155
+
156
+ val mavenLocRepo = findMavenLocal()
157
+ val gradleLocRepo = findGradleDepCache()
158
+ logger.debug { " Maven local: $mavenLocRepo " }
159
+ logger.debug { " Gradle cache local: $gradleLocRepo " }
160
+ session.workspaceReader = object : WorkspaceReader {
161
+ private val repository: WorkspaceRepository = WorkspaceRepository (" default" )
162
+ override fun getRepository (): WorkspaceRepository = repository
163
+
164
+ override fun findArtifact (artifact : Artifact ): File ? {
165
+ // logger.debug { "Try resolve $artifact" }
166
+ val path = session.localRepositoryManager.getPathForLocalArtifact(artifact)
167
+ File (mavenLocRepo, path).takeIf { it.isFile }?.let { return it }
168
+ val gradleDep = gradleLocRepo
169
+ .resolve(artifact.groupId)
170
+ .resolve(artifact.artifactId)
171
+ .resolve(artifact.baseVersion)
172
+ if (gradleDep.isDirectory) {
173
+ val fileName = buildString {
174
+ append(artifact.artifactId)
175
+ append(' -' )
176
+ append(artifact.baseVersion)
177
+ artifact.classifier?.takeIf { it.isNotEmpty() }?.let { c ->
178
+ append(' -' ).append(c)
179
+ }
180
+ append(' .' ).append(artifact.extension)
181
+ }
182
+ gradleDep.walk().maxDepth(2 )
183
+ .filter { it.isFile }
184
+ .firstOrNull { it.name == fileName }
185
+ ?.let { return it }
186
+ }
187
+ return null
188
+ }
189
+
190
+ override fun findVersions (artifact : Artifact ? ): MutableList <String > {
191
+ return mutableListOf ()
192
+ }
193
+
194
+ }
99
195
session.setReadOnly()
100
196
repositories = repository.newResolutionRepositories(
101
197
session,
102
- // listOf(RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2").build())
103
- // listOf( RemoteRepository.Builder("central" , "default", "https://maven.aliyun.com/repository/public" ).build() )
104
- listOf ( RemoteRepository . Builder ( " central " , " default " , PluginDependenciesConfig .repoLoc).build())
198
+ PluginDependenciesConfig .repoLoc.map { url ->
199
+ RemoteRepository .Builder (null , " default" , url ).build()
200
+ }
105
201
)
106
202
logger.debug { " Remote server: " + PluginDependenciesConfig .repoLoc }
107
203
}
@@ -115,7 +211,7 @@ internal class JvmPluginDependencyDownloader(
115
211
dependencies.add(dependency)
116
212
}
117
213
return repository.resolveDependencies(
118
- session as RepositorySystemSession ? , DependencyRequest (
214
+ session, DependencyRequest (
119
215
CollectRequest (
120
216
null as Dependency ? , dependencies,
121
217
repositories
0 commit comments