@@ -42,6 +42,7 @@ public extension PBXGroup {
4242 func sync( recursive: Bool , target: PBXTarget ? = nil ) {
4343 let target = target ?? parentProject? . targets. first
4444 removeDuplicateFiles ( recursive: recursive)
45+ removeDuplicateFilesByPath ( recursive: recursive)
4546 addMissingFiles ( recursive: recursive, target: target)
4647 removeMissingFiles ( recursive: recursive)
4748 }
@@ -65,6 +66,27 @@ public extension PBXGroup {
6566 }
6667 }
6768
69+ private func removeDuplicateFilesByPath( recursive: Bool ) {
70+ var itemsByPath : [ String : [ PBXReference ] ] = [ : ]
71+ for i in 0 ..< children. count {
72+ let child = children [ i]
73+ if let path = child. path {
74+ itemsByPath [ path, default: [ ] ] . append ( child)
75+ }
76+ if recursive, let group = child as? PBXGroup {
77+ group. removeDuplicateFilesByPath ( recursive: recursive)
78+ }
79+ }
80+ let duplicatePathItems = itemsByPath. filter { $0. value. count > 1 }
81+ duplicatePathItems. forEach { ( path, references) in
82+ references. forEach { reference in
83+ if reference. buildFiles. isEmpty {
84+ remove ( child: reference)
85+ }
86+ }
87+ }
88+ }
89+
6890 private func removeMissingFiles( recursive: Bool ) {
6991 var newChildren : [ PBXReference ] = [ ]
7092 children. forEach {
@@ -103,6 +125,7 @@ public extension PBXGroup {
103125
104126 private func addMissingFiles( recursive: Bool , target: PBXTarget ? ) {
105127 guard let url = self . url else { return }
128+
106129 let childPathItems : [ ( String , PBXReference ) ] = children. compactMap {
107130 guard let childURL = $0. url else { return nil }
108131 return ( childURL. path, $0)
0 commit comments