Browse Source

[Release Tooling] Only embed bundles containing privacy manifests (#12324)

Nick Cooke 2 years ago
parent
commit
4914cc295e
1 changed files with 28 additions and 0 deletions
  1. 28 0
      ReleaseTooling/Sources/ZipBuilder/FrameworkBuilder.swift

+ 28 - 0
ReleaseTooling/Sources/ZipBuilder/FrameworkBuilder.swift

@@ -635,6 +635,34 @@ struct FrameworkBuilder {
           "\(framework): \(error)")
       }
 
+      // Move any privacy manifest-containing resource bundles into the
+      // platform framework.
+      try? fileManager.contentsOfDirectory(
+        at: frameworkPath.deletingLastPathComponent(),
+        includingPropertiesForKeys: nil
+      )
+      .filter { $0.pathExtension == "bundle" }
+      // TODO(ncooke3): Once the zip is built with Xcode 15, the following
+      // `filter` can be removed. The following block exists to preserve
+      // how resources (e.g. like FIAM's) are packaged for use in Xcode 14.
+      .filter { bundleURL in
+        let dirEnum = fileManager.enumerator(atPath: bundleURL.path)
+        var containsPrivacyManifest = false
+        while let relativeFilePath = dirEnum?.nextObject() as? String {
+          if relativeFilePath.hasSuffix("PrivacyInfo.xcprivacy") {
+            containsPrivacyManifest = true
+            break
+          }
+        }
+        return containsPrivacyManifest
+      }
+      // Bundles are moved rather than copied to prevent them from being
+      // packaged in a `Resources` directory at the root of the xcframework.
+      .forEach { try! fileManager.moveItem(
+        at: $0,
+        to: platformFrameworkDir.appendingPathComponent($0.lastPathComponent)
+      ) }
+
       // Headers from slice
       do {
         let headersSrc: URL = frameworkPath.appendingPathComponent("Headers")