Unverified Commit bbcf55a5 authored by Alexander Aprelev's avatar Alexander Aprelev Committed by GitHub

Reland pass filesystem options (#15622)

* Revert "Revert "Pass filesystem-root, filesystem-scheme options through `flutter run, build` and gradle. (#15592)" (#15621)"

This reverts commit c663e336.

* Check whether filesystem-root is emtpy.

* Restore broken merge

* Fix windows test

* Adjust regex in test. Invalidate files by file path.
parent 992875c2
...@@ -260,6 +260,14 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -260,6 +260,14 @@ class FlutterPlugin implements Plugin<Project> {
if (project.hasProperty('preview-dart-2')) { if (project.hasProperty('preview-dart-2')) {
previewDart2Value = project.property('preview-dart-2') previewDart2Value = project.property('preview-dart-2')
} }
String[] fileSystemRootsValue = null
if (project.hasProperty('filesystem-roots')) {
fileSystemRootsValue = project.property('filesystem-roots').split('\\|')
}
String fileSystemSchemeValue = null
if (project.hasProperty('filesystem-scheme')) {
fileSystemSchemeValue = project.property('filesystem-scheme')
}
Boolean trackWidgetCreationValue = false Boolean trackWidgetCreationValue = false
if (project.hasProperty('track-widget-creation')) { if (project.hasProperty('track-widget-creation')) {
trackWidgetCreationValue = project.property('track-widget-creation') trackWidgetCreationValue = project.property('track-widget-creation')
...@@ -302,6 +310,8 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -302,6 +310,8 @@ class FlutterPlugin implements Plugin<Project> {
localEngineSrcPath this.localEngineSrcPath localEngineSrcPath this.localEngineSrcPath
targetPath target targetPath target
previewDart2 previewDart2Value previewDart2 previewDart2Value
fileSystemRoots fileSystemRootsValue
fileSystemScheme fileSystemSchemeValue
trackWidgetCreation trackWidgetCreationValue trackWidgetCreation trackWidgetCreationValue
preferSharedLibrary preferSharedLibraryValue preferSharedLibrary preferSharedLibraryValue
targetPlatform targetPlatformValue targetPlatform targetPlatformValue
...@@ -320,6 +330,8 @@ class FlutterPlugin implements Plugin<Project> { ...@@ -320,6 +330,8 @@ class FlutterPlugin implements Plugin<Project> {
localEngineSrcPath this.localEngineSrcPath localEngineSrcPath this.localEngineSrcPath
targetPath target targetPath target
previewDart2 previewDart2Value previewDart2 previewDart2Value
fileSystemRoots fileSystemRootsValue
fileSystemScheme fileSystemSchemeValue
trackWidgetCreation trackWidgetCreationValue trackWidgetCreation trackWidgetCreationValue
preferSharedLibrary preferSharedLibraryValue preferSharedLibrary preferSharedLibraryValue
targetPlatform targetPlatformValue targetPlatform targetPlatformValue
...@@ -357,6 +369,10 @@ abstract class BaseFlutterTask extends DefaultTask { ...@@ -357,6 +369,10 @@ abstract class BaseFlutterTask extends DefaultTask {
@Optional @Input @Optional @Input
Boolean previewDart2 Boolean previewDart2
@Optional @Input @Optional @Input
String[] fileSystemRoots
@Optional @Input
String fileSystemScheme
@Optional @Input
Boolean trackWidgetCreation Boolean trackWidgetCreation
@Optional @Input @Optional @Input
Boolean preferSharedLibrary Boolean preferSharedLibrary
...@@ -437,6 +453,14 @@ abstract class BaseFlutterTask extends DefaultTask { ...@@ -437,6 +453,14 @@ abstract class BaseFlutterTask extends DefaultTask {
} else { } else {
args "--no-preview-dart-2" args "--no-preview-dart-2"
} }
if (fileSystemRoots != null) {
for (root in fileSystemRoots) {
args "--filesystem-root", root
}
}
if (fileSystemScheme != null) {
args "--filesystem-scheme", fileSystemScheme
}
if (trackWidgetCreation) { if (trackWidgetCreation) {
args "--track-widget-creation" args "--track-widget-creation"
} }
......
...@@ -303,6 +303,10 @@ Future<Null> _buildGradleProjectV2(String gradle, BuildInfo buildInfo, String ta ...@@ -303,6 +303,10 @@ Future<Null> _buildGradleProjectV2(String gradle, BuildInfo buildInfo, String ta
command.add('-Pextra-front-end-options=${buildInfo.extraFrontEndOptions}'); command.add('-Pextra-front-end-options=${buildInfo.extraFrontEndOptions}');
if (buildInfo.extraGenSnapshotOptions != null) if (buildInfo.extraGenSnapshotOptions != null)
command.add('-Pextra-gen-snapshot-options=${buildInfo.extraGenSnapshotOptions}'); command.add('-Pextra-gen-snapshot-options=${buildInfo.extraGenSnapshotOptions}');
if (buildInfo.fileSystemRoots != null)
command.add('-Pfilesystem-roots=${buildInfo.fileSystemRoots.join('|')}');
if (buildInfo.fileSystemScheme != null)
command.add('-Pfilesystem-scheme=${buildInfo.fileSystemScheme}');
} }
if (buildInfo.preferSharedLibrary && androidSdk.ndkCompiler != null) { if (buildInfo.preferSharedLibrary && androidSdk.ndkCompiler != null) {
command.add('-Pprefer-shared-library=true'); command.add('-Pprefer-shared-library=true');
......
...@@ -17,6 +17,8 @@ class BuildInfo { ...@@ -17,6 +17,8 @@ class BuildInfo {
this.extraGenSnapshotOptions, this.extraGenSnapshotOptions,
this.preferSharedLibrary, this.preferSharedLibrary,
this.targetPlatform, this.targetPlatform,
this.fileSystemRoots,
this.fileSystemScheme,
}); });
final BuildMode mode; final BuildMode mode;
...@@ -32,6 +34,9 @@ class BuildInfo { ...@@ -32,6 +34,9 @@ class BuildInfo {
/// Whether build should be done using Dart2 Frontend parser. /// Whether build should be done using Dart2 Frontend parser.
final bool previewDart2; final bool previewDart2;
final List<String> fileSystemRoots;
final String fileSystemScheme;
/// Whether the build should track widget creation locations. /// Whether the build should track widget creation locations.
final bool trackWidgetCreation; final bool trackWidgetCreation;
......
...@@ -35,7 +35,18 @@ class BuildFlxCommand extends BuildSubCommand { ...@@ -35,7 +35,18 @@ class BuildFlxCommand extends BuildSubCommand {
..addFlag('report-licensed-packages', ..addFlag('report-licensed-packages',
help: 'Whether to report the names of all the packages that are included ' help: 'Whether to report the names of all the packages that are included '
'in the application\'s LICENSE file.', 'in the application\'s LICENSE file.',
defaultsTo: false); defaultsTo: false)
..addMultiOption('filesystem-root',
hide: !verboseHelp,
help: 'Specify the path, that is used as root in a virtual file system\n'
'for compilation. Input file name should be specified as Uri in\n'
'filesystem-scheme scheme. Use only in Dart 2 mode.\n'
'Requires --output-dill option to be explicitly specified.\n')
..addOption('filesystem-scheme',
defaultsTo: 'org-dartlang-root',
hide: !verboseHelp,
help: 'Specify the scheme that is used for virtual file system used in\n'
'compilation. See more details on filesystem-root option.\n');
usesPubOption(); usesPubOption();
} }
...@@ -67,6 +78,8 @@ class BuildFlxCommand extends BuildSubCommand { ...@@ -67,6 +78,8 @@ class BuildFlxCommand extends BuildSubCommand {
precompiledSnapshot: argResults['precompiled'], precompiledSnapshot: argResults['precompiled'],
reportLicensedPackages: argResults['report-licensed-packages'], reportLicensedPackages: argResults['report-licensed-packages'],
trackWidgetCreation: argResults['track-widget-creation'], trackWidgetCreation: argResults['track-widget-creation'],
fileSystemScheme: argResults['filesystem-scheme'],
fileSystemRoots: argResults['filesystem-root'],
); );
} }
} }
...@@ -172,7 +172,18 @@ class RunCommand extends RunCommandBase { ...@@ -172,7 +172,18 @@ class RunCommand extends RunCommandBase {
help: 'Specify the path to frontend server output kernel file.', help: 'Specify the path to frontend server output kernel file.',
) )
..addOption(FlutterOptions.kExtraFrontEndOptions, hide: true) ..addOption(FlutterOptions.kExtraFrontEndOptions, hide: true)
..addOption(FlutterOptions.kExtraGenSnapshotOptions, hide: true); ..addOption(FlutterOptions.kExtraGenSnapshotOptions, hide: true)
..addMultiOption('filesystem-root',
hide: !verboseHelp,
help: 'Specify the path, that is used as root in a virtual file system\n'
'for compilation. Input file name should be specified as Uri in\n'
'filesystem-scheme scheme. Use only in Dart 2 mode.\n'
'Requires --output-dill option to be explicitly specified.\n')
..addOption('filesystem-scheme',
defaultsTo: 'org-dartlang-root',
hide: !verboseHelp,
help: 'Specify the scheme that is used for virtual file system used in\n'
'compilation. See more details on filesystem-root option.\n');
} }
List<Device> devices; List<Device> devices;
...@@ -345,6 +356,8 @@ class RunCommand extends RunCommandBase { ...@@ -345,6 +356,8 @@ class RunCommand extends RunCommandBase {
previewDart2: argResults['preview-dart-2'], previewDart2: argResults['preview-dart-2'],
trackWidgetCreation: argResults['track-widget-creation'], trackWidgetCreation: argResults['track-widget-creation'],
dillOutputPath: argResults['output-dill'], dillOutputPath: argResults['output-dill'],
fileSystemRoots: argResults['filesystem-root'],
fileSystemScheme: argResults['filesystem-scheme'],
); );
}).toList(); }).toList();
......
...@@ -55,7 +55,9 @@ Future<String> compile( ...@@ -55,7 +55,9 @@ Future<String> compile(
bool trackWidgetCreation: false, bool trackWidgetCreation: false,
List<String> extraFrontEndOptions, List<String> extraFrontEndOptions,
String incrementalCompilerByteStorePath, String incrementalCompilerByteStorePath,
String packagesPath}) async { String packagesPath,
List<String> fileSystemRoots,
String fileSystemScheme}) async {
final String frontendServer = artifacts.getArtifactPath( final String frontendServer = artifacts.getArtifactPath(
Artifact.frontendServerSnapshotForEngineDartSdk Artifact.frontendServerSnapshotForEngineDartSdk
); );
...@@ -93,9 +95,17 @@ Future<String> compile( ...@@ -93,9 +95,17 @@ Future<String> compile(
if (outputFilePath != null) { if (outputFilePath != null) {
command.addAll(<String>['--output-dill', outputFilePath]); command.addAll(<String>['--output-dill', outputFilePath]);
} }
if (depFilePath != null) { if (depFilePath != null && (fileSystemRoots == null || fileSystemRoots.isEmpty)) {
command.addAll(<String>['--depfile', depFilePath]); command.addAll(<String>['--depfile', depFilePath]);
} }
if (fileSystemRoots != null) {
for (String root in fileSystemRoots) {
command.addAll(<String>['--filesystem-root', root]);
}
}
if (fileSystemScheme != null) {
command.addAll(<String>['--filesystem-scheme', fileSystemScheme]);
}
if (extraFrontEndOptions != null) if (extraFrontEndOptions != null)
command.addAll(extraFrontEndOptions); command.addAll(extraFrontEndOptions);
...@@ -127,10 +137,13 @@ Future<String> compile( ...@@ -127,10 +137,13 @@ Future<String> compile(
/// restarts the Flutter app. /// restarts the Flutter app.
class ResidentCompiler { class ResidentCompiler {
ResidentCompiler(this._sdkRoot, {bool trackWidgetCreation: false, ResidentCompiler(this._sdkRoot, {bool trackWidgetCreation: false,
String packagesPath, CompilerMessageConsumer compilerMessageConsumer: printError}) String packagesPath, List<String> fileSystemRoots, String fileSystemScheme ,
CompilerMessageConsumer compilerMessageConsumer: printError})
: assert(_sdkRoot != null), : assert(_sdkRoot != null),
_trackWidgetCreation = trackWidgetCreation, _trackWidgetCreation = trackWidgetCreation,
_packagesPath = packagesPath, _packagesPath = packagesPath,
_fileSystemRoots = fileSystemRoots,
_fileSystemScheme = fileSystemScheme,
stdoutHandler = new _StdoutHandler(consumer: compilerMessageConsumer) { stdoutHandler = new _StdoutHandler(consumer: compilerMessageConsumer) {
// This is a URI, not a file path, so the forward slash is correct even on Windows. // This is a URI, not a file path, so the forward slash is correct even on Windows.
if (!_sdkRoot.endsWith('/')) if (!_sdkRoot.endsWith('/'))
...@@ -139,6 +152,8 @@ class ResidentCompiler { ...@@ -139,6 +152,8 @@ class ResidentCompiler {
final bool _trackWidgetCreation; final bool _trackWidgetCreation;
final String _packagesPath; final String _packagesPath;
final List<String> _fileSystemRoots;
final String _fileSystemScheme;
String _sdkRoot; String _sdkRoot;
Process _server; Process _server;
final _StdoutHandler stdoutHandler; final _StdoutHandler stdoutHandler;
...@@ -157,11 +172,13 @@ class ResidentCompiler { ...@@ -157,11 +172,13 @@ class ResidentCompiler {
// First time recompile is called we actually have to compile the app from // First time recompile is called we actually have to compile the app from
// scratch ignoring list of invalidated files. // scratch ignoring list of invalidated files.
if (_server == null) if (_server == null)
return _compile(mainPath, outputPath, packagesFilePath); return _compile(_mapFilename(mainPath), outputPath, _mapFilename(packagesFilePath));
final String inputKey = new Uuid().generateV4(); final String inputKey = new Uuid().generateV4();
_server.stdin.writeln('recompile ${mainPath != null ? mainPath + " ": ""}$inputKey'); _server.stdin.writeln('recompile ${mainPath != null ? _mapFilename(mainPath) + " ": ""}$inputKey');
invalidatedFiles.forEach(_server.stdin.writeln); for (String filePath in invalidatedFiles) {
_server.stdin.writeln(_mapFilename(filePath));
}
_server.stdin.writeln(inputKey); _server.stdin.writeln(inputKey);
return stdoutHandler.outputFilename.future; return stdoutHandler.outputFilename.future;
...@@ -192,6 +209,14 @@ class ResidentCompiler { ...@@ -192,6 +209,14 @@ class ResidentCompiler {
if (_packagesPath != null) { if (_packagesPath != null) {
args.addAll(<String>['--packages', _packagesPath]); args.addAll(<String>['--packages', _packagesPath]);
} }
if (_fileSystemRoots != null) {
for (String root in _fileSystemRoots) {
args.addAll(<String>['--filesystem-root', root]);
}
}
if (_fileSystemScheme != null) {
args.addAll(<String>['--filesystem-scheme', _fileSystemScheme]);
}
_server = await processManager.start(args); _server = await processManager.start(args);
_server.stdout _server.stdout
.transform(utf8.decoder) .transform(utf8.decoder)
...@@ -238,6 +263,19 @@ class ResidentCompiler { ...@@ -238,6 +263,19 @@ class ResidentCompiler {
_server.stdin.writeln('reset'); _server.stdin.writeln('reset');
} }
String _mapFilename(String filename) {
if (_fileSystemRoots != null) {
for (String root in _fileSystemRoots) {
if (filename.startsWith(root)) {
return new Uri(
scheme: _fileSystemScheme, path: filename.substring(root.length))
.toString();
}
}
}
return filename;
}
Future<dynamic> shutdown() { Future<dynamic> shutdown() {
_server.kill(); _server.kill();
return _server.exitCode; return _server.exitCode;
......
...@@ -487,7 +487,7 @@ class DevFS { ...@@ -487,7 +487,7 @@ class DevFS {
final DevFSContent content = dirtyEntries[uri]; final DevFSContent content = dirtyEntries[uri];
if (content is DevFSFileContent) { if (content is DevFSFileContent) {
filesUris.add(uri); filesUris.add(uri);
invalidatedFiles.add(content.file.uri.toString()); invalidatedFiles.add(content.file.path);
numBytes -= content.size; numBytes -= content.size;
} }
} }
......
...@@ -44,6 +44,8 @@ Future<Null> build({ ...@@ -44,6 +44,8 @@ Future<Null> build({
bool precompiledSnapshot: false, bool precompiledSnapshot: false,
bool reportLicensedPackages: false, bool reportLicensedPackages: false,
bool trackWidgetCreation: false, bool trackWidgetCreation: false,
List<String> fileSystemRoots,
String fileSystemScheme,
}) async { }) async {
outputPath ??= defaultFlxOutputPath; outputPath ??= defaultFlxOutputPath;
snapshotPath ??= defaultSnapshotPath; snapshotPath ??= defaultSnapshotPath;
...@@ -82,6 +84,9 @@ Future<Null> build({ ...@@ -82,6 +84,9 @@ Future<Null> build({
outputFilePath: applicationKernelFilePath, outputFilePath: applicationKernelFilePath,
depFilePath: depfilePath, depFilePath: depfilePath,
trackWidgetCreation: trackWidgetCreation, trackWidgetCreation: trackWidgetCreation,
fileSystemRoots: fileSystemRoots,
fileSystemScheme: fileSystemScheme,
packagesPath: packagesPath,
); );
if (kernelBinaryFilename == null) { if (kernelBinaryFilename == null) {
throwToolExit('Compiler terminated unexpectedly on $mainPath'); throwToolExit('Compiler terminated unexpectedly on $mainPath');
......
...@@ -36,6 +36,8 @@ class FlutterDevice { ...@@ -36,6 +36,8 @@ class FlutterDevice {
ApplicationPackage package; ApplicationPackage package;
ResidentCompiler generator; ResidentCompiler generator;
String dillOutputPath; String dillOutputPath;
List<String> fileSystemRoots;
String fileSystemScheme;
StreamSubscription<String> _loggingSubscription; StreamSubscription<String> _loggingSubscription;
...@@ -43,11 +45,14 @@ class FlutterDevice { ...@@ -43,11 +45,14 @@ class FlutterDevice {
@required bool previewDart2, @required bool previewDart2,
@required bool trackWidgetCreation, @required bool trackWidgetCreation,
this.dillOutputPath, this.dillOutputPath,
this.fileSystemRoots,
this.fileSystemScheme,
}) { }) {
if (previewDart2) { if (previewDart2) {
generator = new ResidentCompiler( generator = new ResidentCompiler(
artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath), artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
trackWidgetCreation: trackWidgetCreation, trackWidgetCreation: trackWidgetCreation,
fileSystemRoots: fileSystemRoots, fileSystemScheme: fileSystemScheme
); );
} }
} }
......
...@@ -392,7 +392,7 @@ class HotRunner extends ResidentRunner { ...@@ -392,7 +392,7 @@ class HotRunner extends ResidentRunner {
// We are now running from source. // We are now running from source.
_runningFromSnapshot = false; _runningFromSnapshot = false;
final String launchPath = debuggingOptions.buildInfo.previewDart2 final String launchPath = debuggingOptions.buildInfo.previewDart2
? dillOutputPath ?? mainPath + '.dill' ? mainPath + '.dill'
: mainPath; : mainPath;
await _launchFromDevFS(launchPath); await _launchFromDevFS(launchPath);
restartTimer.stop(); restartTimer.stop();
......
...@@ -61,6 +61,8 @@ class FlutterCommandResult { ...@@ -61,6 +61,8 @@ class FlutterCommandResult {
class FlutterOptions { class FlutterOptions {
static const String kExtraFrontEndOptions = 'extra-front-end-options'; static const String kExtraFrontEndOptions = 'extra-front-end-options';
static const String kExtraGenSnapshotOptions = 'extra-gen-snapshot-options'; static const String kExtraGenSnapshotOptions = 'extra-gen-snapshot-options';
static const String kFileSystemRoot = 'filesystem-root';
static const String kFileSystemScheme = 'filesystem-scheme';
} }
abstract class FlutterCommand extends Command<Null> { abstract class FlutterCommand extends Command<Null> {
...@@ -194,7 +196,12 @@ abstract class FlutterCommand extends Command<Null> { ...@@ -194,7 +196,12 @@ abstract class FlutterCommand extends Command<Null> {
preferSharedLibrary: argParser.options.containsKey('prefer-shared-library') preferSharedLibrary: argParser.options.containsKey('prefer-shared-library')
? argResults['prefer-shared-library'] ? argResults['prefer-shared-library']
: false, : false,
targetPlatform: targetPlatform); targetPlatform: targetPlatform,
fileSystemRoots: argParser.options.containsKey(FlutterOptions.kFileSystemRoot)
? argResults[FlutterOptions.kFileSystemRoot] : null,
fileSystemScheme: argParser.options.containsKey(FlutterOptions.kFileSystemScheme)
? argResults[FlutterOptions.kFileSystemScheme] : null,
);
} }
void setupApplicationPackages() { void setupApplicationPackages() {
......
...@@ -227,7 +227,7 @@ Future<Null> _recompile(StreamController<List<int>> streamController, ...@@ -227,7 +227,7 @@ Future<Null> _recompile(StreamController<List<int>> streamController,
final String output = await generator.recompile(null /* mainPath */, <String>['/path/to/main.dart']); final String output = await generator.recompile(null /* mainPath */, <String>['/path/to/main.dart']);
expect(output, equals('/path/to/main.dart.dill')); expect(output, equals('/path/to/main.dart.dill'));
final String commands = mockFrontendServerStdIn.getAndClear(); final String commands = mockFrontendServerStdIn.getAndClear();
final RegExp re = new RegExp(r'^recompile (.*)\n/path/to/main.dart\n(.*)\n$'); final RegExp re = new RegExp('^recompile (.*)\\n/path/to/main.dart\\n(.*)\\n\$');
expect(commands, matches(re)); expect(commands, matches(re));
final Match match = re.firstMatch(commands); final Match match = re.firstMatch(commands);
expect(match[1] == match[2], isTrue); expect(match[1] == match[2], isTrue);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment