Skip to content

refactor managed dependencies #3698

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions Sources/PackageGraph/PackageGraph+Loading.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ extension PackageGraph {
root: PackageGraphRoot,
identityResolver: IdentityResolver,
additionalFileRules: [FileRuleDescription] = [],
externalManifests: [Manifest],
externalManifests: OrderedDictionary<PackageIdentity, Manifest>,
requiredDependencies: Set<PackageReference> = [],
unsafeAllowedPackages: Set<PackageReference> = [],
binaryArtifacts: [BinaryArtifact] = [],
Expand All @@ -35,11 +35,11 @@ extension PackageGraph {
let observabilityScope = ObservabilitySystem.topScope.makeChildScope(description: "Loading Package Graph")

// Create a map of the manifests, keyed by their identity.
let rootManifestsMap = root.manifests
let externalManifestsMap = try externalManifests.map{ (try identityResolver.resolveIdentity(for: $0.packageKind), $0) }
let manifestMap = rootManifestsMap.merging(externalManifestsMap, uniquingKeysWith: { lhs, rhs in
return lhs
})
var manifestMap = externalManifests
// prefer roots
root.manifests.forEach {
manifestMap[$0.key] = $0.value
}

let successors: (GraphLoadingNode) -> [GraphLoadingNode] = { node in
node.requiredDependencies().compactMap{ dependency in
Expand Down
2 changes: 1 addition & 1 deletion Sources/PackageModel/PackageIdentity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public struct PackageIdentity: CustomStringConvertible {
}

/// Creates a package identity from a URL.
/// - Parameter url: The package's URL.
/// - Parameter urlString: The package's URL.
// FIXME: deprecate this
public init(urlString: String) {
self.description = Self.provider.init(urlString).description
Expand Down
4 changes: 3 additions & 1 deletion Sources/PackageModel/PackageReference.swift
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,16 @@ public struct PackageReference: Encodable {
}

extension PackageReference: Equatable {
// TODO: consider location as well?
public static func ==(lhs: PackageReference, rhs: PackageReference) -> Bool {
return lhs.identity == rhs.identity
}
}

extension PackageReference: Hashable {
// TODO: consider location as well?
public func hash(into hasher: inout Hasher) {
hasher.combine(identity)
hasher.combine(self.identity)
}
}

Expand Down
40 changes: 29 additions & 11 deletions Sources/SPMTestSupport/MockWorkspace.swift
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ public final class MockWorkspace {

public func set(
pins: [PackageReference: CheckoutState] = [:],
managedDependencies: [ManagedDependency] = [],
managedDependencies: [Workspace.ManagedDependency] = [],
managedArtifacts: [Workspace.ManagedArtifact] = []
) throws {
let workspace = try self.getOrCreateWorkspace()
Expand All @@ -426,7 +426,7 @@ public final class MockWorkspace {
workspace.state.artifacts.add(artifact)
}

try workspace.state.saveState()
try workspace.state.save()
}

public func resetState() throws {
Expand All @@ -447,24 +447,32 @@ public final class MockWorkspace {
}

public struct ManagedDependencyResult {
public let managedDependencies: ManagedDependencies
public let managedDependencies: Workspace.ManagedDependencies

public init(_ managedDependencies: ManagedDependencies) {
public init(_ managedDependencies: Workspace.ManagedDependencies) {
self.managedDependencies = managedDependencies
}

public func check(notPresent name: String, file: StaticString = #file, line: UInt = #line) {
let dependency = self.managedDependencies[forNameOrIdentity: name]
XCTAssert(dependency == nil, "Unexpectedly found \(name) in managed dependencies", file: file, line: line)
self.check(notPresent: .plain(name), file: file, line: line)
}

public func check(notPresent dependencyId: PackageIdentity, file: StaticString = #file, line: UInt = #line) {
let dependency = self.managedDependencies[dependencyId]
XCTAssertNil(dependency, "Unexpectedly found \(dependencyId) in managed dependencies", file: file, line: line)
}

public func checkEmpty(file: StaticString = #file, line: UInt = #line) {
XCTAssertEqual(self.managedDependencies.count, 0, file: file, line: line)
}

public func check(dependency name: String, at state: State, file: StaticString = #file, line: UInt = #line) {
guard let dependency = managedDependencies[forNameOrIdentity: name] else {
XCTFail("\(name) does not exists", file: file, line: line)
self.check(dependency: .plain(name), at: state, file: file, line: line)
}

public func check(dependency dependencyId: PackageIdentity, at state: State, file: StaticString = #file, line: UInt = #line) {
guard let dependency = managedDependencies[dependencyId] else {
XCTFail("\(dependencyId) does not exists", file: file, line: line)
return
}
switch state {
Expand All @@ -478,8 +486,9 @@ public final class MockWorkspace {
XCTAssertEqual(dependency.checkoutState?.branch, branch, file: file, line: line)
}
case .edited(let path):
if dependency.state != .edited(path) {
guard case .edited(_, unmanagedPath: path) = dependency.state else {
XCTFail("Expected edited dependency; found '\(dependency.state)' instead", file: file, line: line)
return
}
case .local:
if dependency.state != .local {
Expand Down Expand Up @@ -757,8 +766,8 @@ extension CheckoutState {
}
}

fileprivate extension PackageReference.Kind {
var displayName: String {
extension PackageReference.Kind {
fileprivate var displayName: String {
switch self {
case .root:
return "root"
Expand All @@ -771,3 +780,12 @@ fileprivate extension PackageReference.Kind {
}
}
}

extension Workspace.ManagedDependency {
fileprivate var checkoutState: CheckoutState? {
if case .checkout(let checkoutState) = state {
return checkoutState
}
return .none
}
}
5 changes: 4 additions & 1 deletion Sources/SPMTestSupport/misc.swift
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,10 @@ public func loadPackageGraph(
useXCBuildFileRules: Bool = false
) throws -> PackageGraph {
let rootManifests = manifests.filter { $0.packageKind.isRoot }.spm_createDictionary{ ($0.path, $0) }
let externalManifests = manifests.filter { !$0.packageKind.isRoot }
let externalManifests = try manifests.filter { !$0.packageKind.isRoot }.reduce(into: OrderedDictionary<PackageIdentity, Manifest>()) { partial, item in
partial[try identityResolver.resolveIdentity(for: item.packageKind)] = item
}

let packages = Array(rootManifests.keys)
let input = PackageGraphRootInput(packages: packages)
let graphRoot = PackageGraphRoot(input: input, manifests: rootManifests, explicitProduct: explicitProduct)
Expand Down
Loading