Skip to content

Commit f97204e

Browse files
authored
Fix infinity loop (#965)
1 parent 9b43de9 commit f97204e

File tree

7 files changed

+26
-11
lines changed

7 files changed

+26
-11
lines changed

Sources/ProjectDrivers/XcodeProjectDriver.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,20 @@
3434

3535
try xcodebuild.ensureConfigured()
3636

37-
let project: XcodeProjectlike = if projectPath.extension == "xcworkspace" {
38-
try XcodeWorkspace(
37+
let project: XcodeProjectlike
38+
if projectPath.extension == "xcworkspace" {
39+
project = try XcodeWorkspace(
3940
path: .makeAbsolute(projectPath),
4041
xcodebuild: xcodebuild,
4142
configuration: configuration,
4243
logger: logger,
4344
shell: shell
4445
)
4546
} else {
46-
try XcodeProject(
47+
var loadedProjectPaths: Set<FilePath> = []
48+
project = try XcodeProject(
4749
path: .makeAbsolute(projectPath),
50+
loadedProjectPaths: &loadedProjectPaths,
4851
xcodebuild: xcodebuild,
4952
shell: shell,
5053
logger: logger

Sources/XcodeSupport/XcodeProject.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public final class XcodeProject: XcodeProjectlike {
1717

1818
convenience init?(
1919
path: FilePath,
20-
loadedProjectPaths: Set<FilePath> = [],
20+
loadedProjectPaths: inout Set<FilePath>,
2121
referencedBy refPath:
2222
FilePath,
2323
shell: Shell,
@@ -31,7 +31,7 @@ public final class XcodeProject: XcodeProjectlike {
3131
let xcodebuild = Xcodebuild(shell: shell, logger: logger)
3232
try self.init(
3333
path: path,
34-
loadedProjectPaths: loadedProjectPaths,
34+
loadedProjectPaths: &loadedProjectPaths,
3535
xcodebuild: xcodebuild,
3636
shell: shell,
3737
logger: logger
@@ -40,7 +40,7 @@ public final class XcodeProject: XcodeProjectlike {
4040

4141
public required init(
4242
path: FilePath,
43-
loadedProjectPaths: Set<FilePath> = [],
43+
loadedProjectPaths: inout Set<FilePath>,
4444
xcodebuild: Xcodebuild,
4545
shell: Shell,
4646
logger: Logger
@@ -59,7 +59,7 @@ public final class XcodeProject: XcodeProjectlike {
5959
}
6060

6161
var subProjects: [XcodeProject] = []
62-
let loadedProjectPaths = loadedProjectPaths.union([path])
62+
loadedProjectPaths.insert(path)
6363

6464
// Don't search for sub projects within CocoaPods.
6565
if !path.components.contains("Pods.xcodeproj") {
@@ -74,7 +74,7 @@ public final class XcodeProject: XcodeProjectlike {
7474

7575
return try XcodeProject(
7676
path: projectPath,
77-
loadedProjectPaths: loadedProjectPaths,
77+
loadedProjectPaths: &loadedProjectPaths,
7878
referencedBy: path,
7979
shell: shell,
8080
logger: logger

Sources/XcodeSupport/XcodeProjectSetupGuide.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ public final class XcodeProjectSetupGuide: SetupGuideHelpers, SetupGuide {
6868
shell: shell
6969
)
7070
} else if let projectPath = identifyProject() {
71+
var loadedProjectPaths: Set<FilePath> = []
7172
project = try XcodeProject(
7273
path: projectPath,
74+
loadedProjectPaths: &loadedProjectPaths,
7375
xcodebuild: xcodebuild,
7476
shell: shell,
7577
logger: logger

Sources/XcodeSupport/XcodeWorkspace.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ public final class XcodeWorkspace: XcodeProjectlike {
3131
}
3232

3333
let projectPaths = collectProjectPaths(in: xcworkspace.data.children)
34-
let projects = try projectPaths.compactMapSet { try XcodeProject(path: sourceRoot.pushing($0), referencedBy: self.path, shell: shell, logger: logger) }
34+
var loadedProjectPaths: Set<FilePath> = []
35+
let projects = try projectPaths.compactMapSet {
36+
try XcodeProject(path: sourceRoot.pushing($0), loadedProjectPaths: &loadedProjectPaths, referencedBy: self.path, shell: shell, logger: logger)
37+
}
3538

3639
targets = projects.reduce(into: .init()) { result, project in
3740
result.formUnion(project.targets)

Tests/XcodeTests/XcodeTargetTest.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Foundation
22
import Logger
33
import Shared
4+
import SystemPackage
45
@testable import TestShared
56
@testable import XcodeSupport
67
import XCTest
@@ -13,8 +14,10 @@ final class XcodeTargetTest: XCTestCase {
1314
let logger = Logger(quiet: true)
1415
let shell = Shell(logger: logger)
1516
let xcodebuild = Xcodebuild(shell: shell, logger: logger)
17+
var loadedProjectPaths: Set<FilePath> = []
1618
project = try! XcodeProject(
1719
path: UIKitProjectPath,
20+
loadedProjectPaths: &loadedProjectPaths,
1821
xcodebuild: xcodebuild,
1922
shell: shell,
2023
logger: logger

Tests/XcodeTests/XcodebuildBuildProjectTest.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Foundation
22
import Logger
33
import Shared
4+
import SystemPackage
45
@testable import XcodeSupport
56
import XCTest
67

@@ -13,8 +14,9 @@ final class XcodebuildBuildProjectTest: XCTestCase {
1314

1415
let logger = Logger(quiet: true)
1516
let shell = Shell(logger: logger)
17+
var loadedProjectPaths: Set<FilePath> = []
1618
xcodebuild = Xcodebuild(shell: shell, logger: logger)
17-
project = try! XcodeProject(path: UIKitProjectPath, xcodebuild: xcodebuild, shell: shell, logger: logger)
19+
project = try! XcodeProject(path: UIKitProjectPath, loadedProjectPaths: &loadedProjectPaths, xcodebuild: xcodebuild, shell: shell, logger: logger)
1820
}
1921

2022
override func tearDown() {

Tests/XcodeTests/XcodebuildSchemesTest.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22
import Logger
3+
import SystemPackage
34
@testable import XcodeSupport
45
import XCTest
56

@@ -13,8 +14,9 @@ final class XcodebuildSchemesTest: XCTestCase {
1314

1415
shell = ShellMock()
1516
let logger = Logger(quiet: true)
17+
var loadedProjectPaths: Set<FilePath> = []
1618
xcodebuild = Xcodebuild(shell: shell, logger: logger)
17-
project = try! XcodeProject(path: UIKitProjectPath, xcodebuild: xcodebuild, shell: shell, logger: logger)
19+
project = try! XcodeProject(path: UIKitProjectPath, loadedProjectPaths: &loadedProjectPaths, xcodebuild: xcodebuild, shell: shell, logger: logger)
1820
}
1921

2022
override func tearDown() {

0 commit comments

Comments
 (0)