mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
75 lines
2.5 KiB
Dart
75 lines
2.5 KiB
Dart
// Copyright 2018 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:archive/archive.dart';
|
|
|
|
import '../base/file_system.dart';
|
|
import '../base/version.dart';
|
|
import '../convert.dart';
|
|
import '../doctor.dart';
|
|
|
|
class IntelliJPlugins {
|
|
IntelliJPlugins(this.pluginsPath);
|
|
|
|
final String pluginsPath;
|
|
|
|
static final Version kMinFlutterPluginVersion = Version(16, 0, 0);
|
|
|
|
void validatePackage(
|
|
List<ValidationMessage> messages,
|
|
List<String> packageNames,
|
|
String title, {
|
|
Version minVersion,
|
|
}) {
|
|
for (String packageName in packageNames) {
|
|
if (!_hasPackage(packageName)) {
|
|
continue;
|
|
}
|
|
|
|
final String versionText = _readPackageVersion(packageName);
|
|
final Version version = Version.parse(versionText);
|
|
if (version != null && minVersion != null && version < minVersion) {
|
|
messages.add(ValidationMessage.error(
|
|
'$title plugin version $versionText - the recommended minimum version is $minVersion'));
|
|
} else {
|
|
messages.add(ValidationMessage(
|
|
'$title plugin ${version != null ? "version $version" : "installed"}'));
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
messages.add(ValidationMessage.error(
|
|
'$title plugin not installed; this adds $title specific functionality.'));
|
|
}
|
|
|
|
bool _hasPackage(String packageName) {
|
|
final String packagePath = fs.path.join(pluginsPath, packageName);
|
|
if (packageName.endsWith('.jar')) {
|
|
return fs.isFileSync(packagePath);
|
|
}
|
|
return fs.isDirectorySync(packagePath);
|
|
}
|
|
|
|
String _readPackageVersion(String packageName) {
|
|
final String jarPath = packageName.endsWith('.jar')
|
|
? fs.path.join(pluginsPath, packageName)
|
|
: fs.path.join(pluginsPath, packageName, 'lib', '$packageName.jar');
|
|
// TODO(danrubel): look for a better way to extract a single 2K file from the zip
|
|
// rather than reading the entire file into memory.
|
|
try {
|
|
final Archive archive =
|
|
ZipDecoder().decodeBytes(fs.file(jarPath).readAsBytesSync());
|
|
final ArchiveFile file = archive.findFile('META-INF/plugin.xml');
|
|
final String content = utf8.decode(file.content);
|
|
const String versionStartTag = '<version>';
|
|
final int start = content.indexOf(versionStartTag);
|
|
final int end = content.indexOf('</version>', start);
|
|
return content.substring(start + versionStartTag.length, end);
|
|
} catch (_) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|