Skip to content

Commit 40fd8e1

Browse files
Merge pull request #16 from justeattakeaway/swift-package-registry-opt-in
Allow Swift Registry opt-in (off by default)
2 parents ca8abdb + 4ff1ee6 commit 40fd8e1

File tree

16 files changed

+231
-32
lines changed

16 files changed

+231
-32
lines changed

.swiftpm/xcode/xcshareddata/xcschemes/GeneratePackage.xcscheme

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@
7878
argument = "--template Templates/Package.stencil"
7979
isEnabled = "YES">
8080
</CommandLineArgument>
81+
<CommandLineArgument
82+
argument = "--use-swift-registry"
83+
isEnabled = "NO">
84+
</CommandLineArgument>
8185
<CommandLineArgument
8286
argument = "--dependencies-as-binary-targets"
8387
isEnabled = "NO">

.swiftpm/xcode/xcshareddata/xcschemes/GenerateTuistPackage.xcscheme

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@
8282
argument = "--modules-relative-path Modules"
8383
isEnabled = "YES">
8484
</CommandLineArgument>
85+
<CommandLineArgument
86+
argument = "--use-swift-registry"
87+
isEnabled = "NO">
88+
</CommandLineArgument>
8589
<CommandLineArgument
8690
argument = "--output Tuist"
8791
isEnabled = "YES">

Sources/Commands/GeneratePackage.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ struct GeneratePackage: AsyncParsableCommand {
1515
@Option(name: .long, help: "Path to a template file (supported formats: stencil).")
1616
var template: String
1717

18+
@Flag(name: .long, help: "Whether to use a Swift Registry.")
19+
var useSwiftRegistry: Bool = false
20+
1821
@OptionGroup()
1922
var cachingFlags: CachingFlags
2023

@@ -52,7 +55,8 @@ struct GeneratePackage: AsyncParsableCommand {
5255
at: specUrl.deletingLastPathComponent(),
5356
filename: Constants.packageFile,
5457
specUrl: specUrl,
55-
dependencyTreatment: dependencyTreatment
58+
dependencyTreatment: dependencyTreatment,
59+
useRegistry: useSwiftRegistry
5660
)
5761
}
5862

@@ -82,7 +86,7 @@ struct GeneratePackage: AsyncParsableCommand {
8286
if !allowedSharedLocalDependencies.isEmpty {
8387
let specUrl = URL(filePath: spec, directoryHint: .notDirectory)
8488
let packageDependenciesUrl = URL(filePath: packageDependencies, directoryHint: .notDirectory)
85-
let spec = try SpecGenerator().makeSpec(specUrl: specUrl, dependenciesUrl: packageDependenciesUrl)
89+
let spec = try SpecGenerator().makeSpec(specUrl: specUrl, dependenciesUrl: packageDependenciesUrl, useRegistry: useSwiftRegistry)
8690
let validator = DependenciesValidator(allowedSharedLocalDependencies: allowedSharedLocalDependencies)
8791
try validator.validateSharedLocalDependencies(spec)
8892
}

Sources/Commands/GenerateTuistPackage.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ struct GenerateTuistPackage: AsyncParsableCommand {
1818
@Option(name: .long, help: "Path to a template file (supported formats: stencil).")
1919
var template: String
2020

21+
@Flag(name: .long, help: "Whether to use a Swift Registry.")
22+
var useSwiftRegistry: Bool = false
23+
2124
@Option(name: .long, help: "Path to a folder containing the modules in individual folders (default to 'Modules'). Relative to the root of the repository. Required if targetDependencies contains local dependencies.")
2225
var modulesRelativePath: String = "Modules"
2326

@@ -37,7 +40,8 @@ struct GenerateTuistPackage: AsyncParsableCommand {
3740
try await generator.generateTuistPackage(
3841
at: outputPath,
3942
targetDependenciesUrl: targetDependenciesUrl,
40-
modulesRelativePath: modulesRelativePath
43+
modulesRelativePath: modulesRelativePath,
44+
useRegistry: useSwiftRegistry
4145
)
4246
}
4347

Sources/Core/ContentGenerator.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@ import Foundation
44

55
struct ContentGenerator {
66

7-
func content(for spec: Spec, templateUrl: URL) throws -> Content {
7+
func content(for spec: Spec, templateUrl: URL, useRegistry: Bool) throws -> Content {
88
let templater = Templater(templateUrl: templateUrl)
9-
return try templater.renderTemplate(context: spec.makeContext())
9+
return try templater.renderTemplate(context: spec.makeContext(useRegistry: useRegistry))
1010
}
1111

12-
func content(packageDependencies: Dependencies, targetDependencies: TargetDependencies, templateUrl: URL, modulesRelativePath: String) throws -> Content {
12+
func content(
13+
packageDependencies: Dependencies,
14+
targetDependencies: TargetDependencies,
15+
templateUrl: URL,
16+
modulesRelativePath: String,
17+
useRegistry: Bool
18+
) throws -> Content {
1319
let localTargetDependencies = targetDependencies.dependencies
1420
.filter { $0.type == .local }
1521
.reduce(into: [TargetDependency]()) { result, element in
@@ -29,7 +35,7 @@ struct ContentGenerator {
2935
.map { localTargetDependency in
3036
let localModule: [String: String] = [
3137
"name": localTargetDependency.name,
32-
// the ../ is needed as Package.swift is meant ot be in the Tuist folder
38+
// the ../ is needed as Package.swift is meant to be in the Tuist folder
3339
"path": "../\(modulesRelativePath)/\(localTargetDependency.name)"
3440
]
3541
return localModule
@@ -51,7 +57,7 @@ struct ContentGenerator {
5157
.isEmpty
5258
})
5359

54-
var final = Dependencies(dependencies: filteredDependencies).makeContext()
60+
var final = Dependencies(dependencies: filteredDependencies).makeContext(useRegistry: useRegistry)
5561
final["local_modules"] = localModulesDicts
5662

5763
let templater = Templater(templateUrl: templateUrl)

Sources/Core/Generator.swift

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,17 @@ struct Generator {
2929
}
3030

3131
@discardableResult
32-
func generatePackage(at outputUrl: URL, filename: String, specUrl: URL, dependencyTreatment: DependencyTreatment) async throws -> Path {
33-
let spec = try SpecGenerator().makeSpec(specUrl: specUrl, dependenciesUrl: packageDependenciesUrl)
34-
let content = try ContentGenerator().content(for: spec, templateUrl: templateUrl)
32+
func generatePackage(at outputUrl: URL, filename: String, specUrl: URL, dependencyTreatment: DependencyTreatment, useRegistry: Bool) async throws -> Path {
33+
let spec = try SpecGenerator().makeSpec(
34+
specUrl: specUrl,
35+
dependenciesUrl: packageDependenciesUrl,
36+
useRegistry: useRegistry
37+
)
38+
let content = try ContentGenerator().content(
39+
for: spec,
40+
templateUrl: templateUrl,
41+
useRegistry: useRegistry
42+
)
3543
let outputFilePath = try writer.write(
3644
content: content,
3745
folder: outputUrl,
@@ -53,7 +61,11 @@ struct Generator {
5361
versionRefsPath: versionRefsPath,
5462
exclusions: exclusions
5563
)
56-
let content = try ContentGenerator().content(for: convertedSpec, templateUrl: templateUrl)
64+
let content = try ContentGenerator().content(
65+
for: convertedSpec,
66+
templateUrl: templateUrl,
67+
useRegistry: useRegistry
68+
)
5769
let path = try writer.write(
5870
content: content,
5971
folder: outputUrl,
@@ -65,15 +77,21 @@ struct Generator {
6577
}
6678

6779
@discardableResult
68-
func generateTuistPackage(at outputUrl: URL, targetDependenciesUrl: URL, modulesRelativePath: String) async throws -> Path {
80+
func generateTuistPackage(
81+
at outputUrl: URL,
82+
targetDependenciesUrl: URL,
83+
modulesRelativePath: String,
84+
useRegistry: Bool
85+
) async throws -> Path {
6986
let packageDependencies: Dependencies = try DTOLoader().loadDTO(url: packageDependenciesUrl)
7087
let targetDependencies: TargetDependencies = try DTOLoader().loadDTO(url: targetDependenciesUrl)
7188

7289
let content = try ContentGenerator().content(
7390
packageDependencies: packageDependencies,
7491
targetDependencies: targetDependencies,
7592
templateUrl: templateUrl,
76-
modulesRelativePath: modulesRelativePath
93+
modulesRelativePath: modulesRelativePath,
94+
useRegistry: useRegistry
7795
)
7896
let outputFilePath = try writer.write(
7997
content: content,

Sources/Core/SpecGenerator.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ final class SpecGenerator {
1515
/// - Parameters:
1616
/// - packagesFolder: Path to the package spec.
1717
/// - dependenciesUrl: Path to the dependencies file.
18+
/// - useRegistry: Whether to use a Swift Registry.
1819
/// - Returns: A Spec model.
19-
func makeSpec(specUrl: URL, dependenciesUrl: URL) throws -> Spec {
20+
func makeSpec(specUrl: URL, dependenciesUrl: URL, useRegistry: Bool) throws -> Spec {
2021
let spec: Spec = try DTOLoader().loadDTO(url: specUrl)
2122
let dependencies: Dependencies = try DTOLoader().loadDTO(url: dependenciesUrl)
2223

@@ -40,9 +41,15 @@ final class SpecGenerator {
4041
.compactMap { target -> Spec.Target in
4142
let mappedDependencies = target.dependencies
4243
.compactMap { dependency -> Spec.TargetDependency in
43-
let package = dependencies.dependencies.first(where: {
44-
$0.name == dependency.dependency
45-
})?.identifier ?? dependency.package
44+
let package = {
45+
if useRegistry {
46+
dependencies.dependencies.first(where: {
47+
$0.name == dependency.dependency
48+
})?.identifier ?? dependency.package
49+
} else {
50+
dependency.package
51+
}
52+
}()
4653
return Spec.TargetDependency(
4754
name: dependency.name,
4855
package: package,

Sources/Extensions/Dependencies+Context.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import Foundation
44

55
extension Dependencies {
6-
func makeContext() -> [String: Any] {
6+
func makeContext(useRegistry: Bool) -> [String: Any] {
77
let remoteDependencies = self.dependencies.map { dependency in
88
var dict: [String: String] = [
99
"name": dependency.name,
1010
"url": dependency.url
1111
]
1212

13-
if let identifier = dependency.identifier {
13+
if useRegistry, let identifier = dependency.identifier {
1414
dict["identifier"] = identifier
1515
}
1616

Sources/Extensions/Spec+Context.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ extension Spec.Product {
1717
}
1818

1919
extension Spec.RemoteDependency {
20-
func makeContext() -> [String: Any] {
20+
func makeContext(useRegistry: Bool) -> [String: Any] {
2121
var retVal = [
2222
"name": name,
23-
"url": url,
24-
"identifier": identifier
23+
"url": url
2524
]
25+
26+
if useRegistry {
27+
retVal["identifier"] = identifier
28+
}
29+
2630
if let ref {
2731
switch ref {
2832
case .branch(let value):
@@ -46,12 +50,12 @@ extension Spec {
4650
return nil
4751
}
4852

49-
func makeContext() -> [String: Any] {
53+
func makeContext(useRegistry: Bool) -> [String: Any] {
5054
let values: [String: Any?] = [
5155
"package_name": name,
5256
"platforms": platforms,
5357
"local_dependencies": localDependencies,
54-
"remote_dependencies": remoteDependencies.map { $0.makeContext() },
58+
"remote_dependencies": remoteDependencies.map { $0.makeContext(useRegistry: useRegistry) },
5559
"products": products.map { $0.makeContext() },
5660
"targets": targets,
5761
"local_binary_targets": localBinaryTargets,

Tests/GeneratorTests.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ final class GeneratorTests: XCTestCase {
2020
case complexTargets = "ComplexTargets"
2121
case executableProduct = "ExecutableProduct"
2222
case plugins = "PluginProduct"
23-
case registry = "Registry"
23+
case registryDisabled = "RegistryDisabled"
24+
case registryEnabled = "RegistryEnabled"
2425
case dependenciesAsBinaryTargets = "DependenciesAsBinaryTargets"
2526
case dependenciesAsBinaryTargetsWithExclusions = "DependenciesAsBinaryTargetsWithExclusions"
2627
case tuist = "Tuist"
@@ -78,8 +79,12 @@ final class GeneratorTests: XCTestCase {
7879
try await assertPackage(for: .plugins)
7980
}
8081

81-
func test_registry() async throws {
82-
try await assertPackage(for: .registry)
82+
func test_registry_useRegistryFalse() async throws {
83+
try await assertPackage(for: .registryDisabled, useRegistry: false)
84+
}
85+
86+
func test_registry_useRegistryTrue() async throws {
87+
try await assertPackage(for: .registryEnabled, useRegistry: true)
8388
}
8489

8590
func test_dependenciesAsBinaryTargets() async throws {
@@ -94,7 +99,7 @@ final class GeneratorTests: XCTestCase {
9499
try await assertTuistPackage(for: .tuist)
95100
}
96101

97-
private func assertPackage(for packageType: PackageType) async throws {
102+
private func assertPackage(for packageType: PackageType, useRegistry: Bool = false) async throws {
98103
for format in SupportedFormat.allCases {
99104
let specUrl = packagesFolderUrl
100105
.appendingPathComponent(packageType.rawValue)
@@ -122,7 +127,8 @@ final class GeneratorTests: XCTestCase {
122127
at: fileManager.temporaryDirectory,
123128
filename: "Package.swift",
124129
specUrl: specUrl,
125-
dependencyTreatment: .standard
130+
dependencyTreatment: .standard,
131+
useRegistry: useRegistry
126132
)
127133

128134
let sutPackageContent = try String(contentsOf: sutPackageUrl)
@@ -168,7 +174,8 @@ final class GeneratorTests: XCTestCase {
168174
relativeDependenciesPath: "../.xcframeworks",
169175
versionRefsPath: versionRefsUrl.path(),
170176
exclusions: exclusions
171-
)
177+
),
178+
useRegistry: false
172179
)
173180

174181
let sutPackageContent = try String(contentsOf: sutPackageUrl)
@@ -204,7 +211,8 @@ final class GeneratorTests: XCTestCase {
204211
let sutPackageUrl = try await generator.generateTuistPackage(
205212
at: fileManager.temporaryDirectory,
206213
targetDependenciesUrl: targetDependenciesUrl,
207-
modulesRelativePath: "Modules"
214+
modulesRelativePath: "Modules",
215+
useRegistry: false
208216
)
209217

210218
let sutPackageContent = try String(contentsOf: sutPackageUrl)

0 commit comments

Comments
 (0)