Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 23 additions & 6 deletions Sources/DependencyCalculator/DependencyCalculator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@ import Workspace
public extension WorkspaceInfo {
func affectedTargets(changedFiles: Set<Path>,
incldueIndirectlyAffected: Bool = true) -> Set<TargetIdentity> {
let directlyChanged = directlyChangedTargets(changedFiles: changedFiles)

if incldueIndirectlyAffected {
let indirectlyAffected = indirectlyAffectedTargets(targets: directlyChanged)
return directlyChanged.union(indirectlyAffected)
}

let directlyAffected = directlyAffectedTargets(targets: directlyChanged)
return directlyChanged.union(directlyAffected)
}

private func directlyChangedTargets(changedFiles: Set<Path>) -> Set<TargetIdentity> {
var result = Set<TargetIdentity>()

for path in changedFiles {
Expand All @@ -21,13 +33,18 @@ public extension WorkspaceInfo {
logger.info("Changed file at \(path) appears not to belong to any target")
}
}
if incldueIndirectlyAffected {
let indirectlyAffected = indirectlyAffectedTargets(targets: result)
return result.union(indirectlyAffected)
}
else {
return result

return result
}

func directlyAffectedTargets(targets: Set<TargetIdentity>) -> Set<TargetIdentity> {
var result = Set<TargetIdentity>()

for targetAffected in targets {
result = result.union(dependencyStructure.affected(by: targetAffected))
}

return result
}

internal func targetForFolder(_ path: Path) -> TargetIdentity? {
Expand Down
30 changes: 28 additions & 2 deletions Tests/SelectiveTestingTests/SelectiveTestingProjectTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ struct SelectiveTestingProjectTests {
// then
let result = try await tool.run()
#expect(result == Set([
testTool.mainProjectMainTarget()
testTool.mainProjectMainTarget(),
testTool.mainProjectTests(),
testTool.mainProjectUITests(),
]))
}

Expand Down Expand Up @@ -125,7 +127,31 @@ struct SelectiveTestingProjectTests {
// then
let result = try await tool.run()
#expect(result == Set([
testTool.mainProjectMainTarget()
testTool.mainProjectMainTarget(),
testTool.mainProjectTests(),
testTool.mainProjectUITests(),
]))
}

@Test
func projectTargetDependencyChange_turbo() async throws {
// given
let testTool = try IntegrationTestTool()
defer { try? testTool.tearDown() }

let tool = try testTool.createSUT(config: nil,
basePath: "ExampleProject.xcodeproj",
turbo: true)

// when
try testTool.changeFile(at: testTool.projectPath + "ExmapleTargetLibrary/ExampleTargetLibrary.swift")

// then
let result = try await tool.run()
#expect(result == Set([
testTool.mainProjectLibrary(),
testTool.mainProjectMainTarget(),
testTool.mainProjectLibraryTests(),
]))
}

Expand Down
Loading