Skip to content

CLI commands should not require workspace to update user-level registries config #6812

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
Aug 15, 2023
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
6 changes: 4 additions & 2 deletions Sources/PackageRegistryTool/PackageRegistryTool+Auth.swift
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,8 @@ extension SwiftPackageRegistryTool {
throw ValidationError.unknownCredentialStore
}

let configuration = try getRegistriesConfig(swiftTool)
// Auth config is in user-level registries config only
let configuration = try getRegistriesConfig(swiftTool, global: true)

// compute and validate registry URL
guard let registryURL = self.registryURL ?? configuration.configuration.defaultRegistry?.url else {
Expand Down Expand Up @@ -338,7 +339,8 @@ extension SwiftPackageRegistryTool {
}

func run(_ swiftTool: SwiftTool) throws {
let configuration = try getRegistriesConfig(swiftTool)
// Auth config is in user-level registries config only
let configuration = try getRegistriesConfig(swiftTool, global: true)

// compute and validate registry URL
guard let registryURL = self.registryURL ?? configuration.configuration.defaultRegistry?.url else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ extension SwiftPackageRegistryTool {
var dryRun: Bool = false

func run(_ swiftTool: SwiftTool) throws {
let configuration = try getRegistriesConfig(swiftTool).configuration
// Require both local and user-level registries config
let configuration = try getRegistriesConfig(swiftTool, global: false).configuration

// validate package location
let packageDirectory = try self.globalOptions.locations.packageDirectory ?? swiftTool.getPackageRoot()
Expand Down
29 changes: 20 additions & 9 deletions Sources/PackageRegistryTool/PackageRegistryTool.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public struct SwiftPackageRegistryTool: ParsableCommand {
}
}

let configuration = try getRegistriesConfig(swiftTool)
let configuration = try getRegistriesConfig(swiftTool, global: self.global)
if self.global {
try configuration.updateShared(with: set)
} else {
Expand Down Expand Up @@ -115,7 +115,7 @@ public struct SwiftPackageRegistryTool: ParsableCommand {
}
}

let configuration = try getRegistriesConfig(swiftTool)
let configuration = try getRegistriesConfig(swiftTool, global: self.global)
if self.global {
try configuration.updateShared(with: unset)
} else {
Expand All @@ -139,13 +139,24 @@ public struct SwiftPackageRegistryTool: ParsableCommand {
case credentialLengthLimitExceeded(Int)
}

static func getRegistriesConfig(_ swiftTool: SwiftTool) throws -> Workspace.Configuration.Registries {
let workspace = try swiftTool.getActiveWorkspace()
return try .init(
fileSystem: swiftTool.fileSystem,
localRegistriesFile: workspace.location.localRegistriesConfigurationFile,
sharedRegistriesFile: workspace.location.sharedRegistriesConfigurationFile
)
static func getRegistriesConfig(_ swiftTool: SwiftTool, global: Bool) throws -> Workspace.Configuration.Registries {
if global {
// Workspace not needed when working with user-level registries config
return try .init(
fileSystem: swiftTool.fileSystem,
localRegistriesFile: .none,
sharedRegistriesFile: swiftTool.sharedConfigurationDirectory.map {
Workspace.DefaultLocations.registriesConfigurationFile(at: $0)
}
)
} else {
let workspace = try swiftTool.getActiveWorkspace()
return try .init(
fileSystem: swiftTool.fileSystem,
localRegistriesFile: workspace.location.localRegistriesConfigurationFile,
sharedRegistriesFile: workspace.location.sharedRegistriesConfigurationFile
)
}
}
}

Expand Down
32 changes: 22 additions & 10 deletions Sources/Workspace/Workspace+Configuration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2018-2022 Apple Inc. and the Swift project authors
// Copyright (c) 2018-2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
Expand Down Expand Up @@ -605,7 +605,7 @@ extension Workspace.Configuration {

extension Workspace.Configuration {
public class Registries {
private let localRegistries: RegistriesStorage
private let localRegistries: RegistriesStorage?
private let sharedRegistries: RegistriesStorage?
private let fileSystem: FileSystem

Expand All @@ -624,14 +624,20 @@ extension Workspace.Configuration {
/// - Parameters:
/// - fileSystem: The file system to use.
/// - localRegistriesFile: Path to the workspace registries configuration file
/// - sharedRegistriesFile: Path to the shared registries configuration file, defaults to the standard location.
/// - sharedRegistriesFile: Path to the shared registries configuration file,
/// defaults to the standard location.
public init(
fileSystem: FileSystem,
localRegistriesFile: AbsolutePath,
localRegistriesFile: AbsolutePath?,
sharedRegistriesFile: AbsolutePath?
) throws {
// At least one of local or shared is required
if localRegistriesFile == nil, sharedRegistriesFile == nil {
throw StringError("No registries configuration provided")
}

self.fileSystem = fileSystem
self.localRegistries = .init(path: localRegistriesFile, fileSystem: fileSystem)
self.localRegistries = localRegistriesFile.map { .init(path: $0, fileSystem: fileSystem) }
self.sharedRegistries = sharedRegistriesFile.map { .init(path: $0, fileSystem: fileSystem) }
try self.computeRegistries()
}
Expand All @@ -640,7 +646,10 @@ extension Workspace.Configuration {
public func updateLocal(with handler: (inout RegistryConfiguration) throws -> Void) throws
-> RegistryConfiguration
{
try self.localRegistries.update(with: handler)
guard let localRegistries else {
throw InternalError("local registries not configured")
}
try localRegistries.update(with: handler)
try self.computeRegistries()
return self.configuration
}
Expand All @@ -667,8 +676,9 @@ extension Workspace.Configuration {
configuration.merge(sharedConfiguration)
}

let localConfiguration = try localRegistries.load()
configuration.merge(localConfiguration)
if let localConfiguration = try localRegistries?.load() {
configuration.merge(localConfiguration)
}

self._configuration = configuration
}
Expand All @@ -695,7 +705,9 @@ extension Workspace.Configuration {
let decoder = JSONDecoder.makeWithDefaults()
return try decoder.decode(path: self.path, fileSystem: self.fileSystem, as: RegistryConfiguration.self)
} catch {
throw StringError("Failed loading registries configuration from '\(self.path)': \(error.interpolationDescription)")
throw StringError(
"Failed loading registries configuration from '\(self.path)': \(error.interpolationDescription)"
)
}
}

Expand Down Expand Up @@ -744,7 +756,7 @@ public struct WorkspaceConfiguration {

/// Signing entity checking mode. Defaults to warn.
public var signingEntityCheckingMode: CheckingMode

/// Whether to skip validating signature of signed packages downloaded from registry
public var skipSignatureValidation: Bool

Expand Down