From 715e476545e5504a57cd3972a1966e0d1f20623f Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 7 Aug 2024 12:59:11 -0700 Subject: [PATCH] Add xcresulttool --legacy flag for deprecated usage (#152988) Workaround to add the `--legacy` flag until https://github.com/flutter/flutter/issues/151502 can adopt the non-deprecated usage. This will allow Xcode errors to be parseable again. Fixes https://github.com/flutter/flutter/issues/152989 --- .../flutter_tools/lib/src/ios/xcresult.dart | 9 ++++++-- .../test/general.shard/ios/xcresult_test.dart | 22 ++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/ios/xcresult.dart b/packages/flutter_tools/lib/src/ios/xcresult.dart index 2205af7a66b..ed457c01ecd 100644 --- a/packages/flutter_tools/lib/src/ios/xcresult.dart +++ b/packages/flutter_tools/lib/src/ios/xcresult.dart @@ -7,6 +7,7 @@ import 'package:meta/meta.dart'; import '../../src/base/process.dart'; import '../../src/convert.dart' show json; import '../../src/macos/xcode.dart'; +import '../base/version.dart'; import '../convert.dart'; /// The generator of xcresults. @@ -35,18 +36,22 @@ class XCResultGenerator { /// Generates the XCResult. /// - /// Calls `xcrun xcresulttool get --path --format json`, + /// Calls `xcrun xcresulttool get --legacy --path --format json`, /// then stores the useful information the json into an [XCResult] object. /// /// A`issueDiscarders` can be passed to discard any issues that matches the description of any [XCResultIssueDiscarder] in the list. Future generate( {List issueDiscarders = const []}) async { + final Version? xcodeVersion = xcode.currentVersion; final RunResult result = await processUtils.run( [ ...xcode.xcrunCommand(), 'xcresulttool', 'get', + // See https://github.com/flutter/flutter/issues/151502 + if (xcodeVersion != null && xcodeVersion >= Version(16, 0, 0)) + '--legacy', '--path', resultPath, '--format', @@ -74,7 +79,7 @@ class XCResultGenerator { /// The xcresult of an `xcodebuild` command. /// -/// This is the result from an `xcrun xcresulttool get --path --format json` run. +/// This is the result from an `xcrun xcresulttool get --legacy --path --format json` run. /// The result contains useful information such as build errors and warnings. class XCResult { /// Parse the `resultJson` and stores useful information in the returned `XCResult`. diff --git a/packages/flutter_tools/test/general.shard/ios/xcresult_test.dart b/packages/flutter_tools/test/general.shard/ios/xcresult_test.dart index 23437aa375b..7752fe84cfa 100644 --- a/packages/flutter_tools/test/general.shard/ios/xcresult_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/xcresult_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/process.dart'; +import 'package:flutter_tools/src/base/version.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/ios/xcresult.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; @@ -21,12 +22,15 @@ void main() { required Xcode xcode, int exitCode = 0, String stderr = '', + bool useLegacyFlag = true, }) { return FakeCommand( command: [ ...xcode.xcrunCommand(), 'xcresulttool', 'get', + if (useLegacyFlag) + '--legacy', '--path', tempResultPath, '--format', @@ -58,6 +62,8 @@ void main() { required String resultJson, int exitCode = 0, String stderr = '', + Version? xcodeVersion = const Version.withText(16, 0, 0, '16.0'), + bool useLegacyFlag = true, }) { final FakeProcessManager fakeProcessManager = FakeProcessManager.list([ @@ -68,7 +74,7 @@ void main() { processManager: fakeProcessManager, xcodeProjectInterpreter: XcodeProjectInterpreter.test( processManager: fakeProcessManager, - version: null, + version: xcodeVersion, ), ); fakeProcessManager.addCommands( @@ -79,6 +85,7 @@ void main() { xcode: xcode, exitCode: exitCode, stderr: stderr, + useLegacyFlag: useLegacyFlag ), ], ); @@ -217,6 +224,19 @@ void main() { expect(result.parsingErrorMessage, isNull); }); + testWithoutContext( + 'correctly parse sample result on < Xcode 16.', () async { + final XCResultGenerator generator = setupGenerator( + resultJson: kSampleResultJsonNoIssues, + xcodeVersion: Version(15, 0, 0), + useLegacyFlag: false, + ); + final XCResult result = await generator.generate(); + expect(result.issues.length, 0); + expect(result.parseSuccess, isTrue); + expect(result.parsingErrorMessage, isNull); + }); + testWithoutContext( 'error: `xcresulttool get` process fail should return an `XCResult` with stderr as `parsingErrorMessage`.', () async {