@@ -18,6 +18,34 @@ func projectPath() -> String {
1818}
1919
2020private var tempProjectPathIds = Set < String > ( )
21+ private let codeEditAppBundleID = " app.codeedit.CodeEdit "
22+
23+ private func testRunnerTempProjectURL( id: String ) -> URL {
24+ FileManager . default. temporaryDirectory
25+ . appending ( path: " CodeEditUITests " )
26+ . appending ( path: id)
27+ }
28+
29+ private func userHomeDirectoryOutsideSandbox( ) -> URL {
30+ let homePath = NSHomeDirectoryForUser ( NSUserName ( ) ) ?? NSHomeDirectory ( )
31+ // UI test runners are sandboxed too; strip that container before addressing the app's container.
32+ if let containerRange = homePath. range ( of: " /Library/Containers/ " ) {
33+ return URL ( fileURLWithPath: String ( homePath [ ..< containerRange. lowerBound] ) , isDirectory: true )
34+ }
35+ return URL ( fileURLWithPath: homePath, isDirectory: true )
36+ }
37+
38+ private func appWritableTempProjectURL( id: String ) -> URL {
39+ // CodeEdit is sandboxed, so app-created temporary workspaces live in the app container.
40+ userHomeDirectoryOutsideSandbox ( )
41+ . appending ( path: " Library " )
42+ . appending ( path: " Containers " )
43+ . appending ( path: codeEditAppBundleID)
44+ . appending ( path: " Data " )
45+ . appending ( path: " tmp " )
46+ . appending ( path: " CodeEditUITests " )
47+ . appending ( path: id)
48+ }
2149
2250private func makeTempID( ) -> String {
2351 let id = String ( ( 0 ..< 10 ) . map { _ in " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz- " . randomElement ( ) ! } )
@@ -29,9 +57,8 @@ private func makeTempID() -> String {
2957}
3058
3159func tempProjectPath( ) throws -> String {
32- let baseDir = FileManager . default. temporaryDirectory. appending ( path: " CodeEditUITests " )
3360 let id = makeTempID ( )
34- let path = baseDir . appending ( path : id)
61+ let path = testRunnerTempProjectURL ( id : id)
3562 try FileManager . default. createDirectory ( at: path, withIntermediateDirectories: true )
3663 return path. path ( percentEncoded: false )
3764}
@@ -40,22 +67,32 @@ func appWritableTempProjectID() -> String {
4067 makeTempID ( )
4168}
4269
70+ func appWritableTempProjectPath( id: String ) -> String {
71+ appWritableTempProjectURL ( id: id) . path ( percentEncoded: false )
72+ }
73+
4374func cleanUpTempProjectPaths( ) throws {
4475 let fileManager = FileManager . default
45- let baseDir = FileManager . default. temporaryDirectory. appending ( path: " CodeEditUITests " )
4676 var cleanupError : Error ?
4777 var remainingIDs = Set < String > ( )
4878
4979 for id in tempProjectPathIds {
50- let path = baseDir. appending ( path: id)
51- guard fileManager. fileExists ( atPath: path. path ( percentEncoded: false ) ) else {
52- continue
80+ let paths = [
81+ testRunnerTempProjectURL ( id: id) ,
82+ appWritableTempProjectURL ( id: id)
83+ ]
84+ var didFailCleanup = false
85+
86+ for path in paths where fileManager. fileExists ( atPath: path. path ( percentEncoded: false ) ) {
87+ do {
88+ try fileManager. removeItem ( at: path)
89+ } catch {
90+ cleanupError = cleanupError ?? error
91+ didFailCleanup = true
92+ }
5393 }
5494
55- do {
56- try fileManager. removeItem ( at: path)
57- } catch {
58- cleanupError = cleanupError ?? error
95+ if didFailCleanup {
5996 remainingIDs. insert ( id)
6097 }
6198 }
0 commit comments