Skip to content

Commit 2265fc5

Browse files
committed
Print reason for requiring resolution
This moves the existing code for printing a `WorkspaceResolveReason` and always appends it to the diagnostic for an out-of-date required resolved file.
1 parent 0b0b22b commit 2265fc5

File tree

2 files changed

+60
-52
lines changed

2 files changed

+60
-52
lines changed

Sources/Commands/SwiftTool.swift

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -148,56 +148,9 @@ private class ToolWorkspaceDelegate: WorkspaceDelegate {
148148
guard isVerbose else { return }
149149

150150
queue.sync {
151-
self.stdoutStream <<< "Running resolver because "
152-
153-
switch reason {
154-
case .forced:
155-
self.stdoutStream <<< "it was forced"
156-
case .newPackages(let packages):
157-
let dependencies = packages.lazy.map({ "'\($0.location)'" }).joined(separator: ", ")
158-
self.stdoutStream <<< "the following dependencies were added: \(dependencies)"
159-
case .packageRequirementChange(let package, let state, let requirement):
160-
self.stdoutStream <<< "dependency '\(package.name)' was "
161-
162-
switch state {
163-
case .checkout(let checkoutState)?:
164-
switch checkoutState.requirement {
165-
case .versionSet(.exact(let version)):
166-
self.stdoutStream <<< "resolved to '\(version)'"
167-
case .versionSet(_):
168-
// Impossible
169-
break
170-
case .revision(let revision):
171-
self.stdoutStream <<< "resolved to '\(revision)'"
172-
case .unversioned:
173-
self.stdoutStream <<< "unversioned"
174-
}
175-
case .edited?:
176-
self.stdoutStream <<< "edited"
177-
case .local?:
178-
self.stdoutStream <<< "versioned"
179-
case nil:
180-
self.stdoutStream <<< "root"
181-
}
182-
183-
self.stdoutStream <<< " but now has a "
184-
185-
switch requirement {
186-
case .versionSet:
187-
self.stdoutStream <<< "different version-based"
188-
case .revision:
189-
self.stdoutStream <<< "different revision-based"
190-
case .unversioned:
191-
self.stdoutStream <<< "unversioned"
192-
}
193-
194-
self.stdoutStream <<< " requirement."
195-
default:
196-
self.stdoutStream <<< " requirements have changed."
197-
}
198-
151+
self.stdoutStream <<< Workspace.format(workspaceResolveReason: reason)
199152
self.stdoutStream <<< "\n"
200-
stdoutStream.flush()
153+
self.stdoutStream.flush()
201154
}
202155
}
203156

Sources/Workspace/Workspace.swift

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,11 +2033,13 @@ extension Workspace {
20332033
pinsStore: pinsStore
20342034
)
20352035

2036-
if precomputationResult.isRequired {
2036+
if case let .required(reason) = precomputationResult {
2037+
let reasonString = Self.format(workspaceResolveReason: reason)
2038+
20372039
if !fileSystem.exists(self.location.resolvedVersionsFile) {
2038-
diagnostics.emit(error: "a resolved file is required when automatic dependency resolution is disabled and should be placed at \(self.location.resolvedVersionsFile.pathString)")
2040+
diagnostics.emit(error: "a resolved file is required when automatic dependency resolution is disabled and should be placed at \(self.location.resolvedVersionsFile.pathString). \(reasonString)")
20392041
} else {
2040-
diagnostics.emit(error: "an out-of-date resolved file was detected at \(self.location.resolvedVersionsFile.pathString), which is not allowed when automatic dependency resolution is disabled; please make sure to update the file to reflect the changes in dependencies")
2042+
diagnostics.emit(error: "an out-of-date resolved file was detected at \(self.location.resolvedVersionsFile.pathString), which is not allowed when automatic dependency resolution is disabled; please make sure to update the file to reflect the changes in dependencies. \(reasonString)")
20412043
}
20422044
}
20432045

@@ -2814,6 +2816,59 @@ extension Workspace {
28142816
// Save the state.
28152817
try state.saveState()
28162818
}
2819+
2820+
public static func format(workspaceResolveReason reason: WorkspaceResolveReason) -> String {
2821+
let stream = BufferedOutputByteStream()
2822+
stream <<< "Running resolver because "
2823+
2824+
switch reason {
2825+
case .forced:
2826+
stream <<< "it was forced"
2827+
case .newPackages(let packages):
2828+
let dependencies = packages.lazy.map({ "'\($0.location)'" }).joined(separator: ", ")
2829+
stream <<< "the following dependencies were added: \(dependencies)"
2830+
case .packageRequirementChange(let package, let state, let requirement):
2831+
stream <<< "dependency '\(package.name)' was "
2832+
2833+
switch state {
2834+
case .checkout(let checkoutState)?:
2835+
switch checkoutState.requirement {
2836+
case .versionSet(.exact(let version)):
2837+
stream <<< "resolved to '\(version)'"
2838+
case .versionSet(_):
2839+
// Impossible
2840+
break
2841+
case .revision(let revision):
2842+
stream <<< "resolved to '\(revision)'"
2843+
case .unversioned:
2844+
stream <<< "unversioned"
2845+
}
2846+
case .edited?:
2847+
stream <<< "edited"
2848+
case .local?:
2849+
stream <<< "versioned"
2850+
case nil:
2851+
stream <<< "root"
2852+
}
2853+
2854+
stream <<< " but now has a "
2855+
2856+
switch requirement {
2857+
case .versionSet:
2858+
stream <<< "different version-based"
2859+
case .revision:
2860+
stream <<< "different revision-based"
2861+
case .unversioned:
2862+
stream <<< "unversioned"
2863+
}
2864+
2865+
stream <<< " requirement."
2866+
default:
2867+
stream <<< " requirements have changed."
2868+
}
2869+
2870+
return stream.bytes.description
2871+
}
28172872
}
28182873

28192874
/// A result which can be loaded.

0 commit comments

Comments
 (0)