Skip to content

Commit 9b624db

Browse files
committed
Add repositories configuration option in swift-java.config
1 parent caa97a4 commit 9b624db

File tree

2 files changed

+60
-8
lines changed

2 files changed

+60
-8
lines changed

Sources/SwiftJavaConfigurationShared/Configuration.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public struct Configuration: Codable {
8080

8181
// Java dependencies we need to fetch for this target.
8282
public var dependencies: [JavaDependencyDescriptor]?
83+
// Java repositories for this target when fetching dependencies.
84+
public var repositories: [JavaRepositoryDescriptor]?
8385

8486
public init() {
8587
}
@@ -133,6 +135,41 @@ public struct JavaDependencyDescriptor: Hashable, Codable {
133135
}
134136
}
135137

138+
/// Descriptor for [repositories](https://docs.gradle.org/current/userguide/supported_repository_types.html#sec:maven-repo)
139+
public struct JavaRepositoryDescriptor: Hashable, Codable {
140+
public enum RepositoryType: String, Codable {
141+
case mavenLocal, mavenCentral
142+
case maven // TODO: ivy .. https://docs.gradle.org/current/userguide/supported_repository_types.html#sec:maven-repo
143+
}
144+
145+
public var type: RepositoryType
146+
public var url: String?
147+
public var artifactUrls: [String]?
148+
149+
public init(type: RepositoryType, url: String? = nil, artifactUrls: [String]? = nil) {
150+
self.type = type
151+
self.url = url
152+
self.artifactUrls = artifactUrls
153+
}
154+
155+
public var descriptionGradleStyle: String? {
156+
switch type {
157+
case .mavenLocal, .mavenCentral:
158+
return "\(type.rawValue)()"
159+
case .maven:
160+
guard let url else {
161+
return nil
162+
}
163+
return """
164+
maven {
165+
url "\(url)"
166+
\((artifactUrls ?? []).map({ "artifactUrls(\($0))" }).joined(separator: "\n"))
167+
}
168+
"""
169+
}
170+
}
171+
}
172+
136173
public func readConfiguration(sourceDir: String, file: String = #fileID, line: UInt = #line) throws -> Configuration? {
137174
// Workaround since filePath is macOS 13
138175
let sourcePath =

Sources/SwiftJavaTool/Commands/ResolveCommand.swift

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,19 @@ extension SwiftJava.ResolveCommand {
7575
return
7676
}
7777

78+
var repositoriesToResolve: [JavaRepositoryDescriptor] = []
79+
80+
if let repositories = config.repositories {
81+
repositoriesToResolve += repositories
82+
}
83+
84+
if !repositoriesToResolve.contains(where: { $0.type == .mavenCentral }) {
85+
// swift-java dependencies are originally located in mavenCentral
86+
repositoriesToResolve.append(JavaRepositoryDescriptor(type: .mavenCentral))
87+
}
88+
7889
let dependenciesClasspath =
79-
try await resolveDependencies(swiftModule: swiftModule, dependencies: dependenciesToResolve)
90+
try await resolveDependencies(swiftModule: swiftModule, dependencies: dependenciesToResolve, repositories: repositoriesToResolve)
8091

8192
// FIXME: disentangle the output directory from SwiftJava and then make it a required option in this Command
8293
guard let outputDirectory = self.commonOptions.outputDirectory else {
@@ -99,12 +110,13 @@ extension SwiftJava.ResolveCommand {
99110
///
100111
/// - Throws:
101112
func resolveDependencies(
102-
swiftModule: String, dependencies: [JavaDependencyDescriptor]
113+
swiftModule: String, dependencies: [JavaDependencyDescriptor],
114+
repositories: [JavaRepositoryDescriptor]
103115
) async throws -> ResolvedDependencyClasspath {
104116
let deps = dependencies.map { $0.descriptionGradleStyle }
105117
print("[debug][swift-java] Resolve and fetch dependencies for: \(deps)")
106118

107-
let dependenciesClasspath = await resolveDependencies(dependencies: dependencies)
119+
let dependenciesClasspath = await resolveDependencies(dependencies: dependencies, repositories: repositories)
108120
let classpathEntries = dependenciesClasspath.split(separator: ":")
109121

110122
print("[info][swift-java] Resolved classpath for \(deps.count) dependencies of '\(swiftModule)', classpath entries: \(classpathEntries.count), ", terminator: "")
@@ -119,10 +131,11 @@ extension SwiftJava.ResolveCommand {
119131

120132

121133
/// Resolves maven-style dependencies from swift-java.config under temporary project directory.
122-
///
134+
///
123135
/// - Parameter dependencies: maven-style dependencies to resolve
136+
/// - Parameter repositories: maven-style repositories to resolve
124137
/// - Returns: Colon-separated classpath
125-
func resolveDependencies(dependencies: [JavaDependencyDescriptor]) async -> String {
138+
func resolveDependencies(dependencies: [JavaDependencyDescriptor], repositories: [JavaRepositoryDescriptor]) async -> String {
126139
let workDir = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
127140
.appendingPathComponent(".build")
128141
let resolverDir = try! createTemporaryDirectory(in: workDir)
@@ -135,7 +148,7 @@ extension SwiftJava.ResolveCommand {
135148

136149
try! copyGradlew(to: resolverDir)
137150

138-
try! printGradleProject(directory: resolverDir, dependencies: dependencies)
151+
try! printGradleProject(directory: resolverDir, dependencies: dependencies, repositories: repositories)
139152

140153
if #available(macOS 15, *) {
141154
let process = try! await _Subprocess.run(
@@ -173,14 +186,16 @@ extension SwiftJava.ResolveCommand {
173186
}
174187

175188
/// Creates Gradle project files (build.gradle, settings.gradle.kts) in temporary directory.
176-
func printGradleProject(directory: URL, dependencies: [JavaDependencyDescriptor]) throws {
189+
func printGradleProject(directory: URL, dependencies: [JavaDependencyDescriptor], repositories: [JavaRepositoryDescriptor]) throws {
177190
let buildGradle = directory
178191
.appendingPathComponent("build.gradle", isDirectory: false)
179192

180193
let buildGradleText =
181194
"""
182195
plugins { id 'java-library' }
183-
repositories { mavenCentral() }
196+
repositories {
197+
\(repositories.compactMap(\.descriptionGradleStyle).joined(separator: "\n"))
198+
}
184199
185200
dependencies {
186201
\(dependencies.map({ dep in "implementation(\"\(dep.descriptionGradleStyle)\")" }).joined(separator: ",\n"))

0 commit comments

Comments
 (0)