Skip to content

Commit bbb6825

Browse files
committed
cleanup mirror config command (swiftlang#6339)
motivation: the mirrors config command no takes both URLs and registry identities changes: * nupdate flags to use "original" and "mirror" so it is not URL specific * update API to not use URL suffix * update call sites and tests
1 parent 6cd6bd9 commit bbb6825

File tree

9 files changed

+261
-179
lines changed

9 files changed

+261
-179
lines changed

Sources/Commands/PackageTools/Config.swift

Lines changed: 90 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,108 +20,161 @@ extension SwiftPackageTool {
2020
struct Config: ParsableCommand {
2121
static let configuration = CommandConfiguration(
2222
abstract: "Manipulate configuration of the package",
23-
subcommands: [SetMirror.self, UnsetMirror.self, GetMirror.self])
23+
subcommands: [SetMirror.self, UnsetMirror.self, GetMirror.self]
24+
)
2425
}
2526
}
2627

2728
extension SwiftPackageTool.Config {
2829
struct SetMirror: SwiftCommand {
2930
static let configuration = CommandConfiguration(
30-
abstract: "Set a mirror for a dependency")
31+
abstract: "Set a mirror for a dependency"
32+
)
3133

3234
@OptionGroup(visibility: .hidden)
3335
var globalOptions: GlobalOptions
3436

35-
@Option(help: "The package dependency url")
36-
var packageURL: String?
37+
@Option(name: .customLong("package-url"), help: .hidden)
38+
var _deprecate_packageURL: String?
39+
40+
@Option(name: .customLong("original-url"), help: .hidden)
41+
var _deprecate_originalURL: String?
3742

38-
@Option(help: "The original url")
39-
var originalURL: String?
43+
@Option(name: .customLong("mirror-url"), help: .hidden)
44+
var _deprecate_mirrorURL: String?
4045

41-
@Option(help: "The mirror url")
42-
var mirrorURL: String
46+
@Option(help: "The original url or identity")
47+
var original: String?
48+
49+
@Option(help: "The mirror url or identity")
50+
var mirror: String?
4351

4452
func run(_ swiftTool: SwiftTool) throws {
4553
let config = try getMirrorsConfig(swiftTool)
4654

47-
if self.packageURL != nil {
55+
if self._deprecate_packageURL != nil {
56+
swiftTool.observabilityScope.emit(
57+
warning: "'--package-url' option is deprecated; use '--original' instead"
58+
)
59+
}
60+
if self._deprecate_originalURL != nil {
4861
swiftTool.observabilityScope.emit(
49-
warning: "'--package-url' option is deprecated; use '--original-url' instead")
62+
warning: "'--original-url' option is deprecated; use '--original' instead"
63+
)
64+
}
65+
if self._deprecate_mirrorURL != nil {
66+
swiftTool.observabilityScope.emit(
67+
warning: "'--mirror-url' option is deprecated; use '--mirror' instead"
68+
)
69+
}
70+
71+
guard let original = self._deprecate_packageURL ?? self._deprecate_originalURL ?? self.original else {
72+
swiftTool.observabilityScope.emit(.missingRequiredArg("--original"))
73+
throw ExitCode.failure
5074
}
5175

52-
guard let originalURL = self.packageURL ?? self.originalURL else {
53-
swiftTool.observabilityScope.emit(.missingRequiredArg("--original-url"))
76+
guard let mirror = self._deprecate_mirrorURL ?? self.mirror else {
77+
swiftTool.observabilityScope.emit(.missingRequiredArg("--mirror"))
5478
throw ExitCode.failure
5579
}
5680

5781
try config.applyLocal { mirrors in
58-
mirrors.set(mirrorURL: self.mirrorURL, forURL: originalURL)
82+
mirrors.set(mirror: mirror, for: original)
5983
}
6084
}
6185
}
6286

6387
struct UnsetMirror: SwiftCommand {
6488
static let configuration = CommandConfiguration(
65-
abstract: "Remove an existing mirror")
89+
abstract: "Remove an existing mirror"
90+
)
6691

6792
@OptionGroup(visibility: .hidden)
6893
var globalOptions: GlobalOptions
6994

70-
@Option(help: "The package dependency url")
71-
var packageURL: String?
95+
@Option(name: .customLong("package-url"), help: .hidden)
96+
var _deprecate_packageURL: String?
97+
98+
@Option(name: .customLong("original-url"), help: .hidden)
99+
var _deprecate_originalURL: String?
100+
101+
@Option(name: .customLong("mirror-url"), help: .hidden)
102+
var _deprecate_mirrorURL: String?
72103

73-
@Option(help: "The original url")
74-
var originalURL: String?
104+
@Option(help: "The original url or identity")
105+
var original: String?
75106

76-
@Option(help: "The mirror url")
77-
var mirrorURL: String?
107+
@Option(help: "The mirror url or identity")
108+
var mirror: String?
78109

79110
func run(_ swiftTool: SwiftTool) throws {
80111
let config = try getMirrorsConfig(swiftTool)
81112

82-
if self.packageURL != nil {
113+
if self._deprecate_packageURL != nil {
114+
swiftTool.observabilityScope.emit(
115+
warning: "'--package-url' option is deprecated; use '--original' instead"
116+
)
117+
}
118+
if self._deprecate_originalURL != nil {
83119
swiftTool.observabilityScope.emit(
84-
warning: "'--package-url' option is deprecated; use '--original-url' instead")
120+
warning: "'--original-url' option is deprecated; use '--original' instead"
121+
)
122+
}
123+
if self._deprecate_mirrorURL != nil {
124+
swiftTool.observabilityScope.emit(
125+
warning: "'--mirror-url' option is deprecated; use '--mirror' instead"
126+
)
85127
}
86128

87-
guard let originalOrMirrorURL = self.packageURL ?? self.originalURL ?? self.mirrorURL else {
88-
swiftTool.observabilityScope.emit(.missingRequiredArg("--original-url or --mirror-url"))
129+
guard let originalOrMirror = self._deprecate_packageURL ?? self._deprecate_originalURL ?? self
130+
.original ?? self._deprecate_mirrorURL ?? self.mirror
131+
else {
132+
swiftTool.observabilityScope.emit(.missingRequiredArg("--original or --mirror"))
89133
throw ExitCode.failure
90134
}
91135

92136
try config.applyLocal { mirrors in
93-
try mirrors.unset(originalOrMirrorURL: originalOrMirrorURL)
137+
try mirrors.unset(originalOrMirror: originalOrMirror)
94138
}
95139
}
96140
}
97141

98142
struct GetMirror: SwiftCommand {
99143
static let configuration = CommandConfiguration(
100-
abstract: "Print mirror configuration for the given package dependency")
144+
abstract: "Print mirror configuration for the given package dependency"
145+
)
101146

102147
@OptionGroup(visibility: .hidden)
103148
var globalOptions: GlobalOptions
149+
@Option(name: .customLong("package-url"), help: .hidden)
150+
var _deprecate_packageURL: String?
104151

105-
@Option(help: "The package dependency url")
106-
var packageURL: String?
152+
@Option(name: .customLong("original-url"), help: .hidden)
153+
var _deprecate_originalURL: String?
107154

108-
@Option(help: "The original url")
109-
var originalURL: String?
155+
@Option(help: "The original url or identity")
156+
var original: String?
110157

111158
func run(_ swiftTool: SwiftTool) throws {
112159
let config = try getMirrorsConfig(swiftTool)
113160

114-
if self.packageURL != nil {
161+
if self._deprecate_packageURL != nil {
162+
swiftTool.observabilityScope.emit(
163+
warning: "'--package-url' option is deprecated; use '--original' instead"
164+
)
165+
}
166+
if self._deprecate_originalURL != nil {
115167
swiftTool.observabilityScope.emit(
116-
warning: "'--package-url' option is deprecated; use '--original-url' instead")
168+
warning: "'--original-url' option is deprecated; use '--original' instead"
169+
)
117170
}
118171

119-
guard let originalURL = self.packageURL ?? self.originalURL else {
120-
swiftTool.observabilityScope.emit(.missingRequiredArg("--original-url"))
172+
guard let original = self._deprecate_packageURL ?? self._deprecate_originalURL ?? self.original else {
173+
swiftTool.observabilityScope.emit(.missingRequiredArg("--original"))
121174
throw ExitCode.failure
122175
}
123176

124-
if let mirror = config.mirrors.mirrorURL(for: originalURL) {
177+
if let mirror = config.mirrors.mirror(for: original) {
125178
print(mirror)
126179
} else {
127180
stderrStream <<< "not found\n"
@@ -141,8 +194,8 @@ extension SwiftPackageTool.Config {
141194
}
142195
}
143196

144-
private extension Basics.Diagnostic {
145-
static func missingRequiredArg(_ argument: String) -> Self {
197+
extension Basics.Diagnostic {
198+
fileprivate static func missingRequiredArg(_ argument: String) -> Self {
146199
.error("missing required argument \(argument)")
147200
}
148201
}

Sources/PackageGraph/DependencyMirrors.swift

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public final class DependencyMirrors: Equatable {
2424

2525
public var mapping: [String: String] {
2626
self.lock.withLock {
27-
return self.index
27+
self.index
2828
}
2929
}
3030

@@ -38,34 +38,34 @@ public final class DependencyMirrors: Equatable {
3838
}
3939

4040
public static func == (lhs: DependencyMirrors, rhs: DependencyMirrors) -> Bool {
41-
return lhs.mapping == rhs.mapping
41+
lhs.mapping == rhs.mapping
4242
}
4343

44-
/// Sets a mirror URL for the given URL.
44+
/// Sets a mirror for the given origin.
4545
/// - Parameters:
46-
/// - mirrorURL: The mirrored URL
47-
/// - forURL: The original URL
48-
public func set(mirrorURL: String, forURL url: String) {
46+
/// - mirror: The mirror
47+
/// - for: The original
48+
public func set(mirror: String, for key: String) {
4949
self.lock.withLock {
50-
self.index[url] = mirrorURL
51-
self.reverseIndex[mirrorURL, default: []].append(url)
50+
self.index[key] = mirror
51+
self.reverseIndex[mirror, default: []].append(key)
5252
}
5353
}
5454

55-
/// Unsets a mirror for the given URL.
55+
/// Unsets a mirror for the given.
5656
/// - Parameters:
57-
/// - originalOrMirrorURL: The original URL or the mirrored URL
58-
/// - Throws: `Error.mirrorNotFound` if no mirror exists for the provided URL.
59-
public func unset(originalOrMirrorURL: String) throws {
57+
/// - originalOrMirror: The original or the mirrored
58+
/// - Throws: `Error.mirrorNotFound` if no mirror exists for the provided origin or mirror.
59+
public func unset(originalOrMirror: String) throws {
6060
try self.lock.withLock {
61-
if let value = self.index[originalOrMirrorURL] {
62-
self.index[originalOrMirrorURL] = nil
61+
if let value = self.index[originalOrMirror] {
62+
self.index[originalOrMirror] = nil
6363
self.reverseIndex[value] = nil
64-
} else if let mirror = self.index.first(where: { $0.value == originalOrMirrorURL }) {
64+
} else if let mirror = self.index.first(where: { $0.value == originalOrMirror }) {
6565
self.index[mirror.key] = nil
66-
self.reverseIndex[originalOrMirrorURL] = nil
66+
self.reverseIndex[originalOrMirror] = nil
6767
} else {
68-
throw StringError("Mirror not found for '\(originalOrMirrorURL)'")
68+
throw StringError("Mirror not found for '\(originalOrMirror)'")
6969
}
7070
}
7171
}
@@ -75,7 +75,7 @@ public final class DependencyMirrors: Equatable {
7575
/// - contentsOf: The DependencyMirrors to append from.
7676
public func append(contentsOf mirrors: DependencyMirrors) {
7777
mirrors.index.forEach {
78-
self.set(mirrorURL: $0.value, forURL: $0.key)
78+
self.set(mirror: $0.value, for: $0.key)
7979
}
8080
}
8181

@@ -101,36 +101,36 @@ public final class DependencyMirrors: Equatable {
101101
}
102102
}
103103

104-
/// Returns the mirrored URL for a package dependency URL.
104+
/// Returns the mirrored for a package dependency.
105105
/// - Parameters:
106-
/// - url: The original URL
107-
/// - Returns: The mirrored URL, if one exists.
108-
public func mirrorURL(for url: String) -> String? {
106+
/// - for: The original
107+
/// - Returns: The mirrored, if one exists.
108+
public func mirror(for key: String) -> String? {
109109
self.lock.withLock {
110-
let value = self.index[url]
110+
let value = self.index[key]
111111
if value != nil {
112112
// record visited mirrors for reverse index lookup sorting
113-
self.visited.append(url)
113+
self.visited.append(key)
114114
}
115115
return value
116116
}
117117
}
118118

119-
/// Returns the effective URL for a package dependency URL.
119+
/// Returns the effective value for a package dependency.
120120
/// - Parameters:
121-
/// - url: The original URL
122-
/// - Returns: The mirrored URL if it exists, otherwise the original URL.
123-
public func effectiveURL(for url: String) -> String {
124-
return self.mirrorURL(for: url) ?? url
121+
/// - for: The original
122+
/// - Returns: The mirrored if it exists, otherwise the original.
123+
public func effective(for key: String) -> String {
124+
self.mirror(for: key) ?? key
125125
}
126126

127-
/// Returns the original URL for a mirrored package dependency URL.
127+
/// Returns the original for a mirrored package dependency.
128128
/// - Parameters:
129-
/// - url: The mirror URL
130-
/// - Returns: The original URL, if one exists.
131-
public func originalURL(for url: String) -> String? {
129+
/// - for: The mirror
130+
/// - Returns: The original , if one exists.
131+
public func original(for key: String) -> String? {
132132
self.lock.withLock {
133-
let alternatives = self.reverseIndex[url]
133+
let alternatives = self.reverseIndex[key]
134134
// since there are potentially multiple mapping, we need to sort them to produce deterministic results
135135
let sorted = alternatives?.sorted(by: { lhs, rhs in
136136
// check if it was visited (which means it used by the package)
@@ -152,17 +152,17 @@ public final class DependencyMirrors: Equatable {
152152

153153
public func effectiveIdentity(for identity: PackageIdentity) throws -> PackageIdentity {
154154
// TODO: cache
155-
let mirrorIndex = try self.mapping.reduce(into: [PackageIdentity: PackageIdentity](), { partial, item in
155+
let mirrorIndex = try self.mapping.reduce(into: [PackageIdentity: PackageIdentity]()) { partial, item in
156156
try partial[parseLocation(item.key)] = parseLocation(item.value)
157-
})
157+
}
158158

159159
return mirrorIndex[identity] ?? identity
160160
}
161161

162162
private func parseLocation(_ location: String) throws -> PackageIdentity {
163163
if PackageIdentity.plain(location).isRegistry {
164164
return PackageIdentity.plain(location)
165-
} else if let path = try? AbsolutePath(validating: location) {
165+
} else if let path = try? AbsolutePath(validating: location) {
166166
return PackageIdentity(path: path)
167167
} else if let url = URL(string: location) {
168168
return PackageIdentity(url: url)

0 commit comments

Comments
 (0)