Skip to content

Commit 9207ea7

Browse files
committed
Remove relativePath property from ManagedDependency
Begin transitioning to identity-based resolution
1 parent 2868726 commit 9207ea7

File tree

9 files changed

+121
-122
lines changed

9 files changed

+121
-122
lines changed

Sources/PackageModel/PackageIdentity.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal protocol PackageIdentityProvider: CustomStringConvertible {
2727
}
2828

2929
/// The canonical identifier for a package, based on its source location.
30-
public struct PackageIdentity: Hashable, CustomStringConvertible {
30+
public struct PackageIdentity: CustomStringConvertible {
3131
/// The underlying type used to create package identities.
3232
internal static var provider: PackageIdentityProvider.Type = LegacyPackageIdentity.self
3333

@@ -70,12 +70,24 @@ public struct PackageIdentity: Hashable, CustomStringConvertible {
7070
}
7171
}
7272

73+
extension PackageIdentity: Equatable {
74+
public static func == (lhs: PackageIdentity, rhs: PackageIdentity) -> Bool {
75+
return lhs.description.lowercased() == rhs.description.lowercased()
76+
}
77+
}
78+
7379
extension PackageIdentity: Comparable {
7480
public static func < (lhs: PackageIdentity, rhs: PackageIdentity) -> Bool {
7581
return lhs.description < rhs.description
7682
}
7783
}
7884

85+
extension PackageIdentity: Hashable {
86+
public func hash(into hasher: inout Hasher) {
87+
hasher.combine(description.lowercased())
88+
}
89+
}
90+
7991
extension PackageIdentity: Codable {
8092
public init(from decoder: Decoder) throws {
8193
let container = try decoder.singleValueContainer()

Sources/SPMTestSupport/MockManifestLoader.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public final class MockManifestLoader: ManifestLoaderProtocol {
3737
public let version: Version?
3838

3939
public init(url: String, version: Version? = nil) {
40-
self.url = url
40+
self.url = url.lowercased()
4141
self.version = version
4242
}
4343
}

Sources/SPMTestSupport/MockWorkspace.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ public final class MockWorkspace {
449449
}
450450

451451
public func check(notPresent name: String, file: StaticString = #file, line: UInt = #line) {
452-
let dependency = self.managedDependencies[forNameOrIdentity: name]
452+
let dependency = self.managedDependencies[named: name]
453453
XCTAssert(dependency == nil, "Unexpectedly found \(name) in managed dependencies", file: file, line: line)
454454
}
455455

@@ -458,14 +458,16 @@ public final class MockWorkspace {
458458
}
459459

460460
public func check(dependency name: String, at state: State, file: StaticString = #file, line: UInt = #line) {
461-
guard let dependency = managedDependencies[forNameOrIdentity: name] else {
461+
guard let dependency = managedDependencies[named: name] else {
462462
XCTFail("\(name) does not exists", file: file, line: line)
463463
return
464464
}
465+
465466
switch state {
466467
case .checkout(let checkoutState):
467468
guard case .checkout(let dependencyCheckoutState) = dependency.state else {
468-
return XCTFail("Expected checked out dependency; found '\(dependency.state)' instead", file: file, line: line)
469+
XCTFail("Expected checked out dependency; found '\(dependency.state)' instead", file: file, line: line)
470+
return
469471
}
470472

471473
switch checkoutState {

Sources/Workspace/EditedState.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import TSCBasic
1212

1313
public enum EditedState: Equatable {
1414
/// An edited dependency with a managed path relative to the editables directory.
15-
case managed(RelativePath)
15+
case managed
1616

1717
/// An edited dependency with an unmanaged, absolute path.
1818
case unmanaged(AbsolutePath)

Sources/Workspace/ManagedDependency.swift

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ public class ManagedDependency {
5757
}
5858
}
5959

60-
/// The checked out path of the dependency on disk, relative to the workspace checkouts path.
61-
public let subpath: RelativePath
62-
6360
/// A dependency which in editable state is based on a dependency from
6461
/// which it edited from.
6562
///
@@ -74,46 +71,28 @@ public class ManagedDependency {
7471
return ManagedDependency(
7572
package: package,
7673
state: .local,
77-
// FIXME: This is just a fake entry, we should fix it.
78-
subpath: RelativePath(package.identity.description),
7974
basedOn: nil
8075
)
8176
}
8277

8378
/// Create an editable managed dependency based on a dependency which
8479
/// was *not* in edit state.
8580
public static func checkout(package: PackageReference, state: CheckoutState) -> ManagedDependency {
86-
// FIXME: Temporary until subpath property is removed
87-
let subpath: RelativePath
88-
if let path = try? AbsolutePath(validating: package.location),
89-
let lastPathComponent = path.components.last {
90-
subpath = RelativePath(lastPathComponent)
91-
} else {
92-
subpath = RelativePath(package.identity.description)
93-
}
94-
95-
return ManagedDependency(package: package, state: .checkout(state), subpath: subpath, basedOn: nil)
81+
return ManagedDependency(package: package, state: .checkout(state), basedOn: nil)
9682
}
9783

9884
/// Create an editable managed dependency based on a dependency which
9985
/// was *not* in edit state.
10086
public static func edited(basedOn dependency: ManagedDependency, state: EditedState) -> ManagedDependency {
101-
switch state {
102-
case .managed(let path):
103-
return ManagedDependency(package: dependency.package, state: .edited(state), subpath: path, basedOn: dependency)
104-
case .unmanaged:
105-
return ManagedDependency(package: dependency.package, state: .edited(state), subpath: dependency.subpath, basedOn: dependency)
106-
}
87+
return ManagedDependency(package: dependency.package, state: .edited(state), basedOn: dependency)
10788
}
10889

10990
internal init(
11091
package: PackageReference,
11192
state: State,
112-
subpath: RelativePath,
11393
basedOn: ManagedDependency?
11494
) {
11595
self.package = package
116-
self.subpath = subpath
11796
self.basedOn = basedOn
11897
self.state = state
11998
}
@@ -131,59 +110,60 @@ extension ManagedDependency: CustomStringConvertible {
131110
/// A collection of managed dependencies.
132111
public final class ManagedDependencies {
133112
/// The dependencies keyed by the package URL.
134-
private var dependencyMap: [String: ManagedDependency]
113+
private var map: [PackageIdentity: ManagedDependency]
135114

136-
init(dependencyMap: [String: ManagedDependency] = [:]) {
137-
self.dependencyMap = dependencyMap
115+
init(_ dependencies: [ManagedDependency] = []) {
116+
self.map = Dictionary(zip( dependencies.map { $0.package.identity }, dependencies), uniquingKeysWith: { lhs, _ in lhs })
138117
}
139118

140-
public subscript(forURL url: String) -> ManagedDependency? {
141-
dependencyMap[url]
119+
public subscript(_ identity: PackageIdentity) -> ManagedDependency? {
120+
return map[identity]
121+
}
122+
123+
public subscript(named name: String) -> ManagedDependency? {
124+
return map[.plain(name)]
142125
}
143126

144-
public subscript(forIdentity identity: PackageIdentity) -> ManagedDependency? {
145-
dependencyMap.values.first(where: { $0.package.identity == identity })
127+
public subscript(forURL url: String) -> ManagedDependency? {
128+
return self[.init(url: url)]
146129
}
147130

148-
public subscript(forNameOrIdentity nameOrIdentity: String) -> ManagedDependency? {
149-
let lowercasedNameOrIdentity = nameOrIdentity.lowercased()
150-
return dependencyMap.values.first(where: {
151-
$0.package.name == nameOrIdentity || $0.package.identity.description == lowercasedNameOrIdentity
152-
})
131+
public subscript(atPath path: AbsolutePath) -> ManagedDependency? {
132+
return self[.init(path: path)]
153133
}
154134

155135
public func add(_ dependency: ManagedDependency) {
156-
self.dependencyMap[dependency.package.location] = dependency
136+
map[dependency.package.identity] = dependency
157137
}
158138

159-
public func remove(forURL url: String) {
160-
self.dependencyMap[url] = nil
139+
public func remove(_ dependency: ManagedDependency) {
140+
map[dependency.package.identity] = nil
161141
}
162142
}
163143

164144
extension ManagedDependencies: Collection {
165-
public typealias Index = Dictionary<String, ManagedDependency>.Index
145+
public typealias Index = Dictionary<PackageIdentity, ManagedDependency>.Index
166146
public typealias Element = ManagedDependency
167147

168148
public var startIndex: Index {
169-
self.dependencyMap.startIndex
149+
map.startIndex
170150
}
171151

172152
public var endIndex: Index {
173-
self.dependencyMap.endIndex
153+
map.endIndex
174154
}
175155

176156
public subscript(index: Index) -> Element {
177-
self.dependencyMap[index].value
157+
map[index].value
178158
}
179159

180160
public func index(after index: Index) -> Index {
181-
self.dependencyMap.index(after: index)
161+
map.index(after: index)
182162
}
183163
}
184164

185165
extension ManagedDependencies: CustomStringConvertible {
186166
public var description: String {
187-
"<ManagedDependencies: \(Array(dependencyMap.values))>"
167+
"<ManagedDependencies: \(Array(map.values))>"
188168
}
189169
}

0 commit comments

Comments
 (0)