Skip to content

Commit d1942f8

Browse files
committed
[ArgsResolver] Create specified temporary directory, if necessary
Resolves rdar://157302464
1 parent 98256ce commit d1942f8

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

Sources/SwiftDriver/Execution/ArgsResolver.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ public final class ArgsResolver {
4545

4646
if let temporaryDirectory = temporaryDirectory {
4747
self.temporaryDirectory = temporaryDirectory
48+
let temporaryDirExists = try fileSystem.exists(self.temporaryDirectory)
49+
if !temporaryDirExists, let temporaryDirAbsPath = self.temporaryDirectory.absolutePath {
50+
try fileSystem.createDirectory(temporaryDirAbsPath, recursive: true)
51+
}
4852
} else {
4953
// FIXME: withTemporaryDirectory uses FileManager.default, need to create a FileSystem.temporaryDirectory api.
5054
let tmpDir: AbsolutePath = try withTemporaryDirectory(removeTreeOnDeinit: false) { path in

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,6 +1783,29 @@ final class SwiftDriverTests: XCTestCase {
17831783
XCTAssertTrue(contents.hasPrefix("-interpret\n\(source.nativePathString(escaped: false))"))
17841784
}
17851785

1786+
// Forced response file in a non-existing temporary directory
1787+
do {
1788+
try withTemporaryDirectory { tempPath in
1789+
let resolverTempDirPath = tempPath.appending(components: "resolverStuff")
1790+
let source = try AbsolutePath(validating: "/foo.swift")
1791+
var driver = try Driver(args: ["swift"] + [source.nativePathString(escaped: false)])
1792+
let jobs = try driver.planBuild()
1793+
XCTAssertEqual(jobs.count, 1)
1794+
XCTAssertEqual(jobs[0].kind, .interpret)
1795+
let interpretJob = jobs[0]
1796+
let resolver = try ArgsResolver(fileSystem: localFileSystem,
1797+
temporaryDirectory: .absolute(resolverTempDirPath))
1798+
let resolvedArgs: [String] = try resolver.resolveArgumentList(for: interpretJob, useResponseFiles: .forced)
1799+
XCTAssertEqual(resolvedArgs.count, 3)
1800+
XCTAssertEqual(resolvedArgs[1], "-frontend")
1801+
XCTAssertEqual(resolvedArgs[2].first, "@")
1802+
let responseFilePath = try AbsolutePath(validating: String(resolvedArgs[2].dropFirst()))
1803+
XCTAssertEqual(responseFilePath.parentDirectory.basename, "resolverStuff")
1804+
let contents = try localFileSystem.readFileContents(responseFilePath).description
1805+
XCTAssertTrue(contents.hasPrefix("-interpret\n\(source.nativePathString(escaped: false))"))
1806+
}
1807+
}
1808+
17861809
// No response file
17871810
do {
17881811
var driver = try Driver(args: ["swift"] + ["foo.swift"])

0 commit comments

Comments
 (0)