Flutter doctor detect IntelliJ on Mac (#6262)
* cleanup obtaining user home directory path * refactor doctor and detect IntelliJ on Mac * fix detect Flutter plugin for IntelliJ
This commit is contained in:
@@ -7,6 +7,7 @@ import 'dart:io';
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:pub_semver/pub_semver.dart';
|
||||
|
||||
import '../base/common.dart';
|
||||
import '../base/os.dart';
|
||||
import '../globals.dart';
|
||||
|
||||
@@ -60,13 +61,11 @@ class AndroidSdk {
|
||||
if (Platform.environment.containsKey('ANDROID_HOME')) {
|
||||
androidHomeDir = Platform.environment['ANDROID_HOME'];
|
||||
} else if (Platform.isLinux) {
|
||||
String homeDir = Platform.environment['HOME'];
|
||||
if (homeDir != null)
|
||||
androidHomeDir = '$homeDir/Android/Sdk';
|
||||
if (homeDirPath != null)
|
||||
androidHomeDir = '$homeDirPath/Android/Sdk';
|
||||
} else if (Platform.isMacOS) {
|
||||
String homeDir = Platform.environment['HOME'];
|
||||
if (homeDir != null)
|
||||
androidHomeDir = '$homeDir/Library/Android/sdk';
|
||||
if (homeDirPath != null)
|
||||
androidHomeDir = '$homeDirPath/Library/Android/sdk';
|
||||
}
|
||||
|
||||
if (androidHomeDir != null) {
|
||||
|
||||
@@ -2,10 +2,27 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
const int kDefaultObservatoryPort = 8100;
|
||||
const int kDefaultDiagnosticPort = 8101;
|
||||
const int kDefaultDrivePort = 8183;
|
||||
|
||||
/// Return the absolute path of the user's home directory
|
||||
String get homeDirPath {
|
||||
if (_homeDirPath == null) {
|
||||
_homeDirPath = Platform.isWindows
|
||||
? Platform.environment['USERPROFILE']
|
||||
: Platform.environment['HOME'];
|
||||
if (_homeDirPath != null)
|
||||
_homeDirPath = path.absolute(_homeDirPath);
|
||||
}
|
||||
return _homeDirPath;
|
||||
}
|
||||
String _homeDirPath;
|
||||
|
||||
/// Specialized exception for expected situations
|
||||
/// where the tool should exit with a clear message to the user
|
||||
/// and no stack trace unless the --verbose option is specified.
|
||||
|
||||
@@ -9,6 +9,7 @@ import 'dart:io';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
import 'android/android_workflow.dart';
|
||||
import 'base/common.dart';
|
||||
import 'base/context.dart';
|
||||
import 'base/os.dart';
|
||||
import 'device.dart';
|
||||
@@ -41,7 +42,7 @@ class Doctor {
|
||||
|
||||
List<DoctorValidator> ideValidators = <DoctorValidator>[];
|
||||
ideValidators.addAll(AtomValidator.installed);
|
||||
ideValidators.addAll(IntellijValidator.installed);
|
||||
ideValidators.addAll(IntelliJValidator.installed);
|
||||
if (ideValidators.isNotEmpty)
|
||||
_validators.addAll(ideValidators);
|
||||
else
|
||||
@@ -313,52 +314,25 @@ class AtomValidator extends DoctorValidator {
|
||||
}
|
||||
}
|
||||
|
||||
class IntellijValidator extends DoctorValidator {
|
||||
IntellijValidator(String title, {this.version, this.pluginsPath}) : super(title);
|
||||
abstract class IntelliJValidator extends DoctorValidator {
|
||||
IntelliJValidator(String title) : super(title);
|
||||
|
||||
final String version;
|
||||
final String pluginsPath;
|
||||
String get version;
|
||||
String get pluginsPath;
|
||||
|
||||
static final Map<String, String> _idToTitle = <String, String>{
|
||||
'IntelliJIdea' : 'IntelliJ IDEA Ultimate Edition',
|
||||
'IdeaIC' : 'IntelliJ IDEA Community Edition',
|
||||
'WebStorm' : 'IntelliJ WebStorm',
|
||||
};
|
||||
|
||||
static Iterable<DoctorValidator> get installed {
|
||||
List<DoctorValidator> validators = <DoctorValidator>[];
|
||||
Map<String, String> products = <String, String>{
|
||||
'IntelliJIdea' : 'IntelliJ IDEA Ultimate Edition',
|
||||
'IdeaIC' : 'IntelliJ IDEA Community Edition',
|
||||
'WebStorm' : 'IntelliJ WebStorm',
|
||||
};
|
||||
String homeDir = Platform.environment['HOME'];
|
||||
|
||||
if (Platform.isLinux && homeDir != null) {
|
||||
for (FileSystemEntity dir in new Directory(homeDir).listSync()) {
|
||||
if (dir is Directory) {
|
||||
String name = path.basename(dir.path);
|
||||
products.forEach((String id, String title) {
|
||||
if (name.startsWith('.$id')) {
|
||||
String version = name.substring(id.length + 1);
|
||||
String installPath;
|
||||
try {
|
||||
installPath = new File(path.join(dir.path, 'system', '.home')).readAsStringSync();
|
||||
} catch (e) {
|
||||
// ignored
|
||||
}
|
||||
if (installPath != null && FileSystemEntity.isDirectorySync(installPath)) {
|
||||
validators.add(new IntellijValidator(
|
||||
title,
|
||||
version: version,
|
||||
pluginsPath: path.join(dir.path, 'config', 'plugins'),
|
||||
));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if (Platform.isMacOS) {
|
||||
// TODO(danrubel): add support for Mac
|
||||
|
||||
} else {
|
||||
// TODO(danrubel): add support for Windows
|
||||
}
|
||||
return validators;
|
||||
if (Platform.isLinux)
|
||||
return IntelliJValidatorOnLinux.installed;
|
||||
if (Platform.isMacOS)
|
||||
return IntelliJValidatorOnMac.installed;
|
||||
// TODO(danrubel): add support for Windows
|
||||
return <DoctorValidator>[];
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -370,7 +344,7 @@ class IntellijValidator extends DoctorValidator {
|
||||
if (_validateHasPackage(messages, 'Dart', 'Dart'))
|
||||
installCount++;
|
||||
|
||||
if (_validateHasPackage(messages, 'Flutter', 'Flutter'))
|
||||
if (_validateHasPackage(messages, 'flutter-intellij.jar', 'Flutter'))
|
||||
installCount++;
|
||||
|
||||
if (installCount < 2) {
|
||||
@@ -387,23 +361,123 @@ class IntellijValidator extends DoctorValidator {
|
||||
);
|
||||
}
|
||||
|
||||
bool _validateHasPackage(List<ValidationMessage> messages, String packageName, String description) {
|
||||
bool _validateHasPackage(List<ValidationMessage> messages, String packageName, String title) {
|
||||
if (!hasPackage(packageName)) {
|
||||
messages.add(new ValidationMessage(
|
||||
'$packageName plugin not installed; this adds $description specific functionality.'
|
||||
'$title plugin not installed; this adds $title specific functionality.'
|
||||
));
|
||||
return false;
|
||||
}
|
||||
messages.add(new ValidationMessage('$packageName plugin installed'));
|
||||
messages.add(new ValidationMessage('$title plugin installed'));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool hasPackage(String packageName) {
|
||||
String packagePath = path.join(pluginsPath, packageName);
|
||||
if (packageName.endsWith('.jar'))
|
||||
return FileSystemEntity.isFileSync(packagePath);
|
||||
return FileSystemEntity.isDirectorySync(packagePath);
|
||||
}
|
||||
}
|
||||
|
||||
class IntelliJValidatorOnLinux extends IntelliJValidator {
|
||||
IntelliJValidatorOnLinux(String title, this.version, this.pluginsPath) : super(title);
|
||||
|
||||
@override
|
||||
String version;
|
||||
|
||||
@override
|
||||
String pluginsPath;
|
||||
|
||||
static Iterable<DoctorValidator> get installed {
|
||||
List<DoctorValidator> validators = <DoctorValidator>[];
|
||||
if (homeDirPath == null) return validators;
|
||||
for (FileSystemEntity dir in new Directory(homeDirPath).listSync()) {
|
||||
if (dir is Directory) {
|
||||
String name = path.basename(dir.path);
|
||||
IntelliJValidator._idToTitle.forEach((String id, String title) {
|
||||
if (name.startsWith('.$id')) {
|
||||
String version = name.substring(id.length + 1);
|
||||
String installPath;
|
||||
try {
|
||||
installPath = new File(path.join(dir.path, 'system', '.home')).readAsStringSync();
|
||||
} catch (e) {
|
||||
// ignored
|
||||
}
|
||||
if (installPath != null && FileSystemEntity.isDirectorySync(installPath)) {
|
||||
String pluginsPath = path.join(dir.path, 'config', 'plugins');
|
||||
validators.add(new IntelliJValidatorOnLinux(title, version, pluginsPath));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return validators;
|
||||
}
|
||||
}
|
||||
|
||||
class IntelliJValidatorOnMac extends IntelliJValidator {
|
||||
IntelliJValidatorOnMac(String title, this.id, this.installPath) : super(title);
|
||||
|
||||
final String id;
|
||||
final String installPath;
|
||||
|
||||
static final Map<String, String> _dirNameToId = <String, String>{
|
||||
'IntelliJ IDEA.app' : 'IntelliJIdea',
|
||||
'IntelliJ IDEA CE.app' : 'IdeaIC',
|
||||
'WebStorm.app' : 'WebStorm',
|
||||
};
|
||||
|
||||
static Iterable<DoctorValidator> get installed {
|
||||
List<DoctorValidator> validators = <DoctorValidator>[];
|
||||
for (FileSystemEntity dir in new Directory('/Applications').listSync()) {
|
||||
if (dir is Directory) {
|
||||
String name = path.basename(dir.path);
|
||||
_dirNameToId.forEach((String dirName, String id) {
|
||||
if (name == dirName) {
|
||||
String title = IntelliJValidator._idToTitle[id];
|
||||
validators.add(new IntelliJValidatorOnMac(title, id, dir.path));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return validators;
|
||||
}
|
||||
|
||||
@override
|
||||
String get version {
|
||||
if (_version == null) {
|
||||
String plist;
|
||||
try {
|
||||
plist = new File(path.join(installPath, 'Contents', 'Info.plist')).readAsStringSync();
|
||||
int index = plist.indexOf('CFBundleShortVersionString');
|
||||
if (index > 0) {
|
||||
int start = plist.indexOf('<string>', index);
|
||||
if (start > 0) {
|
||||
int end = plist.indexOf('</string>', start);
|
||||
if (end > 0) {
|
||||
_version = plist.substring(start + 8, end);
|
||||
}
|
||||
}
|
||||
}
|
||||
} on FileSystemException catch (_) {
|
||||
// ignored
|
||||
}
|
||||
_version ??= 'unknown';
|
||||
}
|
||||
return _version;
|
||||
}
|
||||
String _version;
|
||||
|
||||
@override
|
||||
String get pluginsPath {
|
||||
List<String> split = version.split('.');
|
||||
String major = split[0];
|
||||
String minor = split[1];
|
||||
return path.join(homeDirPath, 'Library', 'Application Support', '$id$major.$minor');
|
||||
}
|
||||
}
|
||||
|
||||
class DeviceValidator extends DoctorValidator {
|
||||
DeviceValidator() : super('Connected devices');
|
||||
|
||||
|
||||
@@ -17,8 +17,6 @@ import '../globals.dart';
|
||||
import '../services.dart';
|
||||
import 'xcodeproj.dart';
|
||||
|
||||
String get homeDirectory => path.absolute(Platform.environment['HOME']);
|
||||
|
||||
const int kXcodeRequiredVersionMajor = 7;
|
||||
const int kXcodeRequiredVersionMinor = 0;
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'dart:math' as math;
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
import '../application_package.dart';
|
||||
import '../base/common.dart';
|
||||
import '../base/context.dart';
|
||||
import '../base/process.dart';
|
||||
import '../build_info.dart';
|
||||
@@ -318,7 +319,7 @@ class IOSSimulator extends Device {
|
||||
String get xcrunPath => path.join('/usr', 'bin', 'xcrun');
|
||||
|
||||
String _getSimulatorPath() {
|
||||
return path.join(homeDirectory, 'Library', 'Developer', 'CoreSimulator', 'Devices', id);
|
||||
return path.join(homeDirPath, 'Library', 'Developer', 'CoreSimulator', 'Devices', id);
|
||||
}
|
||||
|
||||
String _getSimulatorAppHomeDirectory(ApplicationPackage app) {
|
||||
@@ -544,7 +545,7 @@ class IOSSimulator extends Device {
|
||||
}
|
||||
|
||||
String get logFilePath {
|
||||
return path.join(homeDirectory, 'Library', 'Logs', 'CoreSimulator', id, 'system.log');
|
||||
return path.join(homeDirPath, 'Library', 'Logs', 'CoreSimulator', id, 'system.log');
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -587,7 +588,6 @@ class IOSSimulator extends Device {
|
||||
|
||||
@override
|
||||
Future<bool> takeScreenshot(File outputFile) async {
|
||||
String homeDirPath = Platform.environment['HOME'] ?? Platform.environment['USERPROFILE'];
|
||||
Directory desktopDir = new Directory(path.join(homeDirPath, 'Desktop'));
|
||||
|
||||
// 'Simulator Screen Shot Mar 25, 2016, 2.59.43 PM.png'
|
||||
|
||||
Reference in New Issue
Block a user