Skip to content

Commit c9073bd

Browse files
committed
Add relativePath
1 parent 74f06f8 commit c9073bd

File tree

7 files changed

+123
-109
lines changed

7 files changed

+123
-109
lines changed

Sources/Commands/PackageCommands/AddDependency.swift

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,6 @@ extension SwiftPackageCommand {
9393
workspace: Workspace,
9494
url: String
9595
) throws {
96-
let identity = PackageIdentity(url: .init(url))
97-
9896
// Collect all of the possible version requirements.
9997
var requirements: [PackageDependency.SourceControl.Requirement] = []
10098
if let exact {
@@ -144,17 +142,18 @@ extension SwiftPackageCommand {
144142
}
145143
}
146144

147-
let packageDependency: PackageDependency = .sourceControl(
148-
identity: identity,
149-
nameForTargetDependencyResolutionOnly: nil,
150-
location: .remote(.init(url)),
151-
requirement: requirement,
145+
let packageDependency: MappablePackageDependency = .init(
146+
parentPackagePath: packagePath,
147+
kind: .sourceControl(
148+
name: nil,
149+
location: url,
150+
requirement: requirement
151+
),
152152
productFilter: .everything,
153153
traits: []
154154
)
155155

156156
try applyEdits(
157-
packagePath: packagePath,
158157
workspace: workspace,
159158
packageDependency: packageDependency
160159
)
@@ -165,8 +164,6 @@ extension SwiftPackageCommand {
165164
workspace: Workspace,
166165
id: String
167166
) throws {
168-
let identity: PackageIdentity = .plain(id)
169-
170167
// Collect all of the possible version requirements.
171168
var requirements: [PackageDependency.Registry.Requirement] = []
172169
if let exact {
@@ -208,16 +205,17 @@ extension SwiftPackageCommand {
208205
}
209206
}
210207

211-
let packageDependency: PackageDependency = .registry(
212-
identity: identity,
213-
requirement: requirement,
208+
let packageDependency: MappablePackageDependency = .init(
209+
parentPackagePath: packagePath,
210+
kind: .registry(
211+
id: id,
212+
requirement: requirement
213+
),
214214
productFilter: .everything,
215215
traits: []
216216
)
217217

218-
219218
try applyEdits(
220-
packagePath: packagePath,
221219
workspace: workspace,
222220
packageDependency: packageDependency
223221
)
@@ -228,33 +226,29 @@ extension SwiftPackageCommand {
228226
workspace: Workspace,
229227
directory: String
230228
) throws {
231-
guard let path = try? Basics.AbsolutePath(validating: directory) else {
232-
throw StringError("Package path not found")
233-
}
234-
let identity = PackageIdentity(path: path)
235-
let packageDependency: PackageDependency = .fileSystem(
236-
identity: identity,
237-
nameForTargetDependencyResolutionOnly: nil,
238-
path: path,
229+
let packageDependency: MappablePackageDependency = .init(
230+
parentPackagePath: packagePath,
231+
kind: .fileSystem(
232+
name: nil,
233+
path: directory
234+
),
239235
productFilter: .everything,
240236
traits: []
241237
)
242238

243239
try applyEdits(
244-
packagePath: packagePath,
245240
workspace: workspace,
246241
packageDependency: packageDependency
247242
)
248243
}
249244

250245
private func applyEdits(
251-
packagePath: Basics.AbsolutePath,
252246
workspace: Workspace,
253-
packageDependency: PackageDependency
247+
packageDependency: MappablePackageDependency
254248
) throws {
255249
// Load the manifest file
256250
let fileSystem = workspace.fileSystem
257-
let manifestPath = packagePath.appending(component: Manifest.filename)
251+
let manifestPath = packageDependency.parentPackagePath.appending(component: Manifest.filename)
258252
let manifestContents: ByteString
259253
do {
260254
manifestContents = try fileSystem.readFileContents(manifestPath)

Sources/Commands/PackageCommands/AddTarget.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ extension SwiftPackageCommand {
114114

115115
let editResult = try PackageModelSyntax.AddTarget.addTarget(
116116
target,
117+
packagePath: packagePath,
117118
to: manifestSyntax,
118119
configuration: .init(testHarness: testingLibrary),
119120
installedSwiftPMConfiguration: swiftCommandState

Sources/PackageModelSyntax/AddPackageDependency.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public struct AddPackageDependency {
3434
/// Produce the set of source edits needed to add the given package
3535
/// dependency to the given manifest file.
3636
public static func addPackageDependency(
37-
_ dependency: PackageDependency,
37+
_ dependency: MappablePackageDependency,
3838
to manifest: SourceFileSyntax
3939
) throws -> PackageEditResult {
4040
// Make sure we have a suitable tools version in the manifest.
@@ -57,7 +57,7 @@ public struct AddPackageDependency {
5757

5858
/// Implementation of adding a package dependency to an existing call.
5959
static func addPackageDependencyLocal(
60-
_ dependency: PackageDependency,
60+
_ dependency: MappablePackageDependency,
6161
to packageCall: FunctionCallExprSyntax
6262
) throws -> FunctionCallExprSyntax {
6363
try packageCall.appendingToArrayArgument(

Sources/PackageModelSyntax/AddTarget.swift

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public struct AddTarget {
6262
/// new target.
6363
public static func addTarget(
6464
_ target: TargetDescription,
65+
packagePath: AbsolutePath,
6566
to manifest: SourceFileSyntax,
6667
configuration: Configuration = .init(),
6768
installedSwiftPMConfiguration: InstalledSwiftPMConfiguration = .default
@@ -140,7 +141,8 @@ public struct AddTarget {
140141
newPackageCall = try AddPackageDependency
141142
.addPackageDependencyLocal(
142143
.swiftSyntax(
143-
configuration: installedSwiftPMConfiguration
144+
packagePath: packagePath,
145+
configuration: installedSwiftPMConfiguration
144146
),
145147
to: newPackageCall
146148
)
@@ -168,6 +170,7 @@ public struct AddTarget {
168170
newPackageCall = try AddPackageDependency
169171
.addPackageDependencyLocal(
170172
.swiftTesting(
173+
packagePath: packagePath,
171174
configuration: installedSwiftPMConfiguration
172175
),
173176
to: newPackageCall
@@ -357,25 +360,28 @@ fileprivate let macroTargetDependencies: [TargetDescription.Dependency] = [
357360
]
358361

359362
/// The package dependency for swift-syntax, for use in macros.
360-
fileprivate extension PackageDependency {
363+
fileprivate extension MappablePackageDependency {
361364
/// Source control URL for the swift-syntax package.
362365
static var swiftSyntaxURL: SourceControlURL {
363366
"https://github.com/swiftlang/swift-syntax.git"
364367
}
365368

366369
/// Package dependency on the swift-syntax package.
367370
static func swiftSyntax(
368-
configuration: InstalledSwiftPMConfiguration
369-
) -> PackageDependency {
371+
packagePath: AbsolutePath,
372+
configuration: InstalledSwiftPMConfiguration
373+
) -> MappablePackageDependency {
370374
let swiftSyntaxVersionDefault = configuration
371375
.swiftSyntaxVersionForMacroTemplate
372376
let swiftSyntaxVersion = Version(swiftSyntaxVersionDefault.description)!
373377

374-
return .sourceControl(
375-
identity: PackageIdentity(url: swiftSyntaxURL),
376-
nameForTargetDependencyResolutionOnly: nil,
377-
location: .remote(swiftSyntaxURL),
378-
requirement: .range(.upToNextMajor(from: swiftSyntaxVersion)),
378+
return .init(
379+
parentPackagePath: packagePath,
380+
kind: .sourceControl(
381+
name: nil,
382+
location: swiftSyntaxURL.absoluteString,
383+
requirement: .range(.upToNextMajor(from: swiftSyntaxVersion))
384+
),
379385
productFilter: .everything,
380386
traits: []
381387
)
@@ -390,25 +396,28 @@ fileprivate let swiftTestingTestTargetDependencies: [TargetDescription.Dependenc
390396

391397

392398
/// The package dependency for swift-testing, for use in test files.
393-
fileprivate extension PackageDependency {
399+
fileprivate extension MappablePackageDependency {
394400
/// Source control URL for the swift-syntax package.
395401
static var swiftTestingURL: SourceControlURL {
396402
"https://github.com/apple/swift-testing.git"
397403
}
398404

399405
/// Package dependency on the swift-testing package.
400406
static func swiftTesting(
407+
packagePath: AbsolutePath,
401408
configuration: InstalledSwiftPMConfiguration
402-
) -> PackageDependency {
409+
) -> MappablePackageDependency {
403410
let swiftTestingVersionDefault =
404411
configuration.swiftTestingVersionForTestTemplate
405412
let swiftTestingVersion = Version(swiftTestingVersionDefault.description)!
406413

407-
return .sourceControl(
408-
identity: PackageIdentity(url: swiftTestingURL),
409-
nameForTargetDependencyResolutionOnly: nil,
410-
location: .remote(swiftTestingURL),
411-
requirement: .range(.upToNextMajor(from: swiftTestingVersion)),
414+
return .init(
415+
parentPackagePath: packagePath,
416+
kind: .sourceControl(
417+
name: nil,
418+
location: swiftTestingURL.absoluteString,
419+
requirement: .range(.upToNextMajor(from: swiftTestingVersion))
420+
),
412421
productFilter: .everything,
413422
traits: []
414423
)

Sources/PackageModelSyntax/PackageDependency+Syntax.swift renamed to Sources/PackageModelSyntax/MappablePackageDependency+Syntax.swift

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,15 @@ import SwiftParser
1616
import SwiftSyntax
1717
import struct TSCUtility.Version
1818

19-
extension PackageDependency: ManifestSyntaxRepresentable {
19+
extension MappablePackageDependency: ManifestSyntaxRepresentable {
2020
func asSyntax() -> ExprSyntax {
21-
switch self {
22-
case .fileSystem(let filesystem): filesystem.asSyntax()
23-
case .sourceControl(let sourceControl): sourceControl.asSyntax()
24-
case .registry(let registry): registry.asSyntax()
25-
}
26-
}
27-
}
28-
29-
extension PackageDependency.FileSystem: ManifestSyntaxRepresentable {
30-
func asSyntax() -> ExprSyntax {
31-
".package(path: \(literal: path.description))"
32-
}
33-
}
34-
35-
extension PackageDependency.SourceControl: ManifestSyntaxRepresentable {
36-
func asSyntax() -> ExprSyntax {
37-
// TODO: Not handling identity, nameForTargetDependencyResolutionOnly,
38-
// or productFilter yet.
39-
switch location {
40-
case .local:
41-
fatalError()
42-
case .remote(let url):
43-
".package(url: \(literal: url.description), \(requirement.asSyntax()))"
21+
switch self.kind {
22+
case .fileSystem(_, let path):
23+
".package(path: \(literal: path.description))"
24+
case .sourceControl(_, let location, let requirement):
25+
".package(url: \(literal: location.description), \(requirement.asSyntax()))"
26+
case .registry(let id, let requirement):
27+
".package(id: \(literal: id), \(requirement.asSyntax()))"
4428
}
4529
}
4630
}

Tests/CommandsTests/PackageCommandTests.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,18 @@ final class PackageCommandTests: CommandsTestCase {
894894
_ = try await execute(
895895
[
896896
"add-dependency",
897-
"/directory",
897+
"/absolute",
898+
"--type",
899+
"path"
900+
901+
],
902+
packagePath: path
903+
)
904+
905+
_ = try await execute(
906+
[
907+
"add-dependency",
908+
"../relative",
898909
"--type",
899910
"path"
900911

@@ -906,7 +917,8 @@ final class PackageCommandTests: CommandsTestCase {
906917
XCTAssertFileExists(manifest)
907918
let contents: String = try fs.readFileContents(manifest)
908919

909-
XCTAssertMatch(contents, .contains(#".package(path: "/directory"),"#))
920+
XCTAssertMatch(contents, .contains(#".package(path: "/absolute"),"#))
921+
XCTAssertMatch(contents, .contains(#".package(path: "../relative"),"#))
910922
}
911923
}
912924

0 commit comments

Comments
 (0)