diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index 6897bb20..0f6b3b6a 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -777,12 +777,11 @@ class AppState: ObservableObject { } } - func copyPath(xcode: Xcode) { + func copyPath(xcode: Xcode, pasteboard: NSPasteboard = .general) { guard let installedXcodePath = xcode.installedPath else { return } - NSPasteboard.general.declareTypes([.URL, .string], owner: nil) - NSPasteboard.general.writeObjects([installedXcodePath.url as NSURL]) - NSPasteboard.general.setString(installedXcodePath.string, forType: .string) + pasteboard.clearContents() + pasteboard.setString(installedXcodePath.string, forType: .string) } func copyReleaseNote(from url: URL?) { diff --git a/XcodesTests/AppStateTests.swift b/XcodesTests/AppStateTests.swift index e31ee200..69462348 100644 --- a/XcodesTests/AppStateTests.swift +++ b/XcodesTests/AppStateTests.swift @@ -1,3 +1,4 @@ +import AppKit import Combine @preconcurrency import Path import Version @@ -84,6 +85,22 @@ class AppStateTests: XCTestCase { XCTAssertFalse(subject.enableGroupedXcodeList) } + func test_CopyPath_WritesInstalledPathAsPlainText() throws { + let installedPath = try XCTUnwrap(Path("/Applications/Xcode 26.0.app")) + let xcode = Xcode( + version: Version("26.0.0")!, + installState: .installed(installedPath), + selected: false, + icon: nil + ) + let pasteboard = NSPasteboard(name: NSPasteboard.Name("AppStateTests-\(UUID().uuidString)")) + defer { pasteboard.releaseGlobally() } + + subject.copyPath(xcode: xcode, pasteboard: pasteboard) + + XCTAssertEqual(pasteboard.string(forType: .string), installedPath.string) + } + func test_PrepareForHelperAction_StaleActionDoesNotClearReplacementAction() { var responses = [Bool]() subject.prepareForHelperAction { responses.append($0) }