runPubOutdated method

Future<Outdated> runPubOutdated(
  1. String packageDir, {
  2. List<String> args = const [],
  3. required bool usesFlutter,
})

Implementation

Future<Outdated> runPubOutdated(
  String packageDir, {
  List<String> args = const [],
  required bool usesFlutter,
}) async {
  final pubCmd = usesFlutter
      ?
      // Use `flutter pub pub` to get the 'raw' pub command. This avoids
      // issues with `flutter pub get` running in the example directory,
      // argument parsing differing and other misalignments between `dart pub`
      // and `flutter pub` (see https://github.com/dart-lang/pub/issues/2971).
      [..._flutterSdk.flutterCmd, 'pub', 'pub']
      : [..._dartSdk.dartCmd, 'pub'];
  final cmdLabel = usesFlutter ? 'flutter' : 'dart';
  return await _withStripAndAugmentPubspecYaml(packageDir, () async {
    Future<PanaProcessResult> runPubGet() async {
      final pr = await runConstrained(
        [...pubCmd, 'get', '--no-example'],
        environment:
            usesFlutter ? _flutterSdk.environment : _dartSdk.environment,
        workingDirectory: packageDir,
      );
      return pr;
    }

    final firstPubGet = await runPubGet();
    // Flutter on CI may download additional assets, which will change
    // the output and won't match the expected on in the golden files.
    // Running a second `pub get` will make sure that the output is consistent.
    final secondPubGet = usesFlutter ? await runPubGet() : firstPubGet;
    if (secondPubGet.wasError) {
      // Stripping extra verbose log lines which make Flutter differ on different environment.
      final stderr = ProcessOutput.from(
        secondPubGet.stderr.asString
            .split('---- Log transcript ----\n')
            .first
            .split('pub get failed (1;')
            .first,
      );
      final pr = secondPubGet.change(stderr: stderr);
      throw ToolException(
        '`$cmdLabel pub get` failed:\n\n```\n${pr.asTrimmedOutput}\n```',
        pr,
      );
    }

    final result = await runConstrained(
      [
        ...pubCmd,
        'outdated',
        ...args,
      ],
      environment:
          usesFlutter ? _flutterSdk.environment : _dartSdk.environment,
      workingDirectory: packageDir,
    );
    if (result.wasError) {
      throw ToolException(
        '`$cmdLabel pub outdated` failed:\n\n```\n${result.asTrimmedOutput}\n```',
        result,
      );
    } else {
      return Outdated.fromJson(result.parseJson());
    }
  });
}