This reverts commit 9ed3e5bea6c36d4b4a25ebed26e4db8ebeee04f8.
This commit is contained in:
parent
c5a78210bf
commit
5e3e5a2a1a
@ -75,7 +75,6 @@ Future<void> main(List<String> args) async {
|
|||||||
processManager: globals.processManager,
|
processManager: globals.processManager,
|
||||||
logger: globals.logger,
|
logger: globals.logger,
|
||||||
terminal: globals.terminal,
|
terminal: globals.terminal,
|
||||||
artifacts: globals.artifacts,
|
|
||||||
),
|
),
|
||||||
AssembleCommand(),
|
AssembleCommand(),
|
||||||
AttachCommand(verboseHelp: verboseHelp),
|
AttachCommand(verboseHelp: verboseHelp),
|
||||||
|
@ -10,6 +10,7 @@ import 'base/platform.dart';
|
|||||||
import 'base/utils.dart';
|
import 'base/utils.dart';
|
||||||
import 'build_info.dart';
|
import 'build_info.dart';
|
||||||
import 'cache.dart';
|
import 'cache.dart';
|
||||||
|
import 'dart/sdk.dart';
|
||||||
import 'globals.dart' as globals;
|
import 'globals.dart' as globals;
|
||||||
|
|
||||||
enum Artifact {
|
enum Artifact {
|
||||||
@ -338,9 +339,9 @@ class CachedArtifacts extends Artifacts {
|
|||||||
final String platformDirName = getNameForTargetPlatform(platform);
|
final String platformDirName = getNameForTargetPlatform(platform);
|
||||||
return _fileSystem.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
|
return _fileSystem.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
|
||||||
case Artifact.engineDartSdkPath:
|
case Artifact.engineDartSdkPath:
|
||||||
return _dartSdkPath(_fileSystem);
|
return dartSdkPath;
|
||||||
case Artifact.engineDartBinary:
|
case Artifact.engineDartBinary:
|
||||||
return _fileSystem.path.join(_dartSdkPath(_fileSystem), 'bin', _artifactToFileName(artifact, platform));
|
return _fileSystem.path.join(dartSdkPath, 'bin', _artifactToFileName(artifact, platform));
|
||||||
case Artifact.platformKernelDill:
|
case Artifact.platformKernelDill:
|
||||||
return _fileSystem.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact));
|
return _fileSystem.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact));
|
||||||
case Artifact.platformLibrariesJson:
|
case Artifact.platformLibrariesJson:
|
||||||
@ -354,11 +355,11 @@ class CachedArtifacts extends Artifacts {
|
|||||||
case Artifact.webPlatformKernelDill:
|
case Artifact.webPlatformKernelDill:
|
||||||
return _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
|
return _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _artifactToFileName(artifact));
|
||||||
case Artifact.dart2jsSnapshot:
|
case Artifact.dart2jsSnapshot:
|
||||||
return _fileSystem.path.join(_dartSdkPath(_fileSystem), 'bin', 'snapshots', _artifactToFileName(artifact));
|
return _fileSystem.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
|
||||||
case Artifact.dartdevcSnapshot:
|
case Artifact.dartdevcSnapshot:
|
||||||
return _fileSystem.path.join(_dartSdkPath(_fileSystem), 'bin', 'snapshots', _artifactToFileName(artifact));
|
return _fileSystem.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
|
||||||
case Artifact.kernelWorkerSnapshot:
|
case Artifact.kernelWorkerSnapshot:
|
||||||
return _fileSystem.path.join(_dartSdkPath(_fileSystem), 'bin', 'snapshots', _artifactToFileName(artifact));
|
return _fileSystem.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
|
||||||
case Artifact.flutterMacOSFramework:
|
case Artifact.flutterMacOSFramework:
|
||||||
case Artifact.linuxDesktopPath:
|
case Artifact.linuxDesktopPath:
|
||||||
case Artifact.windowsDesktopPath:
|
case Artifact.windowsDesktopPath:
|
||||||
@ -527,7 +528,7 @@ class LocalEngineArtifacts extends Artifacts {
|
|||||||
case Artifact.dart2jsSnapshot:
|
case Artifact.dart2jsSnapshot:
|
||||||
return _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
|
return _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
|
||||||
case Artifact.dartdevcSnapshot:
|
case Artifact.dartdevcSnapshot:
|
||||||
return _fileSystem.path.join(_dartSdkPath(_fileSystem), 'bin', 'snapshots', artifactFileName);
|
return _fileSystem.path.join(dartSdkPath, 'bin', 'snapshots', artifactFileName);
|
||||||
case Artifact.kernelWorkerSnapshot:
|
case Artifact.kernelWorkerSnapshot:
|
||||||
return _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
|
return _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName);
|
||||||
case Artifact.idevicescreenshot:
|
case Artifact.idevicescreenshot:
|
||||||
@ -660,8 +661,3 @@ class OverrideArtifacts implements Artifacts {
|
|||||||
@override
|
@override
|
||||||
bool get isLocalEngine => parent.isLocalEngine;
|
bool get isLocalEngine => parent.isLocalEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Locate the Dart SDK.
|
|
||||||
String _dartSdkPath(FileSystem fileSystem) {
|
|
||||||
return fileSystem.path.join(Cache.flutterRoot, 'bin', 'cache', 'dart-sdk');
|
|
||||||
}
|
|
||||||
|
@ -19,6 +19,7 @@ import '../base/io.dart';
|
|||||||
import '../base/logger.dart';
|
import '../base/logger.dart';
|
||||||
import '../codegen.dart';
|
import '../codegen.dart';
|
||||||
import '../dart/pub.dart';
|
import '../dart/pub.dart';
|
||||||
|
import '../dart/sdk.dart';
|
||||||
import '../globals.dart' as globals;
|
import '../globals.dart' as globals;
|
||||||
import '../project.dart';
|
import '../project.dart';
|
||||||
|
|
||||||
@ -110,14 +111,7 @@ class BuildRunner extends CodeGenerator {
|
|||||||
}
|
}
|
||||||
scriptIdFile.writeAsBytesSync(appliedBuilderDigest);
|
scriptIdFile.writeAsBytesSync(appliedBuilderDigest);
|
||||||
final ProcessResult generateResult = await globals.processManager.run(<String>[
|
final ProcessResult generateResult = await globals.processManager.run(<String>[
|
||||||
globals.fs.path.join(
|
sdkBinaryName('pub'), 'run', 'build_runner', 'generate-build-script',
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
|
|
||||||
'bin',
|
|
||||||
(globals.platform.isWindows) ? 'pub.bat' : 'pub'
|
|
||||||
),
|
|
||||||
'run',
|
|
||||||
'build_runner',
|
|
||||||
'generate-build-script',
|
|
||||||
], workingDirectory: syntheticPubspec.parent.path);
|
], workingDirectory: syntheticPubspec.parent.path);
|
||||||
if (generateResult.exitCode != 0) {
|
if (generateResult.exitCode != 0) {
|
||||||
throwToolExit('Error generating build_script snapshot: ${generateResult.stderr}');
|
throwToolExit('Error generating build_script snapshot: ${generateResult.stderr}');
|
||||||
|
@ -7,7 +7,6 @@ import 'dart:async';
|
|||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
import 'package:process/process.dart';
|
import 'package:process/process.dart';
|
||||||
|
|
||||||
import '../artifacts.dart';
|
|
||||||
import '../base/file_system.dart';
|
import '../base/file_system.dart';
|
||||||
import '../base/logger.dart';
|
import '../base/logger.dart';
|
||||||
import '../base/platform.dart';
|
import '../base/platform.dart';
|
||||||
@ -22,12 +21,10 @@ class AnalyzeCommand extends FlutterCommand {
|
|||||||
this.workingDirectory,
|
this.workingDirectory,
|
||||||
@required FileSystem fileSystem,
|
@required FileSystem fileSystem,
|
||||||
@required Platform platform,
|
@required Platform platform,
|
||||||
@required Terminal terminal,
|
@required AnsiTerminal terminal,
|
||||||
@required Logger logger,
|
@required Logger logger,
|
||||||
@required ProcessManager processManager,
|
@required ProcessManager processManager,
|
||||||
@required Artifacts artifacts,
|
}) : _fileSystem = fileSystem,
|
||||||
}) : _artifacts = artifacts,
|
|
||||||
_fileSystem = fileSystem,
|
|
||||||
_processManager = processManager,
|
_processManager = processManager,
|
||||||
_logger = logger,
|
_logger = logger,
|
||||||
_terminal = terminal,
|
_terminal = terminal,
|
||||||
@ -80,10 +77,9 @@ class AnalyzeCommand extends FlutterCommand {
|
|||||||
/// The working directory for testing analysis using dartanalyzer.
|
/// The working directory for testing analysis using dartanalyzer.
|
||||||
final Directory workingDirectory;
|
final Directory workingDirectory;
|
||||||
|
|
||||||
final Artifacts _artifacts;
|
|
||||||
final FileSystem _fileSystem;
|
final FileSystem _fileSystem;
|
||||||
final Logger _logger;
|
final Logger _logger;
|
||||||
final Terminal _terminal;
|
final AnsiTerminal _terminal;
|
||||||
final ProcessManager _processManager;
|
final ProcessManager _processManager;
|
||||||
final Platform _platform;
|
final Platform _platform;
|
||||||
|
|
||||||
@ -121,7 +117,6 @@ class AnalyzeCommand extends FlutterCommand {
|
|||||||
processManager: _processManager,
|
processManager: _processManager,
|
||||||
terminal: _terminal,
|
terminal: _terminal,
|
||||||
experiments: stringsArg('enable-experiment'),
|
experiments: stringsArg('enable-experiment'),
|
||||||
artifacts: _artifacts,
|
|
||||||
).analyze();
|
).analyze();
|
||||||
} else {
|
} else {
|
||||||
await AnalyzeOnce(
|
await AnalyzeOnce(
|
||||||
@ -135,7 +130,6 @@ class AnalyzeCommand extends FlutterCommand {
|
|||||||
processManager: _processManager,
|
processManager: _processManager,
|
||||||
terminal: _terminal,
|
terminal: _terminal,
|
||||||
experiments: stringsArg('enable-experiment'),
|
experiments: stringsArg('enable-experiment'),
|
||||||
artifacts: _artifacts,
|
|
||||||
).analyze();
|
).analyze();
|
||||||
}
|
}
|
||||||
return FlutterCommandResult.success();
|
return FlutterCommandResult.success();
|
||||||
|
@ -9,7 +9,6 @@ import 'package:meta/meta.dart';
|
|||||||
import 'package:process/process.dart';
|
import 'package:process/process.dart';
|
||||||
import 'package:yaml/yaml.dart' as yaml;
|
import 'package:yaml/yaml.dart' as yaml;
|
||||||
|
|
||||||
import '../artifacts.dart';
|
|
||||||
import '../base/common.dart';
|
import '../base/common.dart';
|
||||||
import '../base/file_system.dart';
|
import '../base/file_system.dart';
|
||||||
import '../base/logger.dart';
|
import '../base/logger.dart';
|
||||||
@ -30,7 +29,6 @@ abstract class AnalyzeBase {
|
|||||||
@required this.processManager,
|
@required this.processManager,
|
||||||
@required this.terminal,
|
@required this.terminal,
|
||||||
@required this.experiments,
|
@required this.experiments,
|
||||||
@required this.artifacts,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/// The parsed argument results for execution.
|
/// The parsed argument results for execution.
|
||||||
@ -48,11 +46,9 @@ abstract class AnalyzeBase {
|
|||||||
@protected
|
@protected
|
||||||
final Platform platform;
|
final Platform platform;
|
||||||
@protected
|
@protected
|
||||||
final Terminal terminal;
|
final AnsiTerminal terminal;
|
||||||
@protected
|
@protected
|
||||||
final List<String> experiments;
|
final List<String> experiments;
|
||||||
@protected
|
|
||||||
final Artifacts artifacts;
|
|
||||||
|
|
||||||
/// Called by [AnalyzeCommand] to start the analysis process.
|
/// Called by [AnalyzeCommand] to start the analysis process.
|
||||||
Future<void> analyze();
|
Future<void> analyze();
|
||||||
|
@ -8,7 +8,6 @@ import 'package:args/args.dart';
|
|||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
import 'package:process/process.dart';
|
import 'package:process/process.dart';
|
||||||
|
|
||||||
import '../artifacts.dart';
|
|
||||||
import '../base/common.dart';
|
import '../base/common.dart';
|
||||||
import '../base/file_system.dart';
|
import '../base/file_system.dart';
|
||||||
import '../base/io.dart';
|
import '../base/io.dart';
|
||||||
@ -17,17 +16,17 @@ import '../base/platform.dart';
|
|||||||
import '../base/terminal.dart';
|
import '../base/terminal.dart';
|
||||||
import '../base/utils.dart';
|
import '../base/utils.dart';
|
||||||
import '../dart/analysis.dart';
|
import '../dart/analysis.dart';
|
||||||
|
import '../dart/sdk.dart' as sdk;
|
||||||
import 'analyze_base.dart';
|
import 'analyze_base.dart';
|
||||||
|
|
||||||
class AnalyzeContinuously extends AnalyzeBase {
|
class AnalyzeContinuously extends AnalyzeBase {
|
||||||
AnalyzeContinuously(ArgResults argResults, List<String> repoRoots, List<Directory> repoPackages, {
|
AnalyzeContinuously(ArgResults argResults, List<String> repoRoots, List<Directory> repoPackages, {
|
||||||
@required FileSystem fileSystem,
|
@required FileSystem fileSystem,
|
||||||
@required Logger logger,
|
@required Logger logger,
|
||||||
@required Terminal terminal,
|
@required AnsiTerminal terminal,
|
||||||
@required Platform platform,
|
@required Platform platform,
|
||||||
@required ProcessManager processManager,
|
@required ProcessManager processManager,
|
||||||
@required List<String> experiments,
|
@required List<String> experiments,
|
||||||
@required Artifacts artifacts,
|
|
||||||
}) : super(
|
}) : super(
|
||||||
argResults,
|
argResults,
|
||||||
repoPackages: repoPackages,
|
repoPackages: repoPackages,
|
||||||
@ -38,7 +37,6 @@ class AnalyzeContinuously extends AnalyzeBase {
|
|||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
experiments: experiments,
|
experiments: experiments,
|
||||||
artifacts: artifacts,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
String analysisTarget;
|
String analysisTarget;
|
||||||
@ -69,8 +67,7 @@ class AnalyzeContinuously extends AnalyzeBase {
|
|||||||
analysisTarget = fileSystem.currentDirectory.path;
|
analysisTarget = fileSystem.currentDirectory.path;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String sdkPath = argResults['dart-sdk'] as String ??
|
final String sdkPath = argResults['dart-sdk'] as String ?? sdk.dartSdkPath;
|
||||||
artifacts.getArtifactPath(Artifact.engineDartSdkPath);
|
|
||||||
|
|
||||||
final AnalysisServer server = AnalysisServer(sdkPath, directories,
|
final AnalysisServer server = AnalysisServer(sdkPath, directories,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
|
@ -8,7 +8,6 @@ import 'package:args/args.dart';
|
|||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
import 'package:process/process.dart';
|
import 'package:process/process.dart';
|
||||||
|
|
||||||
import '../artifacts.dart';
|
|
||||||
import '../base/common.dart';
|
import '../base/common.dart';
|
||||||
import '../base/file_system.dart';
|
import '../base/file_system.dart';
|
||||||
import '../base/logger.dart';
|
import '../base/logger.dart';
|
||||||
@ -16,6 +15,7 @@ import '../base/platform.dart';
|
|||||||
import '../base/terminal.dart';
|
import '../base/terminal.dart';
|
||||||
import '../base/utils.dart';
|
import '../base/utils.dart';
|
||||||
import '../dart/analysis.dart';
|
import '../dart/analysis.dart';
|
||||||
|
import '../dart/sdk.dart' as sdk;
|
||||||
import 'analyze.dart';
|
import 'analyze.dart';
|
||||||
import 'analyze_base.dart';
|
import 'analyze_base.dart';
|
||||||
|
|
||||||
@ -29,9 +29,8 @@ class AnalyzeOnce extends AnalyzeBase {
|
|||||||
@required Logger logger,
|
@required Logger logger,
|
||||||
@required Platform platform,
|
@required Platform platform,
|
||||||
@required ProcessManager processManager,
|
@required ProcessManager processManager,
|
||||||
@required Terminal terminal,
|
@required AnsiTerminal terminal,
|
||||||
@required List<String> experiments,
|
@required List<String> experiments,
|
||||||
@required Artifacts artifacts,
|
|
||||||
this.workingDirectory,
|
this.workingDirectory,
|
||||||
}) : super(
|
}) : super(
|
||||||
argResults,
|
argResults,
|
||||||
@ -43,7 +42,6 @@ class AnalyzeOnce extends AnalyzeBase {
|
|||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
experiments: experiments,
|
experiments: experiments,
|
||||||
artifacts: artifacts,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/// The working directory for testing analysis using dartanalyzer.
|
/// The working directory for testing analysis using dartanalyzer.
|
||||||
@ -91,8 +89,7 @@ class AnalyzeOnce extends AnalyzeBase {
|
|||||||
final Completer<void> analysisCompleter = Completer<void>();
|
final Completer<void> analysisCompleter = Completer<void>();
|
||||||
final List<AnalysisError> errors = <AnalysisError>[];
|
final List<AnalysisError> errors = <AnalysisError>[];
|
||||||
|
|
||||||
final String sdkPath = argResults['dart-sdk'] as String ??
|
final String sdkPath = argResults['dart-sdk'] as String ?? sdk.dartSdkPath;
|
||||||
artifacts.getArtifactPath(Artifact.engineDartSdkPath);
|
|
||||||
|
|
||||||
final AnalysisServer server = AnalysisServer(
|
final AnalysisServer server = AnalysisServer(
|
||||||
sdkPath,
|
sdkPath,
|
||||||
|
@ -12,12 +12,12 @@ import 'package:webdriver/async_io.dart' as async_io;
|
|||||||
|
|
||||||
import '../android/android_device.dart';
|
import '../android/android_device.dart';
|
||||||
import '../application_package.dart';
|
import '../application_package.dart';
|
||||||
import '../artifacts.dart';
|
|
||||||
import '../base/common.dart';
|
import '../base/common.dart';
|
||||||
import '../base/file_system.dart';
|
import '../base/file_system.dart';
|
||||||
import '../base/process.dart';
|
import '../base/process.dart';
|
||||||
import '../build_info.dart';
|
import '../build_info.dart';
|
||||||
import '../dart/package_map.dart';
|
import '../dart/package_map.dart';
|
||||||
|
import '../dart/sdk.dart';
|
||||||
import '../device.dart';
|
import '../device.dart';
|
||||||
import '../globals.dart' as globals;
|
import '../globals.dart' as globals;
|
||||||
import '../project.dart';
|
import '../project.dart';
|
||||||
@ -505,9 +505,11 @@ Future<void> _runTests(List<String> testArgs, Map<String, String> environment) a
|
|||||||
globals.printTrace('Running driver tests.');
|
globals.printTrace('Running driver tests.');
|
||||||
|
|
||||||
globalPackagesPath = globals.fs.path.normalize(globals.fs.path.absolute(globalPackagesPath));
|
globalPackagesPath = globals.fs.path.normalize(globals.fs.path.absolute(globalPackagesPath));
|
||||||
|
final String dartVmPath = globals.fs.path.join(dartSdkPath, 'bin', 'dart');
|
||||||
final int result = await processUtils.stream(
|
final int result = await processUtils.stream(
|
||||||
<String>[
|
<String>[
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
dartVmPath,
|
||||||
|
...dartVmFlags,
|
||||||
...testArgs,
|
...testArgs,
|
||||||
'--packages=$globalPackagesPath',
|
'--packages=$globalPackagesPath',
|
||||||
'-rexpanded',
|
'-rexpanded',
|
||||||
|
22
packages/flutter_tools/lib/src/dart/sdk.dart
Normal file
22
packages/flutter_tools/lib/src/dart/sdk.dart
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// 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 '../cache.dart';
|
||||||
|
import '../globals.dart' as globals;
|
||||||
|
|
||||||
|
/// Locate the Dart SDK.
|
||||||
|
String get dartSdkPath {
|
||||||
|
return globals.fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'dart-sdk');
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The required Dart language flags
|
||||||
|
const List<String> dartVmFlags = <String>[];
|
||||||
|
|
||||||
|
/// Return the platform specific name for the given Dart SDK binary. So, `pub`
|
||||||
|
/// ==> `pub.bat`. The default SDK location can be overridden with a specified
|
||||||
|
/// [sdkLocation].
|
||||||
|
String sdkBinaryName(String name, { String sdkLocation }) {
|
||||||
|
return globals.fs.path.absolute(
|
||||||
|
globals.fs.path.join(sdkLocation ?? dartSdkPath, 'bin', globals.platform.isWindows ? '$name.bat' : name));
|
||||||
|
}
|
@ -4,18 +4,15 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter_tools/src/artifacts.dart';
|
|
||||||
import 'package:flutter_tools/src/base/common.dart';
|
|
||||||
import 'package:mockito/mockito.dart';
|
|
||||||
import 'package:file/memory.dart';
|
import 'package:file/memory.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
import 'package:flutter_tools/src/base/io.dart';
|
import 'package:flutter_tools/src/base/io.dart';
|
||||||
import 'package:flutter_tools/src/base/logger.dart';
|
import 'package:flutter_tools/src/base/logger.dart';
|
||||||
import 'package:flutter_tools/src/base/platform.dart';
|
import 'package:flutter_tools/src/base/platform.dart';
|
||||||
import 'package:flutter_tools/src/base/terminal.dart';
|
import 'package:flutter_tools/src/base/terminal.dart';
|
||||||
import 'package:flutter_tools/src/commands/analyze.dart';
|
|
||||||
import 'package:flutter_tools/src/dart/analysis.dart';
|
import 'package:flutter_tools/src/dart/analysis.dart';
|
||||||
import 'package:flutter_tools/src/dart/pub.dart';
|
import 'package:flutter_tools/src/dart/pub.dart';
|
||||||
|
import 'package:flutter_tools/src/dart/sdk.dart';
|
||||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||||
import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
|
import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
|
||||||
import 'package:process/process.dart';
|
import 'package:process/process.dart';
|
||||||
@ -79,9 +76,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
await pub.get(context: PubContext.flutterTests, directory: tempDir.path);
|
await pub.get(context: PubContext.flutterTests, directory: tempDir.path);
|
||||||
|
|
||||||
server = AnalysisServer(
|
server = AnalysisServer(dartSdkPath, <String>[tempDir.path],
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
|
|
||||||
<String>[tempDir.path],
|
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
platform: platform,
|
platform: platform,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
@ -114,16 +109,14 @@ void main() {
|
|||||||
);
|
);
|
||||||
await pub.get(context: PubContext.flutterTests, directory: tempDir.path);
|
await pub.get(context: PubContext.flutterTests, directory: tempDir.path);
|
||||||
|
|
||||||
server = AnalysisServer(
|
server = AnalysisServer(dartSdkPath, <String>[tempDir.path],
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
|
fileSystem: fileSystem,
|
||||||
<String>[tempDir.path],
|
platform: platform,
|
||||||
fileSystem: fileSystem,
|
processManager: processManager,
|
||||||
platform: platform,
|
logger: logger,
|
||||||
processManager: processManager,
|
terminal: terminal,
|
||||||
logger: logger,
|
experiments: <String>[],
|
||||||
terminal: terminal,
|
);
|
||||||
experiments: <String>[],
|
|
||||||
);
|
|
||||||
|
|
||||||
int errorCount = 0;
|
int errorCount = 0;
|
||||||
final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
|
final Future<bool> onDone = server.onAnalyzing.where((bool analyzing) => analyzing == false).first;
|
||||||
@ -140,9 +133,7 @@ void main() {
|
|||||||
testUsingContext('Returns no errors when source is error-free', () async {
|
testUsingContext('Returns no errors when source is error-free', () async {
|
||||||
const String contents = "StringBuffer bar = StringBuffer('baz');";
|
const String contents = "StringBuffer bar = StringBuffer('baz');";
|
||||||
tempDir.childFile('main.dart').writeAsStringSync(contents);
|
tempDir.childFile('main.dart').writeAsStringSync(contents);
|
||||||
server = AnalysisServer(
|
server = AnalysisServer(dartSdkPath, <String>[tempDir.path],
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
|
|
||||||
<String>[tempDir.path],
|
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
platform: platform,
|
platform: platform,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
@ -196,121 +187,4 @@ void main() {
|
|||||||
|
|
||||||
await server.start();
|
await server.start();
|
||||||
});
|
});
|
||||||
|
|
||||||
testUsingContext('Can run AnalysisService with customized cache location', () async {
|
|
||||||
final Completer<void> completer = Completer<void>();
|
|
||||||
final StreamController<List<int>> stdin = StreamController<List<int>>();
|
|
||||||
final FakeProcessManager processManager = FakeProcessManager.list(
|
|
||||||
<FakeCommand>[
|
|
||||||
FakeCommand(
|
|
||||||
command: const <String>[
|
|
||||||
'custom-dart-sdk/bin/dart',
|
|
||||||
'custom-dart-sdk/bin/snapshots/analysis_server.dart.snapshot',
|
|
||||||
'--disable-server-feature-completion',
|
|
||||||
'--disable-server-feature-search',
|
|
||||||
'--sdk',
|
|
||||||
'custom-dart-sdk',
|
|
||||||
],
|
|
||||||
completer: completer,
|
|
||||||
stdin: IOSink(stdin.sink),
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
final Artifacts artifacts = MockArtifacts();
|
|
||||||
when(artifacts.getArtifactPath(Artifact.engineDartSdkPath))
|
|
||||||
.thenReturn('custom-dart-sdk');
|
|
||||||
|
|
||||||
final AnalyzeCommand command = AnalyzeCommand(
|
|
||||||
terminal: Terminal.test(),
|
|
||||||
artifacts: artifacts,
|
|
||||||
logger: BufferLogger.test(),
|
|
||||||
platform: FakePlatform(operatingSystem: 'linux'),
|
|
||||||
fileSystem: MemoryFileSystem.test(),
|
|
||||||
processManager: processManager,
|
|
||||||
);
|
|
||||||
|
|
||||||
final TestFlutterCommandRunner commandRunner = TestFlutterCommandRunner();
|
|
||||||
commandRunner.addCommand(command);
|
|
||||||
unawaited(commandRunner.run(<String>['analyze', '--watch']));
|
|
||||||
await stdin.stream.first;
|
|
||||||
|
|
||||||
expect(processManager.hasRemainingExpectations, false);
|
|
||||||
});
|
|
||||||
|
|
||||||
testUsingContext('Can run AnalysisService with customized cache location --watch', () async {
|
|
||||||
final Completer<void> completer = Completer<void>();
|
|
||||||
final StreamController<List<int>> stdin = StreamController<List<int>>();
|
|
||||||
final FakeProcessManager processManager = FakeProcessManager.list(
|
|
||||||
<FakeCommand>[
|
|
||||||
FakeCommand(
|
|
||||||
command: const <String>[
|
|
||||||
'custom-dart-sdk/bin/dart',
|
|
||||||
'custom-dart-sdk/bin/snapshots/analysis_server.dart.snapshot',
|
|
||||||
'--disable-server-feature-completion',
|
|
||||||
'--disable-server-feature-search',
|
|
||||||
'--sdk',
|
|
||||||
'custom-dart-sdk',
|
|
||||||
],
|
|
||||||
completer: completer,
|
|
||||||
stdin: IOSink(stdin.sink),
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
final Artifacts artifacts = MockArtifacts();
|
|
||||||
when(artifacts.getArtifactPath(Artifact.engineDartSdkPath))
|
|
||||||
.thenReturn('custom-dart-sdk');
|
|
||||||
|
|
||||||
final AnalyzeCommand command = AnalyzeCommand(
|
|
||||||
terminal: Terminal.test(),
|
|
||||||
artifacts: artifacts,
|
|
||||||
logger: BufferLogger.test(),
|
|
||||||
platform: FakePlatform(operatingSystem: 'linux'),
|
|
||||||
fileSystem: MemoryFileSystem.test(),
|
|
||||||
processManager: processManager,
|
|
||||||
);
|
|
||||||
|
|
||||||
final TestFlutterCommandRunner commandRunner = TestFlutterCommandRunner();
|
|
||||||
commandRunner.addCommand(command);
|
|
||||||
unawaited(commandRunner.run(<String>['analyze', '--watch']));
|
|
||||||
await stdin.stream.first;
|
|
||||||
|
|
||||||
expect(processManager.hasRemainingExpectations, false);
|
|
||||||
});
|
|
||||||
|
|
||||||
testWithoutContext('Can forward null-safety experiments to the AnalysisServer', () async {
|
|
||||||
final Completer<void> completer = Completer<void>();
|
|
||||||
final StreamController<List<int>> stdin = StreamController<List<int>>();
|
|
||||||
const String fakeSdkPath = 'dart-sdk';
|
|
||||||
final FakeCommand fakeCommand = FakeCommand(
|
|
||||||
command: const <String>[
|
|
||||||
'dart-sdk/bin/dart',
|
|
||||||
'dart-sdk/bin/snapshots/analysis_server.dart.snapshot',
|
|
||||||
'--enable-experiment',
|
|
||||||
'non-nullable',
|
|
||||||
'--disable-server-feature-completion',
|
|
||||||
'--disable-server-feature-search',
|
|
||||||
'--sdk',
|
|
||||||
'dart-sdk',
|
|
||||||
],
|
|
||||||
completer: completer,
|
|
||||||
stdin: IOSink(stdin.sink),
|
|
||||||
);
|
|
||||||
|
|
||||||
server = AnalysisServer(fakeSdkPath, <String>[''],
|
|
||||||
fileSystem: MemoryFileSystem.test(),
|
|
||||||
platform: FakePlatform(),
|
|
||||||
processManager: FakeProcessManager.list(<FakeCommand>[
|
|
||||||
fakeCommand,
|
|
||||||
]),
|
|
||||||
logger: BufferLogger.test(),
|
|
||||||
terminal: Terminal.test(),
|
|
||||||
experiments: <String>[
|
|
||||||
'non-nullable'
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
await server.start();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MockArtifacts extends Mock implements Artifacts {}
|
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
|
||||||
import 'package:flutter_tools/src/artifacts.dart';
|
|
||||||
import 'package:flutter_tools/src/base/common.dart';
|
import 'package:flutter_tools/src/base/common.dart';
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
import 'package:flutter_tools/src/base/io.dart';
|
import 'package:flutter_tools/src/base/io.dart';
|
||||||
@ -34,7 +32,6 @@ void main() {
|
|||||||
Directory tempDir;
|
Directory tempDir;
|
||||||
String projectPath;
|
String projectPath;
|
||||||
File libMain;
|
File libMain;
|
||||||
Artifacts artifacts;
|
|
||||||
|
|
||||||
Future<void> runCommand({
|
Future<void> runCommand({
|
||||||
FlutterCommand command,
|
FlutterCommand command,
|
||||||
@ -95,11 +92,6 @@ flutter_project:lib/
|
|||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
);
|
);
|
||||||
analyzerSeparator = platform.isWindows ? '-' : '•';
|
analyzerSeparator = platform.isWindows ? '-' : '•';
|
||||||
artifacts = CachedArtifacts(
|
|
||||||
cache: globals.cache,
|
|
||||||
fileSystem: fileSystem,
|
|
||||||
platform: platform,
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
@ -130,7 +122,6 @@ flutter_project:lib/
|
|||||||
platform: platform,
|
platform: platform,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub'],
|
arguments: <String>['analyze', '--no-pub'],
|
||||||
statusTextContains: <String>['No issues found!'],
|
statusTextContains: <String>['No issues found!'],
|
||||||
@ -146,7 +137,6 @@ flutter_project:lib/
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub', libMain.path],
|
arguments: <String>['analyze', '--no-pub', libMain.path],
|
||||||
toolExit: true,
|
toolExit: true,
|
||||||
@ -185,7 +175,6 @@ flutter_project:lib/
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub'],
|
arguments: <String>['analyze', '--no-pub'],
|
||||||
statusTextContains: <String>[
|
statusTextContains: <String>[
|
||||||
@ -231,7 +220,6 @@ flutter_project:lib/
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub'],
|
arguments: <String>['analyze', '--no-pub'],
|
||||||
statusTextContains: <String>[
|
statusTextContains: <String>[
|
||||||
@ -278,7 +266,6 @@ void bar() {
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub'],
|
arguments: <String>['analyze', '--no-pub'],
|
||||||
statusTextContains: <String>[
|
statusTextContains: <String>[
|
||||||
@ -309,7 +296,6 @@ StringBuffer bar = StringBuffer('baz');
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub'],
|
arguments: <String>['analyze', '--no-pub'],
|
||||||
statusTextContains: <String>['No issues found!'],
|
statusTextContains: <String>['No issues found!'],
|
||||||
@ -336,7 +322,6 @@ int? bar;
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
terminal: terminal,
|
terminal: terminal,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub', '--enable-experiment=non-nullable'],
|
arguments: <String>['analyze', '--no-pub', '--enable-experiment=non-nullable'],
|
||||||
statusTextContains: <String>['No issues found!'],
|
statusTextContains: <String>['No issues found!'],
|
||||||
@ -364,7 +349,6 @@ StringBuffer bar = StringBuffer('baz');
|
|||||||
processManager: processManager,
|
processManager: processManager,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
artifacts: artifacts,
|
|
||||||
),
|
),
|
||||||
arguments: <String>['analyze', '--no-pub'],
|
arguments: <String>['analyze', '--no-pub'],
|
||||||
statusTextContains: <String>['No issues found!'],
|
statusTextContains: <String>['No issues found!'],
|
||||||
|
@ -7,7 +7,6 @@ import 'dart:convert';
|
|||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:args/command_runner.dart';
|
import 'package:args/command_runner.dart';
|
||||||
import 'package:flutter_tools/src/artifacts.dart';
|
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
import 'package:flutter_tools/src/base/io.dart';
|
import 'package:flutter_tools/src/base/io.dart';
|
||||||
import 'package:flutter_tools/src/base/net.dart';
|
import 'package:flutter_tools/src/base/net.dart';
|
||||||
@ -16,6 +15,7 @@ import 'package:flutter_tools/src/build_info.dart';
|
|||||||
import 'package:flutter_tools/src/cache.dart';
|
import 'package:flutter_tools/src/cache.dart';
|
||||||
import 'package:flutter_tools/src/commands/create.dart';
|
import 'package:flutter_tools/src/commands/create.dart';
|
||||||
import 'package:flutter_tools/src/dart/pub.dart';
|
import 'package:flutter_tools/src/dart/pub.dart';
|
||||||
|
import 'package:flutter_tools/src/dart/sdk.dart';
|
||||||
import 'package:flutter_tools/src/features.dart';
|
import 'package:flutter_tools/src/features.dart';
|
||||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||||
import 'package:flutter_tools/src/project.dart';
|
import 'package:flutter_tools/src/project.dart';
|
||||||
@ -830,11 +830,7 @@ void main() {
|
|||||||
final String original = file.readAsStringSync();
|
final String original = file.readAsStringSync();
|
||||||
|
|
||||||
final Process process = await Process.start(
|
final Process process = await Process.start(
|
||||||
globals.fs.path.join(
|
sdkBinaryName('dartfmt'),
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
|
|
||||||
'bin',
|
|
||||||
globals.platform.isWindows ? 'dartfmt.bat' : 'dartfmt',
|
|
||||||
),
|
|
||||||
<String>[file.path],
|
<String>[file.path],
|
||||||
workingDirectory: projectDir.path,
|
workingDirectory: projectDir.path,
|
||||||
);
|
);
|
||||||
@ -932,11 +928,7 @@ void main() {
|
|||||||
final String original = file.readAsStringSync();
|
final String original = file.readAsStringSync();
|
||||||
|
|
||||||
final Process process = await Process.start(
|
final Process process = await Process.start(
|
||||||
globals.fs.path.join(
|
sdkBinaryName('dartfmt'),
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartSdkPath),
|
|
||||||
'bin',
|
|
||||||
globals.platform.isWindows ? 'dartfmt.bat' : 'dartfmt',
|
|
||||||
),
|
|
||||||
<String>[file.path],
|
<String>[file.path],
|
||||||
workingDirectory: projectDir.path,
|
workingDirectory: projectDir.path,
|
||||||
);
|
);
|
||||||
@ -1540,6 +1532,7 @@ Future<void> _ensureFlutterToolsSnapshot() async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final List<String> snapshotArgs = <String>[
|
final List<String> snapshotArgs = <String>[
|
||||||
|
...dartVmFlags,
|
||||||
'--snapshot=$flutterToolsSnapshotPath',
|
'--snapshot=$flutterToolsSnapshotPath',
|
||||||
'--packages=$dotPackages',
|
'--packages=$dotPackages',
|
||||||
flutterToolsPath,
|
flutterToolsPath,
|
||||||
@ -1583,12 +1576,13 @@ Future<void> _analyzeProject(String workingDir) async {
|
|||||||
));
|
));
|
||||||
|
|
||||||
final List<String> args = <String>[
|
final List<String> args = <String>[
|
||||||
|
...dartVmFlags,
|
||||||
flutterToolsSnapshotPath,
|
flutterToolsSnapshotPath,
|
||||||
'analyze',
|
'analyze',
|
||||||
];
|
];
|
||||||
|
|
||||||
final ProcessResult exec = await Process.run(
|
final ProcessResult exec = await Process.run(
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
'$dartSdkPath/bin/dart',
|
||||||
args,
|
args,
|
||||||
workingDirectory: workingDir,
|
workingDirectory: workingDir,
|
||||||
);
|
);
|
||||||
@ -1611,8 +1605,9 @@ Future<void> _runFlutterTest(Directory workingDir, { String target }) async {
|
|||||||
// While flutter test does get packages, it doesn't write version
|
// While flutter test does get packages, it doesn't write version
|
||||||
// files anymore.
|
// files anymore.
|
||||||
await Process.run(
|
await Process.run(
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
'$dartSdkPath/bin/dart',
|
||||||
<String>[
|
<String>[
|
||||||
|
...dartVmFlags,
|
||||||
flutterToolsSnapshotPath,
|
flutterToolsSnapshotPath,
|
||||||
'packages',
|
'packages',
|
||||||
'get',
|
'get',
|
||||||
@ -1621,6 +1616,7 @@ Future<void> _runFlutterTest(Directory workingDir, { String target }) async {
|
|||||||
);
|
);
|
||||||
|
|
||||||
final List<String> args = <String>[
|
final List<String> args = <String>[
|
||||||
|
...dartVmFlags,
|
||||||
flutterToolsSnapshotPath,
|
flutterToolsSnapshotPath,
|
||||||
'test',
|
'test',
|
||||||
'--no-color',
|
'--no-color',
|
||||||
@ -1628,7 +1624,7 @@ Future<void> _runFlutterTest(Directory workingDir, { String target }) async {
|
|||||||
];
|
];
|
||||||
|
|
||||||
final ProcessResult exec = await Process.run(
|
final ProcessResult exec = await Process.run(
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
'$dartSdkPath/bin/dart',
|
||||||
args,
|
args,
|
||||||
workingDirectory: workingDir.path,
|
workingDirectory: workingDir.path,
|
||||||
);
|
);
|
||||||
|
@ -5,10 +5,10 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter_tools/src/artifacts.dart';
|
|
||||||
import 'package:flutter_tools/src/base/file_system.dart';
|
import 'package:flutter_tools/src/base/file_system.dart';
|
||||||
import 'package:flutter_tools/src/base/io.dart';
|
import 'package:flutter_tools/src/base/io.dart';
|
||||||
import 'package:flutter_tools/src/cache.dart';
|
import 'package:flutter_tools/src/cache.dart';
|
||||||
|
import 'package:flutter_tools/src/dart/sdk.dart';
|
||||||
import 'package:flutter_tools/src/globals.dart' as globals;
|
import 'package:flutter_tools/src/globals.dart' as globals;
|
||||||
|
|
||||||
import '../../src/common.dart';
|
import '../../src/common.dart';
|
||||||
@ -302,6 +302,7 @@ Future<ProcessResult> _runFlutterTest(
|
|||||||
}
|
}
|
||||||
|
|
||||||
final List<String> args = <String>[
|
final List<String> args = <String>[
|
||||||
|
...dartVmFlags,
|
||||||
globals.fs.path.absolute(globals.fs.path.join('bin', 'flutter_tools.dart')),
|
globals.fs.path.absolute(globals.fs.path.join('bin', 'flutter_tools.dart')),
|
||||||
'test',
|
'test',
|
||||||
'--no-color',
|
'--no-color',
|
||||||
@ -318,7 +319,7 @@ Future<ProcessResult> _runFlutterTest(
|
|||||||
_testExclusionLock = testExclusionCompleter.future;
|
_testExclusionLock = testExclusionCompleter.future;
|
||||||
try {
|
try {
|
||||||
return await Process.run(
|
return await Process.run(
|
||||||
globals.artifacts.getArtifactPath(Artifact.engineDartBinary),
|
globals.fs.path.join(dartSdkPath, 'bin', 'dart'),
|
||||||
args,
|
args,
|
||||||
workingDirectory: workingDirectory,
|
workingDirectory: workingDirectory,
|
||||||
stdoutEncoding: utf8,
|
stdoutEncoding: utf8,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user