Skip to content

Commit a7eec2a

Browse files
fortmarekclaude
andauthored
fix(cli): resolve derived data path from DERIVED_DATA_DIR env in inspect commands (tuist#9396)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0752251 commit a7eec2a

4 files changed

Lines changed: 75 additions & 9 deletions

File tree

cli/Sources/TuistKit/Services/Inspect/InspectBuildCommandService.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,14 @@ struct InspectBuildCommandService {
110110
Logger.current.debug("Inspect build: base path resolved to \(basePath.pathString)")
111111
let projectPath = try await xcodeProjectOrWorkspacePathLocator.locate(from: basePath)
112112
Logger.current.debug("Inspect build: project path resolved to \(projectPath.pathString)")
113-
let currentWorkingDirectory = try await Environment.current.currentWorkingDirectory()
114-
var projectDerivedDataDirectory: AbsolutePath! = try derivedDataPath.map { try AbsolutePath(
115-
validating: $0,
116-
relativeTo: currentWorkingDirectory
117-
) }
118-
if projectDerivedDataDirectory == nil {
113+
let projectDerivedDataDirectory: AbsolutePath
114+
if let derivedDataPath {
115+
let currentWorkingDirectory = try await Environment.current.currentWorkingDirectory()
116+
projectDerivedDataDirectory = try AbsolutePath(
117+
validating: derivedDataPath,
118+
relativeTo: currentWorkingDirectory
119+
)
120+
} else {
119121
projectDerivedDataDirectory = try await derivedDataLocator.locate(for: projectPath)
120122
}
121123
Logger.current.debug("Inspect build: derived data directory resolved to \(projectDerivedDataDirectory.pathString)")

cli/Sources/TuistKit/Services/Inspect/InspectTestCommandService.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,14 @@ struct InspectTestCommandService {
133133

134134
let projectPath = try await xcodeProjectOrWorkspacePathLocator.locate(from: basePath)
135135
Logger.current.debug("Inspect test: project path resolved to \(projectPath.pathString)")
136-
let projectDerivedDataDirectory = if let derivedDataPath {
137-
try AbsolutePath(
136+
let projectDerivedDataDirectory: AbsolutePath
137+
if let derivedDataPath {
138+
projectDerivedDataDirectory = try AbsolutePath(
138139
validating: derivedDataPath,
139140
relativeTo: currentWorkingDirectory
140141
)
141142
} else {
142-
try await derivedDataLocator.locate(for: projectPath)
143+
projectDerivedDataDirectory = try await derivedDataLocator.locate(for: projectPath)
143144
}
144145
Logger.current.debug("Inspect test: derived data directory resolved to \(projectDerivedDataDirectory.pathString)")
145146

cli/Sources/TuistSupport/Utils/DerivedDataLocator.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ public final class DerivedDataLocator: DerivedDataLocating {
1717
public func locate(
1818
for projectPath: AbsolutePath
1919
) async throws -> AbsolutePath {
20+
if let derivedDataDir = Environment.current.variables["DERIVED_DATA_DIR"] {
21+
let derivedDataDirPath = try AbsolutePath(validating: derivedDataDir)
22+
let defaultDerivedDataDirectory = try await Environment.current.derivedDataDirectory()
23+
if derivedDataDirPath != defaultDerivedDataDirectory {
24+
return derivedDataDirPath
25+
}
26+
}
2027
let hash = try XcodeProjectPathHasher.hashString(for: projectPath.pathString)
2128
return try await Environment.current.derivedDataDirectory()
2229
.appending(component: "\(projectPath.basenameWithoutExt)-\(hash)")
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import FileSystem
2+
import FileSystemTesting
3+
import Foundation
4+
import Path
5+
import Testing
6+
import TuistEnvironment
7+
import TuistTesting
8+
9+
@testable import TuistSupport
10+
11+
struct DerivedDataLocatorTests {
12+
private let subject = DerivedDataLocator()
13+
14+
@Test(.inTemporaryDirectory, .withMockedEnvironment())
15+
func locate_uses_DERIVED_DATA_DIR_when_different_from_default() async throws {
16+
let temporaryDirectory = try #require(FileSystem.temporaryTestDirectory)
17+
let projectPath = temporaryDirectory.appending(component: "App.xcodeproj")
18+
19+
let mockedEnvironment = try #require(Environment.mocked)
20+
let customDerivedDataPath = temporaryDirectory.appending(component: "custom-derived-data")
21+
mockedEnvironment.variables["DERIVED_DATA_DIR"] = customDerivedDataPath.pathString
22+
23+
let result = try await subject.locate(for: projectPath)
24+
25+
#expect(result == customDerivedDataPath)
26+
}
27+
28+
@Test(.inTemporaryDirectory, .withMockedEnvironment())
29+
func locate_ignores_DERIVED_DATA_DIR_when_equal_to_default() async throws {
30+
let temporaryDirectory = try #require(FileSystem.temporaryTestDirectory)
31+
let projectPath = temporaryDirectory.appending(component: "App.xcodeproj")
32+
33+
let mockedEnvironment = try #require(Environment.mocked)
34+
let defaultDerivedDataDirectory = try await Environment.current.derivedDataDirectory()
35+
mockedEnvironment.variables["DERIVED_DATA_DIR"] = defaultDerivedDataDirectory.pathString
36+
37+
let result = try await subject.locate(for: projectPath)
38+
39+
#expect(result != defaultDerivedDataDirectory)
40+
#expect(result.parentDirectory == defaultDerivedDataDirectory)
41+
#expect(result.basename.hasPrefix("App-"))
42+
}
43+
44+
@Test(.inTemporaryDirectory, .withMockedEnvironment())
45+
func locate_falls_back_to_hash_based_path() async throws {
46+
let temporaryDirectory = try #require(FileSystem.temporaryTestDirectory)
47+
let projectPath = temporaryDirectory.appending(component: "App.xcodeproj")
48+
49+
let defaultDerivedDataDirectory = try await Environment.current.derivedDataDirectory()
50+
51+
let result = try await subject.locate(for: projectPath)
52+
53+
#expect(result.parentDirectory == defaultDerivedDataDirectory)
54+
#expect(result.basename.hasPrefix("App-"))
55+
}
56+
}

0 commit comments

Comments
 (0)