Skip to content

Commit b8f0af0

Browse files
committed
Add RegistryPackageContainer.swift
1 parent 4536b5e commit b8f0af0

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

Sources/PackageGraph/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ add_library(PackageGraph
2727
Pubgrub/PartialSolution.swift
2828
Pubgrub/PubgrubDependencyResolver.swift
2929
Pubgrub/Term.swift
30+
RegistryPackageContainer.swift
3031
RepositoryPackageContainer.swift
3132
ResolvedPackage.swift
3233
ResolvedProduct.swift
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
This source file is part of the Swift.org open source project
3+
4+
Copyright (c) 2021 Apple Inc. and the Swift project authors
5+
Licensed under Apache License v2.0 with Runtime Library Exception
6+
7+
See http://swift.org/LICENSE.txt for license information
8+
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
9+
*/
10+
11+
import Dispatch
12+
import Basics
13+
import TSCBasic
14+
import PackageLoading
15+
import PackageModel
16+
import SourceControl
17+
import TSCUtility
18+
import PackageRegistry
19+
20+
public class RegistryPackageContainer: PackageContainer {
21+
public let package: PackageReference
22+
23+
private let registryManager: RegistryManager
24+
private let identityResolver: IdentityResolver
25+
private let manifestLoader: ManifestLoaderProtocol
26+
private let toolsVersionLoader: ToolsVersionLoaderProtocol
27+
private let currentToolsVersion: ToolsVersion
28+
29+
private var knownVersionsCache = ThreadSafeBox<[Version]>()
30+
private var toolsVersionsCache = ThreadSafeKeyValueStore<Version, ToolsVersion>()
31+
private var validToolsVersionsCache = ThreadSafeKeyValueStore<Version, Bool>()
32+
private var manifestsCache = ThreadSafeKeyValueStore<Version, Manifest>()
33+
34+
init(
35+
package: PackageReference,
36+
identityResolver: IdentityResolver,
37+
manager: RegistryManager,
38+
manifestLoader: ManifestLoaderProtocol,
39+
toolsVersionLoader: ToolsVersionLoaderProtocol,
40+
currentToolsVersion: ToolsVersion
41+
) {
42+
self.package = package
43+
self.identityResolver = identityResolver
44+
self.registryManager = manager
45+
self.manifestLoader = manifestLoader
46+
self.toolsVersionLoader = toolsVersionLoader
47+
self.currentToolsVersion = currentToolsVersion
48+
}
49+
50+
// MARK: - PackageContainer
51+
52+
public func isToolsVersionCompatible(at version: Version) -> Bool {
53+
validToolsVersionsCache.memoize(version) {
54+
do {
55+
let toolsVersion = try self.toolsVersion(for: version)
56+
try toolsVersion.validateToolsVersion(currentToolsVersion, packagePath: package.location)
57+
return true
58+
} catch {
59+
return false
60+
}
61+
}
62+
}
63+
64+
public func toolsVersion(for version: Version) throws -> ToolsVersion {
65+
// TODO: Refactor ToolsVersionLoaderProtocol to support loading from string
66+
// TODO: Add support for version-specific manifests
67+
toolsVersionsCache.memoize(version) {
68+
return .currentToolsVersion
69+
}
70+
}
71+
72+
public func versionsDescending() throws -> [Version] {
73+
try knownVersionsCache.memoize {
74+
let versions = try temp_await { self.registryManager.fetchVersions(of: self.package, on: .sharedConcurrent, completion: $0) }
75+
return versions.sorted(by: <)
76+
}
77+
}
78+
79+
public func versionsAscending() throws -> [Version] {
80+
try versionsDescending().reversed()
81+
}
82+
83+
public func toolsVersionsAppropriateVersionsDescending() throws -> [Version] {
84+
try versionsDescending().filter(isToolsVersionCompatible(at:))
85+
}
86+
87+
public func getDependencies(at version: Version, productFilter: ProductFilter) throws -> [PackageContainerConstraint] {
88+
let manifest = try manifestsCache.memoize(version) {
89+
try temp_await { registryManager.fetchManifest(for: version, of: self.package, using: self.manifestLoader, on: .sharedConcurrent, completion: $0) }
90+
}
91+
92+
return try manifest.dependencyConstraints(productFilter: productFilter)
93+
}
94+
95+
public func getDependencies(at revision: String, productFilter: ProductFilter) throws -> [PackageContainerConstraint] {
96+
assertionFailure("this method shouldn't be called") // FIXME: remove
97+
return []
98+
}
99+
100+
public func getUnversionedDependencies(productFilter: ProductFilter) throws -> [PackageContainerConstraint] {
101+
assertionFailure("this method shouldn't be called") // FIXME: remove
102+
return []
103+
}
104+
105+
public func getUpdatedIdentifier(at boundVersion: BoundVersion) throws -> PackageReference {
106+
return package
107+
}
108+
}
109+
110+
// MARK: - CustomStringConvertible
111+
112+
extension RegistryPackageContainer: CustomStringConvertible {
113+
public var description: String {
114+
return "RegistryPackageContainer(\(package.repository.url.debugDescription))"
115+
}
116+
}

0 commit comments

Comments
 (0)