Skip to content

Commit ea746c3

Browse files
authored
use identity instead of location where possible (#3744)
motivation: adoption of SE-0292 package registry changes: * remove assumption and runtime check about RepositoprySpecifie available for all PacakgeRefrences * adjust call-sites and test
1 parent 5d3db35 commit ea746c3

File tree

10 files changed

+69
-57
lines changed

10 files changed

+69
-57
lines changed

Sources/PackageGraph/LocalPackageContainer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public final class LocalPackageContainer: PackageContainer {
4242
let toolsVersion = try self.toolsVersionLoader.load(at: AbsolutePath(self.package.location), fileSystem: self.fileSystem)
4343

4444
// Validate the tools version.
45-
try toolsVersion.validateToolsVersion(self.currentToolsVersion, packagePath: self.package.location)
45+
try toolsVersion.validateToolsVersion(self.currentToolsVersion, packageIdentity: self.package.identity)
4646

4747
// Load the manifest.
4848
// FIXME: this should not block

Sources/PackageGraph/PackageModel+Extensions.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,3 @@ extension PackageContainerConstraint {
7070
}
7171
}
7272
}
73-
74-
extension PackageReference {
75-
/// The repository of the package.
76-
///
77-
/// This should only be accessed when the reference is not local.
78-
public var repository: RepositorySpecifier {
79-
precondition(kind == .remote)
80-
return RepositorySpecifier(url: self.location)
81-
}
82-
}

Sources/PackageGraph/RepositoryPackageContainer.swift

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
2929
// about the container to identify it for diagnostics.
3030
public struct GetDependenciesError: Error, CustomStringConvertible, DiagnosticLocationProviding {
3131

32-
/// The container (repository) that encountered the error.
33-
public let containerIdentifier: String
32+
/// The repository url that encountered the error.
33+
public let url: String
3434

3535
/// The source control reference (version, branch, revision, etc) that was involved.
3636
public let reference: String
@@ -42,12 +42,12 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
4242
public let suggestion: String?
4343

4444
public var diagnosticLocation: DiagnosticLocation? {
45-
return PackageLocation.Remote(url: containerIdentifier, reference: reference)
45+
return PackageLocation.Remote(url: self.url, reference: self.reference)
4646
}
4747

4848
/// Description shown for errors of this kind.
4949
public var description: String {
50-
var desc = "\(underlyingError) in \(containerIdentifier)"
50+
var desc = "\(underlyingError) in \(self.url)"
5151
if let suggestion = suggestion {
5252
desc += " (\(suggestion))"
5353
}
@@ -175,7 +175,7 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
175175
}.1
176176
} catch {
177177
throw GetDependenciesError(
178-
containerIdentifier: package.repository.url, reference: version.description, underlyingError: error, suggestion: nil)
178+
url: package.location, reference: version.description, underlyingError: error, suggestion: nil)
179179
}
180180
}
181181

@@ -193,7 +193,11 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
193193
if let rev = try? repository.resolveRevision(identifier: revision), repository.exists(revision: rev) {
194194
// Revision does exist, so something else must be wrong.
195195
throw GetDependenciesError(
196-
containerIdentifier: package.repository.url, reference: revision, underlyingError: error, suggestion: nil)
196+
url: package.location,
197+
reference: revision,
198+
underlyingError: error,
199+
suggestion: .none
200+
)
197201
}
198202
else {
199203
// Revision does not exist, so we customize the error.
@@ -203,12 +207,20 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
203207
let mainBranchExists = (try? repository.resolveRevision(identifier: "main")) != nil
204208
let suggestion = (revision == "master" && mainBranchExists) ? "did you mean ‘main’?" : nil
205209
throw GetDependenciesError(
206-
containerIdentifier: package.repository.url, reference: revision,
207-
underlyingError: StringError(errorMessage), suggestion: suggestion)
210+
url: package.location,
211+
reference: revision,
212+
underlyingError: StringError(errorMessage),
213+
suggestion: suggestion
214+
)
208215
}
209216
}
210217
// If we get this far without having thrown an error, we wrap and throw the underlying error.
211-
throw GetDependenciesError(containerIdentifier: package.repository.url, reference: revision, underlyingError: error, suggestion: nil)
218+
throw GetDependenciesError(
219+
url: package.location,
220+
reference: revision,
221+
underlyingError: error,
222+
suggestion: .none
223+
)
212224
}
213225
}
214226

@@ -277,7 +289,7 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
277289
/// version of the package manager.
278290
private func isValidToolsVersion(_ toolsVersion: ToolsVersion) -> Bool {
279291
do {
280-
try toolsVersion.validateToolsVersion(currentToolsVersion, packagePath: "")
292+
try toolsVersion.validateToolsVersion(currentToolsVersion, packageIdentity: .plain("unknown"))
281293
return true
282294
} catch {
283295
return false
@@ -303,22 +315,20 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
303315
}
304316

305317
private func loadManifest(fileSystem: FileSystem, version: Version?, packageVersion: String) throws -> Manifest {
306-
let packageLocation = self.package.repository.url
307-
308318
// Load the tools version.
309319
let toolsVersion = try self.toolsVersionLoader.load(at: .root, fileSystem: fileSystem)
310320

311321
// Validate the tools version.
312322
try toolsVersion.validateToolsVersion(
313-
self.currentToolsVersion, packagePath: packageLocation, packageVersion: packageVersion)
323+
self.currentToolsVersion, packageIdentity: self.package.identity, packageVersion: packageVersion)
314324

315325
// Load the manifest.
316326
// FIXME: this should not block
317327
return try temp_await {
318328
self.manifestLoader.load(at: AbsolutePath.root,
319329
packageIdentity: self.package.identity,
320330
packageKind: self.package.kind,
321-
packageLocation: packageLocation,
331+
packageLocation: self.package.location,
322332
version: version,
323333
revision: nil,
324334
toolsVersion: toolsVersion,
@@ -335,7 +345,7 @@ public class RepositoryPackageContainer: PackageContainer, CustomStringConvertib
335345
}
336346

337347
public var description: String {
338-
return "RepositoryPackageContainer(\(package.repository.url.debugDescription))"
348+
return "RepositoryPackageContainer(\(self.package.location))"
339349
}
340350
}
341351

@@ -400,7 +410,7 @@ public class RepositoryPackageContainerProvider: PackageContainerProvider {
400410
}
401411

402412
// Resolve the container using the repository manager.
403-
repositoryManager.lookup(repository: package.repository, skipUpdate: skipUpdate, on: queue) { result in
413+
repositoryManager.lookup(repository: .init(url: package.location), skipUpdate: skipUpdate, on: queue) { result in
404414
queue.async {
405415
// Create the container wrapper.
406416
let result = result.tryMap { handle -> PackageContainer in

Sources/PackageModel/Diagnostics.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import TSCUtility
1515

1616
/// The diagnostic triggered when the package has a newer tools version than the installed tools.
1717
public struct RequireNewerTools: DiagnosticData, Swift.Error {
18-
/// The path of the package.
19-
public let packagePath: String
18+
/// The identity of the package.
19+
public let packageIdentity: PackageIdentity
2020

2121
/// The version of the package.
2222
public let packageVersion: String?
@@ -28,19 +28,19 @@ public struct RequireNewerTools: DiagnosticData, Swift.Error {
2828
public let packageToolsVersion: ToolsVersion
2929

3030
public init(
31-
packagePath: String,
31+
packageIdentity: PackageIdentity,
3232
packageVersion: String? = nil,
3333
installedToolsVersion: ToolsVersion,
3434
packageToolsVersion: ToolsVersion
3535
) {
36-
self.packagePath = packagePath
36+
self.packageIdentity = packageIdentity
3737
self.packageVersion = packageVersion
3838
self.installedToolsVersion = installedToolsVersion
3939
self.packageToolsVersion = packageToolsVersion
4040
}
4141

4242
public var description: String {
43-
var text = "package at '\(packagePath)'"
43+
var text = "package '\(self.packageIdentity)'"
4444
if let version = self.packageVersion {
4545
text += " @ \(version)"
4646
}
@@ -51,8 +51,8 @@ public struct RequireNewerTools: DiagnosticData, Swift.Error {
5151

5252
/// The diagnostic triggered when the package has an unsupported tools version.
5353
public struct UnsupportedToolsVersion: DiagnosticData, Swift.Error {
54-
/// The path of the package.
55-
public let packagePath: String
54+
/// The identity of the package.
55+
public let packageIdentity: PackageIdentity
5656

5757
/// The version of the package.
5858
public let packageVersion: String?
@@ -68,19 +68,19 @@ public struct UnsupportedToolsVersion: DiagnosticData, Swift.Error {
6868
}
6969

7070
public init(
71-
packagePath: String,
71+
packageIdentity: PackageIdentity,
7272
packageVersion: String? = nil,
7373
currentToolsVersion: ToolsVersion,
7474
packageToolsVersion: ToolsVersion
7575
) {
76-
self.packagePath = packagePath
76+
self.packageIdentity = packageIdentity
7777
self.packageVersion = packageVersion
7878
self.currentToolsVersion = currentToolsVersion
7979
self.packageToolsVersion = packageToolsVersion
8080
}
8181

8282
public var description: String {
83-
var text = "package at '\(self.packagePath)'"
83+
var text = "package '\(self.packageIdentity)'"
8484
if let version = self.packageVersion {
8585
text += " @ \(version)"
8686
}

Sources/PackageModel/ToolsVersion.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ public struct ToolsVersion: Equatable, Hashable, Codable {
104104
/// version of the package manager.
105105
public func validateToolsVersion(
106106
_ currentToolsVersion: ToolsVersion,
107-
packagePath: String,
108-
packageVersion: String? = nil
107+
packageIdentity: PackageIdentity,
108+
packageVersion: String? = .none
109109
) throws {
110110
// We don't want to throw any error when using the special vNext version.
111111
if SwiftVersion.currentVersion.isDevelopment && self == .vNext {
@@ -115,7 +115,7 @@ public struct ToolsVersion: Equatable, Hashable, Codable {
115115
// Make sure the package has the right minimum tools version.
116116
guard self >= .minimumRequired else {
117117
throw UnsupportedToolsVersion(
118-
packagePath: packagePath,
118+
packageIdentity: packageIdentity,
119119
packageVersion: packageVersion,
120120
currentToolsVersion: currentToolsVersion,
121121
packageToolsVersion: self
@@ -125,7 +125,7 @@ public struct ToolsVersion: Equatable, Hashable, Codable {
125125
// Make sure the package isn't newer than the current tools version.
126126
guard currentToolsVersion >= self else {
127127
throw RequireNewerTools(
128-
packagePath: packagePath,
128+
packageIdentity: packageIdentity,
129129
packageVersion: packageVersion,
130130
installedToolsVersion: currentToolsVersion,
131131
packageToolsVersion: self

Sources/Workspace/ResolverPrecomputationProvider.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private struct LocalPackageContainer: PackageContainer {
105105

106106
func isToolsVersionCompatible(at version: Version) -> Bool {
107107
do {
108-
try manifest.toolsVersion.validateToolsVersion(currentToolsVersion, packagePath: "")
108+
try manifest.toolsVersion.validateToolsVersion(currentToolsVersion, packageIdentity: .plain("unknown"))
109109
return true
110110
} catch {
111111
return false

Sources/Workspace/Workspace.swift

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ extension Workspace {
10401040
self.loadManifest(packageIdentity: dependency.packageRef.identity,
10411041
packageKind: .local,
10421042
packagePath: destination,
1043-
packageLocation: dependency.packageRef.repository.url,
1043+
packageLocation: dependency.packageRef.location,
10441044
diagnostics: diagnostics,
10451045
completion: $0)
10461046
}
@@ -1066,7 +1066,7 @@ extension Workspace {
10661066
// Get handle to the repository.
10671067
// TODO: replace with async/await when available
10681068
let handle = try temp_await {
1069-
repositoryManager.lookup(repository: dependency.packageRef.repository, skipUpdate: true, on: .sharedConcurrent, completion: $0)
1069+
repositoryManager.lookup(repository: .init(url: dependency.packageRef.location), skipUpdate: true, on: .sharedConcurrent, completion: $0)
10701070
}
10711071
let repo = try handle.open()
10721072

@@ -1634,7 +1634,7 @@ extension Workspace {
16341634
let toolsVersion = try toolsVersionLoader.load(at: packagePath, fileSystem: fileSystem)
16351635

16361636
// Validate the tools version.
1637-
try toolsVersion.validateToolsVersion(currentToolsVersion, packagePath: packagePath.pathString)
1637+
try toolsVersion.validateToolsVersion(currentToolsVersion, packageIdentity: packageIdentity)
16381638

16391639
// Load the manifest.
16401640
// The delegate callback is only passed any diagnostics emitted during the parsing of the manifest, but they are also forwarded up to the caller.
@@ -2687,14 +2687,19 @@ extension Workspace {
26872687
}
26882688
}
26892689

2690+
guard case .remote = package.kind else {
2691+
throw InternalError("invalid package kind \(package.kind)")
2692+
}
2693+
let repository = RepositorySpecifier(url: package.location)
2694+
26902695
// If not, we need to get the repository from the checkouts.
26912696
// FIXME: this should not block
26922697
let handle = try temp_await {
2693-
repositoryManager.lookup(repository: package.repository, skipUpdate: true, on: .sharedConcurrent, completion: $0)
2698+
repositoryManager.lookup(repository: repository, skipUpdate: true, on: .sharedConcurrent, completion: $0)
26942699
}
26952700

26962701
// Clone the repository into the checkouts.
2697-
let path = self.location.repositoriesCheckoutsDirectory.appending(component: package.repository.basename)
2702+
let path = self.location.repositoriesCheckoutsDirectory.appending(component: repository.basename)
26982703

26992704
try fileSystem.chmod(.userWritable, path: path, options: [.recursive, .onlyFiles])
27002705
try fileSystem.removeFileTree(path)
@@ -2721,14 +2726,18 @@ extension Workspace {
27212726
package: PackageReference,
27222727
at checkoutState: CheckoutState
27232728
) throws -> AbsolutePath {
2729+
guard case .remote = package.kind else {
2730+
throw InternalError("invalid package kind \(package.kind)")
2731+
}
2732+
27242733
// Get the repository.
27252734
let path = try fetch(package: package)
27262735

27272736
// Check out the given revision.
27282737
let workingCopy = try repositoryManager.openWorkingCopy(at: path)
27292738

27302739
// Inform the delegate.
2731-
delegate?.willCheckOut(repository: package.repository.url, revision: checkoutState.description, at: path)
2740+
delegate?.willCheckOut(repository: package.location, revision: checkoutState.description, at: path)
27322741

27332742
// Do mutable-immutable dance because checkout operation modifies the disk state.
27342743
try fileSystem.chmod(.userWritable, path: path, options: [.recursive, .onlyFiles])
@@ -2742,7 +2751,7 @@ extension Workspace {
27422751
checkoutState: checkoutState))
27432752
try state.saveState()
27442753

2745-
delegate?.didCheckOut(repository: package.repository.url, revision: checkoutState.description, at: path, error: nil)
2754+
delegate?.didCheckOut(repository: package.location, revision: checkoutState.description, at: path, error: nil)
27462755

27472756
return path
27482757
}
@@ -2789,7 +2798,6 @@ extension Workspace {
27892798

27902799
/// Removes the clone and checkout of the provided specifier.
27912800
fileprivate func remove(package: PackageReference) throws {
2792-
27932801
guard let dependency = state.dependencies[forURL: package.location] else {
27942802
throw InternalError("trying to remove \(package.name) which isn't in workspace")
27952803
}
@@ -2808,7 +2816,7 @@ extension Workspace {
28082816
}
28092817

28102818
// Inform the delegate.
2811-
delegate?.removing(repository: dependency.packageRef.repository.url)
2819+
delegate?.removing(repository: dependency.packageRef.location)
28122820

28132821
// Compute the dependency which we need to remove.
28142822
let dependencyToRemove: ManagedDependency
@@ -2823,6 +2831,10 @@ extension Workspace {
28232831
state.dependencies.remove(forURL: dependencyToRemove.packageRef.location)
28242832
}
28252833

2834+
guard case .remote = dependencyToRemove.packageRef.kind else {
2835+
throw InternalError("invalid package kind \(dependencyToRemove.packageRef.kind)")
2836+
}
2837+
28262838
// Remove the checkout.
28272839
let dependencyPath = self.location.repositoriesCheckoutsDirectory.appending(dependencyToRemove.subpath)
28282840
let workingCopy = try repositoryManager.openWorkingCopy(at: dependencyPath)
@@ -2834,7 +2846,7 @@ extension Workspace {
28342846
try fileSystem.removeFileTree(dependencyPath)
28352847

28362848
// Remove the clone.
2837-
try repositoryManager.remove(repository: dependencyToRemove.packageRef.repository)
2849+
try repositoryManager.remove(repository: .init(url: dependencyToRemove.packageRef.location))
28382850

28392851
// Save the state.
28402852
try state.saveState()

Tests/CommandsTests/PackageToolTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ final class PackageToolTests: XCTestCase {
768768
let path = try SwiftPMProduct.packagePath(for: pkg, packageRoot: fooPath)
769769
let pin = pinsStore.pinsMap[PackageIdentity(path: path)]!
770770
XCTAssertEqual(pin.packageRef.identity, PackageIdentity(path: path))
771-
XCTAssert(pin.packageRef.repository.url.hasSuffix(pkg))
771+
XCTAssert(pin.packageRef.location.hasSuffix(pkg))
772772
XCTAssertEqual(pin.state.version, "1.2.3")
773773
}
774774
}

Tests/PackageGraphTests/RepositoryPackageContainerProviderTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ class RepositoryPackageContainerProviderTests: XCTestCase {
286286
_ = try container.getDependencies(at: revision.identifier, productFilter: .nothing)
287287
} catch let error as RepositoryPackageContainer.GetDependenciesError {
288288
let error = error.underlyingError as! UnsupportedToolsVersion
289-
XCTAssertMatch(error.description, .and(.prefix("package at '/' @"), .suffix("is using Swift tools version 3.1.0 which is no longer supported; consider using '// swift-tools-version:4.0' to specify the current tools version")))
289+
XCTAssertMatch(error.description, .and(.prefix("package '\(PackageIdentity(url: specifier.url))' @"), .suffix("is using Swift tools version 3.1.0 which is no longer supported; consider using '// swift-tools-version:4.0' to specify the current tools version")))
290290
}
291291
}
292292
}

0 commit comments

Comments
 (0)