// Copyright 2014 The Flutter 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 'dart:io' show Directory, File; import 'package:file/file.dart' as fs; import 'package:file/local.dart'; import 'package:path/path.dart' as path; import '../run_command.dart'; import '../utils.dart'; /// Executes the test suite for the flutter/packages repo. Future flutterPackagesRunner() async { Future runAnalyze() async { printProgress('${green}Running analysis for flutter/packages$reset'); final Directory checkout = Directory.systemTemp.createTempSync('flutter_packages.'); await runCommand( 'git', const [ '-c', 'core.longPaths=true', 'clone', 'https://github.com/flutter/packages.git', '.', ], workingDirectory: checkout.path, ); final String packagesCommit = await getFlutterPackagesVersion(flutterRoot: flutterRoot); await runCommand( 'git', [ '-c', 'core.longPaths=true', 'checkout', packagesCommit, ], workingDirectory: checkout.path, ); // Prep the repository tooling. // This test does not use tool_runner.sh because in this context the test // should always run on the entire packages repo, while tool_runner.sh // is designed for flutter/packages CI and only analyzes changed repository // files when run for anything but master. final String toolDir = path.join(checkout.path, 'script', 'tool'); await runCommand( 'dart', const [ 'pub', 'get', ], workingDirectory: toolDir, ); final String toolScript = path.join(toolDir, 'bin', 'flutter_plugin_tools.dart'); await runCommand( 'dart', [ 'run', toolScript, 'analyze', // Fetch the oldest possible dependencies, rather than the newest, to // insulate flutter/flutter from out-of-band failures when new versions // of dependencies are published. This compensates for the fact that // flutter/packages doesn't use pinned dependencies, and for the // purposes of this test using old dependencies is fine. See // https://github.com/flutter/flutter/issues/129633 '--downgrade', '--custom-analysis=script/configs/custom_analysis.yaml', ], workingDirectory: checkout.path, ); } await selectSubshard({ 'analyze': runAnalyze, }); } /// Returns the commit hash of the flutter/packages repository that's rolled in. /// /// The flutter/packages repository is a downstream dependency, it is only used /// by flutter/flutter for testing purposes, to assure stable tests for a given /// flutter commit the flutter/packages commit hash to test against is coded in /// the bin/internal/flutter_packages.version file. /// /// The `filesystem` parameter specified filesystem to read the packages version file from. /// The `packagesVersionFile` parameter allows specifying an alternative path for the /// packages version file, when null [flutterPackagesVersionFile] is used. Future getFlutterPackagesVersion({ fs.FileSystem fileSystem = const LocalFileSystem(), String? packagesVersionFile, required String flutterRoot, }) async { final String flutterPackagesVersionFile = path.join(flutterRoot, 'bin', 'internal', 'flutter_packages.version'); final File versionFile = fileSystem.file(packagesVersionFile ?? flutterPackagesVersionFile); final String versionFileContents = await versionFile.readAsString(); return versionFileContents.trim(); }