xcode_validator.dart 2.43 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import '../base/user_messages.dart';
6
import '../doctor_validator.dart';
7 8 9
import 'xcode.dart';

class XcodeValidator extends DoctorValidator {
10
  XcodeValidator({
11 12
    required Xcode xcode,
    required UserMessages userMessages,
13 14 15 16 17 18
  }) : _xcode = xcode,
      _userMessages = userMessages,
      super('Xcode - develop for iOS and macOS');

  final Xcode _xcode;
  final UserMessages _userMessages;
19 20 21 22 23

  @override
  Future<ValidationResult> validate() async {
    final List<ValidationMessage> messages = <ValidationMessage>[];
    ValidationType xcodeStatus = ValidationType.missing;
24 25 26
    String? xcodeVersionInfo;

    final String? xcodeSelectPath = _xcode.xcodeSelectPath;
27

28
    if (_xcode.isInstalled) {
29
      xcodeStatus = ValidationType.installed;
30 31 32 33 34 35 36
      if (xcodeSelectPath != null) {
        messages.add(ValidationMessage(_userMessages.xcodeLocation(xcodeSelectPath)));
      }
      final String? versionText = _xcode.versionText;
      if (versionText != null) {
        messages.add(ValidationMessage(versionText));
      }
37

38
      if (!_xcode.isInstalledAndMeetsVersionCheck) {
39
        xcodeStatus = ValidationType.partial;
40 41 42 43 44 45 46 47 48 49
        messages.add(ValidationMessage.error(_userMessages.xcodeOutdated(
          _xcode.currentVersion.toString(),
          xcodeRecommendedVersion.toString(),
        )));
      } else if (!_xcode.isRecommendedVersionSatisfactory) {
        xcodeStatus = ValidationType.partial;
        messages.add(ValidationMessage.hint(_userMessages.xcodeOutdated(
          _xcode.currentVersion.toString(),
          xcodeRecommendedVersion.toString(),
        )));
50 51
      }

52
      if (!_xcode.eulaSigned) {
53
        xcodeStatus = ValidationType.partial;
54
        messages.add(ValidationMessage.error(_userMessages.xcodeEula));
55
      }
56
      if (!_xcode.isSimctlInstalled) {
57
        xcodeStatus = ValidationType.partial;
58
        messages.add(ValidationMessage.error(_userMessages.xcodeMissingSimct));
59 60 61 62
      }

    } else {
      xcodeStatus = ValidationType.missing;
63
      if (xcodeSelectPath == null || xcodeSelectPath.isEmpty) {
64
        messages.add(ValidationMessage.error(_userMessages.xcodeMissing));
65
      } else {
66
        messages.add(ValidationMessage.error(_userMessages.xcodeIncomplete));
67 68 69 70 71
      }
    }

    return ValidationResult(xcodeStatus, messages, statusInfo: xcodeVersionInfo);
  }
72
}