Skip to content

initial integration of registry dependencies #3863

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 5 commits into from
Nov 15, 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
7 changes: 7 additions & 0 deletions Sources/Commands/SwiftTool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1170,3 +1170,10 @@ extension SwiftToolOptions {
}
}
}

extension Workspace.ManagedDependency {
fileprivate var isEdited: Bool {
if case .edited = self.state { return true }
return false
}
}
1 change: 0 additions & 1 deletion Sources/PackageGraph/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

add_library(PackageGraph
BoundVersion.swift
CheckoutState.swift
DependencyMirrors.swift
DependencyResolutionNode.swift
DependencyResolver.swift
Expand Down
72 changes: 0 additions & 72 deletions Sources/PackageGraph/CheckoutState.swift

This file was deleted.

5 changes: 2 additions & 3 deletions Sources/PackageGraph/PackageModel+Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,8 @@ extension PackageDependency {
case .remote(let url):
packageKind = .remoteSourceControl(url)
}
case .registry:
// FIXME
fatalError("registry based dependencies not implemented yet")
case .registry(let settings):
packageKind = .registry(settings.identity)
}
return PackageReference(identity: self.identity, kind: packageKind)
}
Expand Down
132 changes: 97 additions & 35 deletions Sources/PackageGraph/PinsStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,31 @@ public final class PinsStore {
public let packageRef: PackageReference

/// The pinned state.
public let state: CheckoutState
public let state: PinState

public init(packageRef: PackageReference, state: CheckoutState) {
public init(packageRef: PackageReference, state: PinState) {
self.packageRef = packageRef
self.state = state
}
}

public enum PinState: Equatable, CustomStringConvertible {
case branch(name: String, revision: String)
case version(_ version: Version, revision: String?)
case revision(_ revision: String)

public var description: String {
switch self {
case .version(let version, _):
return version.description
case .branch(let name, _):
return name
case .revision(let revision):
return revision
}
}
}

private let mirrors: DependencyMirrors

/// storage
Expand Down Expand Up @@ -70,7 +87,7 @@ public final class PinsStore {
/// - Parameters:
/// - packageRef: The package reference to pin.
/// - state: The state to pin at.
public func pin(packageRef: PackageReference, state: CheckoutState) {
public func pin(packageRef: PackageReference, state: PinState) {
self.add(.init(
packageRef: packageRef,
state: state
Expand Down Expand Up @@ -169,12 +186,12 @@ fileprivate struct PinsStorage {
let container = try V1(pins: pins, mirrors: mirrors)
data = try self.encoder.encode(container)
}
#if !os(Windows)
#if !os(Windows)
// rdar://83646952: add newline for POSIXy systems
if data.last != 0x0a {
data.append(0x0a)
}
#endif
#endif
try self.fileSystem.writeFileContents(self.path, data: data)
}
}
Expand Down Expand Up @@ -221,7 +238,7 @@ fileprivate struct PinsStorage {
struct Pin: Codable {
let package: String?
let repositoryURL: String
let state: CheckoutInfo
let state: State

init(_ pin: PinsStore.Pin, mirrors: DependencyMirrors) throws {
let location: String
Expand All @@ -237,7 +254,32 @@ fileprivate struct PinsStorage {
self.package = pin.packageRef.deprecatedName
// rdar://52529014, rdar://52529011: pin file should store the original location but remap when loading
self.repositoryURL = mirrors.originalURL(for: location) ?? location
self.state = .init(pin.state)
self.state = try .init(pin.state)
}
}

struct State: Codable {
let revision: String
let branch: String?
let version: String?

init(_ state: PinsStore.PinState) throws {
switch state {
case .version(let version, let revision) where revision != nil:
self.version = version.description
self.branch = nil
self.revision = revision! // nil guarded above in case
case .branch(let branch, let revision):
self.version = nil
self.branch = branch
self.revision = revision
case .revision(let revision):
self.version = nil
self.branch = nil
self.revision = revision
default:
throw StringError("invalid pin state: \(state)")
}
}
}
}
Expand All @@ -260,7 +302,7 @@ fileprivate struct PinsStorage {
let identity: PackageIdentity
let kind: Kind
let location: String
let state: CheckoutInfo
let state: State

init(_ pin: PinsStore.Pin, mirrors: DependencyMirrors) throws {
let kind: Kind
Expand All @@ -272,6 +314,9 @@ fileprivate struct PinsStorage {
case .remoteSourceControl(let url):
kind = .remoteSourceControl
location = url.absoluteString
case .registry:
kind = .registry
location = "" // FIXME: this is likely not correct
default:
throw StringError("invalid package type \(pin.packageRef.kind)")
}
Expand All @@ -287,28 +332,29 @@ fileprivate struct PinsStorage {
enum Kind: String, Codable {
case localSourceControl
case remoteSourceControl
case registry
}
}

struct CheckoutInfo: Codable {
let revision: String
let branch: String?
let version: String?

init(_ state: CheckoutState) {
switch state {
case .version(let version, let revision):
self.version = version.description
self.branch = nil
self.revision = revision.identifier
case .branch(let branch, let revision):
self.version = nil
self.branch = branch
self.revision = revision.identifier
case .revision(let revision):
self.version = nil
self.branch = nil
self.revision = revision.identifier
struct State: Codable {
let version: String?
let branch: String?
let revision: String?

init(_ state: PinsStore.PinState) {
switch state {
case .version(let version, let revision):
self.version = version.description
self.branch = nil
self.revision = revision
case .branch(let branch, let revision):
self.version = nil
self.branch = branch
self.revision = revision
case .revision(let revision):
self.version = nil
self.branch = nil
self.revision = revision
}
}
}
}
Expand Down Expand Up @@ -337,6 +383,19 @@ extension PinsStore.Pin {
}
}

extension PinsStore.PinState {
fileprivate init(_ state: PinsStorage.V1.State) throws {
let revision = state.revision
if let version = state.version {
self = try .version(Version(versionString: version), revision: revision)
} else if let branch = state.branch {
self = .branch(name: branch, revision: revision)
} else {
self = .revision(revision)
}
}
}

extension PinsStore.Pin {
fileprivate init(_ pin: PinsStorage.V2.Pin, mirrors: DependencyMirrors) throws {
let packageRef: PackageReference
Expand All @@ -351,6 +410,8 @@ extension PinsStore.Pin {
throw StringError("invalid url location: \(location)")
}
packageRef = .remoteSourceControl(identity: identity, url: url)
case .registry:
packageRef = .registry(identity: identity)
}
self.init(
packageRef: packageRef,
Expand All @@ -359,15 +420,16 @@ extension PinsStore.Pin {
}
}

extension CheckoutState {
fileprivate init(_ state: PinsStorage.CheckoutInfo) throws {
let revision: Revision = .init(identifier: state.revision)
if let branch = state.branch {
extension PinsStore.PinState {
fileprivate init(_ state: PinsStorage.V2.State) throws {
if let version = state.version {
self = try .version(Version(versionString: version), revision: state.revision)
} else if let branch = state.branch, let revision = state.revision {
self = .branch(name: branch, revision: revision)
} else if let version = state.version {
self = try .version(Version(versionString: version), revision: revision)
} else {
} else if let revision = state.revision {
self = .revision(revision)
} else {
throw StringError("invalid pin state: \(state)")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ public struct PubgrubDependencyResolver {
// already a commit, then its pin entry doesn't matter in practice.
let revisionForDependencies: String
if case .branch(revision, let pinRevision) = pinsMap[package.identity]?.state {
revisionForDependencies = pinRevision.identifier
revisionForDependencies = pinRevision

// Mark the package as overridden with the pinned revision and record the branch as well.
overriddenPackages[package] = (version: .revision(revisionForDependencies, branch: revision), products: constraint.products)
Expand Down
Loading