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

5 6
import 'package:archive/archive.dart';

7
import '../base/version.dart';
8
import '../convert.dart';
9
import '../doctor.dart';
10
import '../globals.dart' as globals;
11 12

class IntelliJPlugins {
13
  IntelliJPlugins(this.pluginsPath);
14 15 16

  final String pluginsPath;

17
  static final Version kMinFlutterPluginVersion = Version(16, 0, 0);
18 19

  void validatePackage(
20 21 22 23 24
    List<ValidationMessage> messages,
    List<String> packageNames,
    String title, {
    Version minVersion,
  }) {
25
    for (final String packageName in packageNames) {
26 27 28 29 30
      if (!_hasPackage(packageName)) {
        continue;
      }

      final String versionText = _readPackageVersion(packageName);
31
      final Version version = Version.parse(versionText);
32
      if (version != null && minVersion != null && version < minVersion) {
33
        messages.add(ValidationMessage.error(
34 35
            '$title plugin version $versionText - the recommended minimum version is $minVersion'));
      } else {
36
        messages.add(ValidationMessage(
37 38 39 40 41 42
            '$title plugin ${version != null ? "version $version" : "installed"}'));
      }

      return;
    }

43
    messages.add(ValidationMessage.error(
44 45 46 47
        '$title plugin not installed; this adds $title specific functionality.'));
  }

  bool _hasPackage(String packageName) {
48
    final String packagePath = globals.fs.path.join(pluginsPath, packageName);
49
    if (packageName.endsWith('.jar')) {
50
      return globals.fs.isFileSync(packagePath);
51
    }
52
    return globals.fs.isDirectorySync(packagePath);
53 54 55 56
  }

  String _readPackageVersion(String packageName) {
    final String jarPath = packageName.endsWith('.jar')
57 58
        ? globals.fs.path.join(pluginsPath, packageName)
        : globals.fs.path.join(pluginsPath, packageName, 'lib', '$packageName.jar');
59 60
    // TODO(danrubel): look for a better way to extract a single 2K file from the zip
    // rather than reading the entire file into memory.
61
    try {
62
      final Archive archive =
63
          ZipDecoder().decodeBytes(globals.fs.file(jarPath).readAsBytesSync());
64 65
      final ArchiveFile file = archive.findFile('META-INF/plugin.xml');
      final String content = utf8.decode(file.content as List<int>);
66 67 68 69
      const String versionStartTag = '<version>';
      final int start = content.indexOf(versionStartTag);
      final int end = content.indexOf('</version>', start);
      return content.substring(start + versionStartTag.length, end);
70
    } catch (_) {
71 72 73 74
      return null;
    }
  }
}