Fix getAllCarthageDependencies for aggregate targets

This commit is contained in:
Brentley Jones
2018-08-22 09:36:42 -05:00
parent cf19fb27cb
commit 5693717a9f
+28 -20
View File
@@ -910,37 +910,45 @@ public class PBXProjGenerator {
return "\(carthagePath)/\(platformName)"
}
func getAllCarthageDependencies(target: Target) -> [Dependency] {
func getAllCarthageDependencies(target topLevelTarget: Target) -> [Dependency] {
// this is used to resolve cyclical target dependencies
var visitedTargets: Set<String> = []
var frameworks: [String: Dependency] = [:]
var queue: [Target] = [target]
var queue: [ProjectTarget] = [topLevelTarget]
while !queue.isEmpty {
let target = queue.removeFirst()
if visitedTargets.contains(target.name) {
let projectTarget = queue.removeFirst()
if visitedTargets.contains(projectTarget.name) {
continue
}
for dependency in target.dependencies {
// don't overwrite frameworks, to allow top level ones to rule
if frameworks.contains(reference: dependency.reference) {
continue
}
switch dependency.type {
case .carthage:
frameworks[dependency.reference] = dependency
case .target:
if let target = project.getTarget(dependency.reference) {
queue.append(target)
if let target = projectTarget as? Target {
for dependency in target.dependencies {
// don't overwrite frameworks, to allow top level ones to rule
if frameworks.contains(reference: dependency.reference) {
continue
}
switch dependency.type {
case .carthage:
frameworks[dependency.reference] = dependency
case .target:
if let projectTarget = project.getProjectTarget(dependency.reference) {
queue.append(projectTarget)
}
default:
break
}
}
} else if let aggregateTarget = projectTarget as? AggregateTarget {
for dependencyName in aggregateTarget.targets {
if let projectTarget = project.getProjectTarget(dependencyName) {
queue.append(projectTarget)
}
default:
break
}
}
visitedTargets.update(with: target.name)
visitedTargets.update(with: projectTarget.name)
}
return frameworks.sorted(by: { $0.key < $1.key }).map { $0.value }