Skip to content

Swift Package Manager support#2976

Open
MatejLNCD wants to merge 8 commits intomasterfrom
support-spm
Open

Swift Package Manager support#2976
MatejLNCD wants to merge 8 commits intomasterfrom
support-spm

Conversation

@MatejLNCD
Copy link
Copy Markdown
Contributor

@MatejLNCD MatejLNCD commented Mar 13, 2026

Summary

  • Add a Package.swift manifest for the Patrol plugin, enabling Flutter's native SPM integration as
    an alternative to CocoaPods
  • Restructure source files into SPM-compatible layout (Sources/patrol/, Sources/HTTPParserC/), since SPM doesn't support mixing C and Swift, while maintaining CocoaPods compatibility by updating podspec paths
  • Configure XCTest weak framework linking with dynamic Xcode developer directory resolution, so the
    plugin builds correctly under SPM without hard-coded paths
  • Update the example app's Xcode project to use FlutterGeneratedPluginSwiftPackage and add
    HEADER_SEARCH_PATHS for the patrol ObjC headers
  • Add Flutter SPM pre-action build scripts to both dev and prod schemes
  • Handle SPM/CocoaPods divergence in RunnerUITests.m with a conditional #import fallback for the
    PATROL_INTEGRATION_TEST_IOS_RUNNER macro

Details

The plugin now supports both CocoaPods and SPM side-by-side:

  • CocoaPods path: patrol.podspec updated to point at the new source locations under
    patrol/Sources/
  • SPM path: New Package.swift defines two targets (HTTPParserC for the C HTTP parser,
    patrol for all Swift sources) with CocoaAsyncSocket as an external dependency
  • Swift files that previously relied on implicit imports now explicitly import Foundation
  • Example app analysis options updated to exclude .build/ directories

@github-actions github-actions bot added the package: patrol Related to the patrol package (native automation, test bundling) label Mar 13, 2026
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request modernizes the patrol package by adding comprehensive support for Swift Package Manager. The changes involve a significant reorganization of the native iOS/macOS codebase, updating build configurations for both SPM and CocoaPods, and streamlining dependency management within the example project. This enhancement provides developers with more flexibility in how they integrate and manage the patrol package in their Flutter applications.

Highlights

  • Swift Package Manager Support: Introduced full support for Swift Package Manager (SPM) for the patrol package, allowing it to be integrated into iOS/macOS projects using SPM.
  • Project Structure Refactoring: Restructured the native iOS/macOS code within the patrol package to align with SPM conventions, moving source files into a dedicated patrol/Sources/patrol directory.
  • CocoaPods Configuration Updates: Updated the patrol.podspec file to reflect the new file organization and resource paths, ensuring continued compatibility for CocoaPods users.
  • Xcode Project Configuration: Modified the example Xcode project (Runner.xcodeproj) to correctly integrate Swift Package Manager dependencies and adjust header search paths.
  • Dependency Management Streamlining: Significantly reduced the number of CocoaPods dependencies in the example project's Podfile.lock, indicating a shift towards SPM for managing native dependencies where possible.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • dev/e2e_app/analysis_options.yaml
    • Added build/** to the analyzer's exclude list.
  • gen_from_schema
    • Updated the output directory path for Darwin automator server files.
  • packages/patrol/darwin/.gitignore
    • Added .build/ and .swiftpm/ to the ignore list.
  • packages/patrol/darwin/Classes/PatrolPlugin.h
    • Removed the Objective-C header file.
  • packages/patrol/darwin/Classes/PatrolPlugin.m
    • Removed the Objective-C implementation file.
  • packages/patrol/darwin/patrol.podspec
    • Updated source file patterns to match the new SPM structure.
    • Updated public header file paths.
    • Adjusted resource bundle paths for privacy and localization files.
  • packages/patrol/darwin/patrol/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
    • Added Xcode workspace data for Swift Package Manager.
  • packages/patrol/darwin/patrol/Package.resolved
    • Added Swift Package Manager resolved dependencies, including CocoaAsyncSocket.
  • packages/patrol/darwin/patrol/Package.swift
    • Added the Swift Package Manager manifest file, defining the 'patrol' library target, its dependencies, resources, and linker settings.
  • packages/patrol/darwin/patrol/Sources/HTTPParserC/http_parser.c
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/HTTPParserC/http_parser.c.
  • packages/patrol/darwin/patrol/Sources/HTTPParserC/include/http_parser.h
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/HTTPParserC/http_parser.h.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Automator/Automator.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Automator/Automator.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Automator/IOSAutomator.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Automator/IOSAutomator.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Automator/MacOSAutomator.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Automator/MacOSAutomator.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/AutomatorServer.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/AutomatorServer.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Contracts.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Contracts.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/ElementTypeUtils.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/ElementTypeUtils.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Errors.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Errors.swift.
    • Added import Foundation.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/IosAutomatorServer.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/IosAutomatorServer.swift.
    • Added import Foundation.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Localization.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Localization.swift.
    • Updated bundle loading logic to support Swift Package Manager.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/Logger.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/Logger.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/MobileAutomatorServer.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/MobileAutomatorServer.swift.
    • Added import Foundation.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/PatrolAppServiceClient.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/PatrolAppServiceClient.swift.
    • Added import Foundation.
  • packages/patrol/darwin/patrol/Sources/patrol/AutomatorServer/PatrolServer.swift
    • Renamed file from packages/patrol/darwin/Classes/AutomatorServer/PatrolServer.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/ObjCPatrolAppServiceClient.swift
    • Renamed file from packages/patrol/darwin/Classes/ObjCPatrolAppServiceClient.swift.
    • Added import Foundation.
  • packages/patrol/darwin/patrol/Sources/patrol/Resources/PrivacyInfo.xcprivacy
    • Renamed file from packages/patrol/darwin/Resources/PrivacyInfo.xcprivacy.
  • packages/patrol/darwin/patrol/Sources/patrol/Resources/de.lproj/Localizable.strings
    • Renamed file from packages/patrol/darwin/Resources/de.lproj/Localizable.strings.
  • packages/patrol/darwin/patrol/Sources/patrol/Resources/en.lproj/Localizable.strings
    • Renamed file from packages/patrol/darwin/Resources/en.lproj/Localizable.strings.
  • packages/patrol/darwin/patrol/Sources/patrol/Resources/fr.lproj/Localizable.strings
    • Renamed file from packages/patrol/darwin/Resources/fr.lproj/Localizable.strings.
  • packages/patrol/darwin/patrol/Sources/patrol/Resources/pl.lproj/Localizable.strings
    • Renamed file from packages/patrol/darwin/Resources/pl.lproj/Localizable.strings.
  • packages/patrol/darwin/patrol/Sources/patrol/SwiftPatrolPlugin.swift
    • Renamed file from packages/patrol/darwin/Classes/SwiftPatrolPlugin.swift.
    • Added @objc(PatrolPlugin) attribute.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Clients/Client+Config.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Clients/Client+Config.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Clients/WebSocketClient.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Clients/WebSocketClient.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Clients/WebSocketClientError.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Clients/WebSocketClientError.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Deprecations.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Deprecations.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/DispatchTimer.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/DispatchTimer.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/Array+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/Array+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/Data+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/Data+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/FileManager+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/FileManager+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/NSRegularExpression+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/NSRegularExpression+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/String+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/String+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/UInt+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/UInt+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/Extensions/URL+Ext.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/Extensions/URL+Ext.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/RFC1123.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/RFC1123.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Helpers/SynchronizedSet.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Helpers/SynchronizedSet.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Handlers/HTTPErrorDefaultHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Handlers/HTTPErrorDefaultHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Handlers/HTTPErrorHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Handlers/HTTPErrorHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Handlers/HTTPRequestHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Handlers/HTTPRequestHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPConfig.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPConfig.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPConnection.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPConnection.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPError.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPError.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPHeader+Common.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPHeader+Common.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPHeader.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPHeader.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPMessage.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPMessage.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPMethod.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPMethod.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPParser+Raw.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPParser+Raw.swift.
    • Added import Foundation and conditional import for HTTPParserC.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPParser.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPParser.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPRequest+Host.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPRequest+Host.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPRequest.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPRequest.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPResponse.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPResponse.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPStatus.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPStatus.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Models/HTTPVersion.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Models/HTTPVersion.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Routing/HTTPRoute.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Routing/HTTPRoute.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Routing/HTTPRouteHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Routing/HTTPRouteHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/HTTP/Routing/Server+Routing.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/HTTP/Routing/Server+Routing.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Handlers/HTTPWebSocketHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Handlers/HTTPWebSocketHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Handlers/WebSocketErrorDefaultHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Handlers/WebSocketErrorDefaultHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Handlers/WebSocketErrorHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Handlers/WebSocketErrorHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Handlers/WebSocketMessageDefaultHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Handlers/WebSocketMessageDefaultHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Handlers/WebSocketMessageHandler.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Handlers/WebSocketMessageHandler.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/HTTPHeader+WebSocket.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/HTTPHeader+WebSocket.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/HTTPMessage+WebSocket.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/HTTPMessage+WebSocket.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocket.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocket.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocketConfig.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocketConfig.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocketConnection.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocketConnection.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocketError.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocketError.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocketMessage+Write.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocketMessage+Write.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocketMessage.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocketMessage.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Protocols/WebSockets/Models/WebSocketParser.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Protocols/WebSockets/Models/WebSocketParser.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/Certificate.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/Certificate.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/CertificateIdentity.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/CertificateIdentity.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/KeychainError.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/KeychainError.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/KeychainManager.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/KeychainManager.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/SHA1.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/SHA1.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/TLSConfig.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/TLSConfig.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Security/TLSPolicy.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Security/TLSPolicy.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Server/Server+Config.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Server/Server+Config.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Server/Server.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Server/Server.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Server/ServerDelegates.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Server/ServerDelegates.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/DataStream.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/DataStream.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/Endpoint.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/Endpoint.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/Streams.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/Streams.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/TCPConnection.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/TCPConnection.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/TCPListener.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/TCPListener.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/TCPSocket.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/TCPSocket.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/Telegraph/Transport/URI.swift
    • Renamed file from packages/patrol/darwin/Classes/Telegraph/Transport/URI.swift.
  • packages/patrol/darwin/patrol/Sources/patrol/include/PatrolIntegrationTestIosRunner.h
    • Renamed file from packages/patrol/darwin/Classes/PatrolIntegrationTestIosRunner.h.
  • packages/patrol/darwin/patrol/Sources/patrol/include/PatrolIntegrationTestMacosRunner.h
    • Renamed file from packages/patrol/darwin/Classes/PatrolIntegrationTestMacosRunner.h.
  • packages/patrol/example/analysis_options.yaml
    • Added build/** to the analyzer's exclude list.
  • packages/patrol/example/ios/Flutter/AppFrameworkInfo.plist
    • Removed the MinimumOSVersion key.
  • packages/patrol/example/ios/Podfile.lock
    • Updated dependencies, removing many Firebase and Google-related pods.
  • packages/patrol/example/ios/Runner.xcodeproj/project.pbxproj
    • Added new build file references for FlutterGeneratedPluginSwiftPackage.
    • Added FlutterGeneratedPluginSwiftPackage to framework build phases for both Runner and RunnerUITests targets.
    • Added FlutterGeneratedPluginSwiftPackage to the Flutter group.
    • Added packageProductDependencies for FlutterGeneratedPluginSwiftPackage to both Runner and RunnerUITests targets.
    • Added packageReferences for FlutterGeneratedPluginSwiftPackage to the project object.
    • Added HEADER_SEARCH_PATHS to include patrol's new include directory in build configurations.
    • Added XCLocalSwiftPackageReference and XCSwiftPackageProductDependency sections.
  • packages/patrol/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
    • Added Swift Package Manager resolved dependencies for the example project.
  • packages/patrol/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/dev.xcscheme
    • Added a pre-action script to prepare the Flutter framework.
  • packages/patrol/example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved
    • Added Swift Package Manager resolved dependencies for the example workspace.
  • packages/patrol/example/ios/RunnerUITests/RunnerUITests.m
    • Added conditional import for PatrolIntegrationTestIosRunner.h to support both CocoaPods and SPM setups.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request successfully adds Swift Package Manager support to the patrol package. The changes involve restructuring the darwin source files to follow SPM conventions, creating a Package.swift file, and updating the example project to use the Swift package instead of CocoaPods for patrol. The file organization and configuration changes are well-executed. I have one suggestion for improving the robustness of the Package.swift script.

Comment on lines +7 to +18
let xcodeDevDir: String = {
let task = Process()
task.executableURL = URL(fileURLWithPath: "/usr/bin/xcode-select")
task.arguments = ["-p"]
let pipe = Pipe()
task.standardOutput = pipe
try? task.run()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
return String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines)
?? "/Applications/Xcode.app/Contents/Developer"
}()
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The current implementation to get the Xcode developer directory uses try?, which silently ignores any errors from the xcode-select -p command. If the command fails (e.g., command line tools are not installed or configured), it will fall back to a default path which might be incorrect, potentially leading to hard-to-debug build failures. It would be more robust to handle potential errors explicitly using a do-catch block and also check if the returned path is empty.

let xcodeDevDir: String = {
    let task = Process()
    task.executableURL = URL(fileURLWithPath: "/usr/bin/xcode-select")
    task.arguments = ["-p"]
    let pipe = Pipe()
    task.standardOutput = pipe

    do {
        try task.run()
        task.waitUntilExit()
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        if let path = String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines), !path.isEmpty {
            return path
        }
    } catch {
        // `xcode-select` is not available or failed, fall back to the default path.
    }

    return "/Applications/Xcode.app/Contents/Developer"
}()

@github-actions github-actions bot added the docs Concerns doc comments, READMEs, or docs label Mar 16, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 16, 2026

🚀 Preview Deployment Ready!

Preview URL: https://pr-2976-patrol-docs.vercel.app


Latest Deployment

  • Commit: 80a29b6
  • Branch: support-spm
  • Triggered by: @MatejLNCD
  • Deployed at: 2026-03-27 13:07:47 UTC

This preview URL is stable and will be updated with each new commit to this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Concerns doc comments, READMEs, or docs package: patrol Related to the patrol package (native automation, test bundling)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant