Support Xcode patch version comparison (#61484)
diff --git a/packages/flutter_tools/lib/src/base/user_messages.dart b/packages/flutter_tools/lib/src/base/user_messages.dart index b4b7275..8730ebc 100644 --- a/packages/flutter_tools/lib/src/base/user_messages.dart +++ b/packages/flutter_tools/lib/src/base/user_messages.dart
@@ -138,8 +138,8 @@ // Messages used in XcodeValidator String xcodeLocation(String location) => 'Xcode at $location'; - String xcodeOutdated(int versionMajor, int versionMinor) => - 'Flutter requires a minimum Xcode version of $versionMajor.$versionMinor.0.\n' + String xcodeOutdated(int versionMajor, int versionMinor, int versionPatch) => + 'Flutter requires a minimum Xcode version of $versionMajor.$versionMinor.$versionPatch.\n' 'Download the latest version or update via the Mac App Store.'; String get xcodeEula => "Xcode end user license agreement not signed; open Xcode or run the command 'sudo xcodebuild -license'."; String get xcodeMissingSimct =>
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 1223b2e..abaf1d8 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -600,7 +600,7 @@ final Map<String, String> buildSettings; } -const String _xcodeRequirement = 'Xcode $kXcodeRequiredVersionMajor.$kXcodeRequiredVersionMinor or greater is required to develop for iOS.'; +const String _xcodeRequirement = 'Xcode $kXcodeRequiredVersionMajor.$kXcodeRequiredVersionMinor.$kXcodeRequiredVersionPatch or greater is required to develop for iOS.'; bool _checkXcodeVersion() { if (!globals.platform.isMacOS) {
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart index 8b09b35..7d0c532 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -261,13 +261,15 @@ return; } try { - final RunResult result = _processUtils.runSync( - <String>[_executable, '-version'], - ); - if (result.exitCode != 0) { - return; + if (_versionText == null) { + final RunResult result = _processUtils.runSync( + <String>[_executable, '-version'], + ); + if (result.exitCode != 0) { + return; + } + _versionText = result.stdout.trim().replaceAll('\n', ', '); } - _versionText = result.stdout.trim().replaceAll('\n', ', '); final Match match = _versionRegex.firstMatch(versionText); if (match == null) { return; @@ -275,7 +277,8 @@ final String version = match.group(1); final List<String> components = version.split('.'); _majorVersion = int.parse(components[0]); - _minorVersion = components.length == 1 ? 0 : int.parse(components[1]); + _minorVersion = components.length < 2 ? 0 : int.parse(components[1]); + _patchVersion = components.length < 3 ? 0 : int.parse(components[2]); } on ProcessException { // Ignored, leave values null. } @@ -307,6 +310,14 @@ return _minorVersion; } + int _patchVersion; + int get patchVersion { + if (_patchVersion == null) { + _updateVersion(); + } + return _patchVersion; + } + /// Asynchronously retrieve xcode build settings. This one is preferred for /// new call-sites. ///
diff --git a/packages/flutter_tools/lib/src/macos/xcode.dart b/packages/flutter_tools/lib/src/macos/xcode.dart index 81a430c..9d93670 100644 --- a/packages/flutter_tools/lib/src/macos/xcode.dart +++ b/packages/flutter_tools/lib/src/macos/xcode.dart
@@ -27,6 +27,7 @@ const int kXcodeRequiredVersionMajor = 11; const int kXcodeRequiredVersionMinor = 0; +const int kXcodeRequiredVersionPatch = 0; enum SdkType { iPhone, @@ -97,8 +98,8 @@ } int get majorVersion => _xcodeProjectInterpreter.majorVersion; - int get minorVersion => _xcodeProjectInterpreter.minorVersion; + int get patchVersion => _xcodeProjectInterpreter.patchVersion; String get versionText => _xcodeProjectInterpreter.versionText; @@ -151,6 +152,9 @@ return true; } if (majorVersion == kXcodeRequiredVersionMajor) { + if (minorVersion == kXcodeRequiredVersionMinor) { + return patchVersion >= kXcodeRequiredVersionPatch; + } return minorVersion >= kXcodeRequiredVersionMinor; } return false;
diff --git a/packages/flutter_tools/lib/src/macos/xcode_validator.dart b/packages/flutter_tools/lib/src/macos/xcode_validator.dart index 7aeb5ac..72086ad 100644 --- a/packages/flutter_tools/lib/src/macos/xcode_validator.dart +++ b/packages/flutter_tools/lib/src/macos/xcode_validator.dart
@@ -39,7 +39,7 @@ if (!_xcode.isInstalledAndMeetsVersionCheck) { xcodeStatus = ValidationType.partial; messages.add(ValidationMessage.error( - _userMessages.xcodeOutdated(kXcodeRequiredVersionMajor, kXcodeRequiredVersionMinor) + _userMessages.xcodeOutdated(kXcodeRequiredVersionMajor, kXcodeRequiredVersionMinor, kXcodeRequiredVersionPatch) )); }