| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 // We need to use the 'io' prefix here, otherwise io.exitCode will shadow | 6 // We need to use the 'io' prefix here, otherwise io.exitCode will shadow |
| 7 // CommandOutput.exitCode in subclasses of CommandOutput. | 7 // CommandOutput.exitCode in subclasses of CommandOutput. |
| 8 import 'dart:io' as io; | 8 import 'dart:io' as io; |
| 9 | 9 |
| 10 import 'command_output.dart'; | 10 import 'command_output.dart'; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 static Command browserHtmlTest( | 33 static Command browserHtmlTest( |
| 34 String url, Configuration configuration, List<String> expectedMessages, | 34 String url, Configuration configuration, List<String> expectedMessages, |
| 35 {bool retry}) { | 35 {bool retry}) { |
| 36 return new BrowserHtmlTestCommand._( | 36 return new BrowserHtmlTestCommand._( |
| 37 url, configuration, expectedMessages, retry); | 37 url, configuration, expectedMessages, retry); |
| 38 } | 38 } |
| 39 | 39 |
| 40 static Command compilation( | 40 static Command compilation( |
| 41 String displayName, | 41 String displayName, |
| 42 String outputFile, | 42 String outputFile, |
| 43 bool neverSkipCompilation, | |
| 44 List<Uri> bootstrapDependencies, | 43 List<Uri> bootstrapDependencies, |
| 45 String executable, | 44 String executable, |
| 46 List<String> arguments, | 45 List<String> arguments, |
| 47 Map<String, String> environment) { | 46 Map<String, String> environment, |
| 48 return new CompilationCommand._( | 47 {bool alwaysCompile: false}) { |
| 49 displayName, | 48 return new CompilationCommand._(displayName, outputFile, alwaysCompile, |
| 50 outputFile, | 49 bootstrapDependencies, executable, arguments, environment); |
| 51 neverSkipCompilation, | |
| 52 bootstrapDependencies, | |
| 53 executable, | |
| 54 arguments, | |
| 55 environment); | |
| 56 } | 50 } |
| 57 | 51 |
| 58 static Command kernelCompilation( | 52 static Command kernelCompilation( |
| 59 String outputFile, | 53 String outputFile, |
| 60 bool neverSkipCompilation, | 54 bool neverSkipCompilation, |
| 61 List<Uri> bootstrapDependencies, | 55 List<Uri> bootstrapDependencies, |
| 62 String executable, | 56 String executable, |
| 63 List<String> arguments, | 57 List<String> arguments, |
| 64 Map<String, String> environment) { | 58 Map<String, String> environment) { |
| 65 return new KernelCompilationCommand._(outputFile, neverSkipCompilation, | 59 return new KernelCompilationCommand._(outputFile, neverSkipCompilation, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 | 144 |
| 151 void _buildHashCode(HashCodeBuilder builder) { | 145 void _buildHashCode(HashCodeBuilder builder) { |
| 152 builder.addJson(displayName); | 146 builder.addJson(displayName); |
| 153 } | 147 } |
| 154 | 148 |
| 155 bool _equal(covariant Command other) => | 149 bool _equal(covariant Command other) => |
| 156 hashCode == other.hashCode && displayName == other.displayName; | 150 hashCode == other.hashCode && displayName == other.displayName; |
| 157 | 151 |
| 158 String toString() => reproductionCommand; | 152 String toString() => reproductionCommand; |
| 159 | 153 |
| 160 Future<bool> get outputIsUpToDate => new Future.value(false); | 154 bool get outputIsUpToDate => false; |
| 161 } | 155 } |
| 162 | 156 |
| 163 class ProcessCommand extends Command { | 157 class ProcessCommand extends Command { |
| 164 /// Path to the executable of this command. | 158 /// Path to the executable of this command. |
| 165 String executable; | 159 String executable; |
| 166 | 160 |
| 167 /// Command line arguments to the executable. | 161 /// Command line arguments to the executable. |
| 168 final List<String> arguments; | 162 final List<String> arguments; |
| 169 | 163 |
| 170 /// Environment for the command. | 164 /// Environment for the command. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 : env.write('$key=${escapeCommandLineArgument(value)} ')); | 201 : env.write('$key=${escapeCommandLineArgument(value)} ')); |
| 208 var command = ([executable]..addAll(batchArguments)..addAll(arguments)) | 202 var command = ([executable]..addAll(batchArguments)..addAll(arguments)) |
| 209 .map(escapeCommandLineArgument) | 203 .map(escapeCommandLineArgument) |
| 210 .join(' '); | 204 .join(' '); |
| 211 if (workingDirectory != null) { | 205 if (workingDirectory != null) { |
| 212 command = "$command (working directory: $workingDirectory)"; | 206 command = "$command (working directory: $workingDirectory)"; |
| 213 } | 207 } |
| 214 return "$env$command"; | 208 return "$env$command"; |
| 215 } | 209 } |
| 216 | 210 |
| 217 Future<bool> get outputIsUpToDate => new Future.value(false); | 211 bool get outputIsUpToDate => false; |
| 218 | 212 |
| 219 /// Arguments that are passed to the process when starting batch mode. | 213 /// Arguments that are passed to the process when starting batch mode. |
| 220 /// | 214 /// |
| 221 /// In non-batch mode, they should be passed before [arguments]. | 215 /// In non-batch mode, they should be passed before [arguments]. |
| 222 List<String> get batchArguments => const []; | 216 List<String> get batchArguments => const []; |
| 223 } | 217 } |
| 224 | 218 |
| 225 class CompilationCommand extends ProcessCommand { | 219 class CompilationCommand extends ProcessCommand { |
| 226 final String _outputFile; | 220 final String _outputFile; |
| 227 final bool _neverSkipCompilation; | 221 |
| 222 /// If true, then the compilation is run even if the input files are older |
| 223 /// than the output file. |
| 224 final bool _alwaysCompile; |
| 228 final List<Uri> _bootstrapDependencies; | 225 final List<Uri> _bootstrapDependencies; |
| 229 | 226 |
| 230 CompilationCommand._( | 227 CompilationCommand._( |
| 231 String displayName, | 228 String displayName, |
| 232 this._outputFile, | 229 this._outputFile, |
| 233 this._neverSkipCompilation, | 230 this._alwaysCompile, |
| 234 this._bootstrapDependencies, | 231 this._bootstrapDependencies, |
| 235 String executable, | 232 String executable, |
| 236 List<String> arguments, | 233 List<String> arguments, |
| 237 Map<String, String> environmentOverrides) | 234 Map<String, String> environmentOverrides) |
| 238 : super._(displayName, executable, arguments, environmentOverrides); | 235 : super._(displayName, executable, arguments, environmentOverrides); |
| 239 | 236 |
| 240 Future<bool> get outputIsUpToDate { | 237 bool get outputIsUpToDate { |
| 241 if (_neverSkipCompilation) return new Future.value(false); | 238 if (_alwaysCompile) return false; |
| 242 | 239 |
| 243 Future<List<Uri>> readDepsFile(String path) { | 240 List<Uri> readDepsFile(String path) { |
| 244 var file = new io.File(new Path(path).toNativePath()); | 241 var file = new io.File(new Path(path).toNativePath()); |
| 245 if (!file.existsSync()) { | 242 if (!file.existsSync()) return null; |
| 246 return new Future.value(null); | 243 |
| 244 var lines = file.readAsLinesSync(); |
| 245 var dependencies = <Uri>[]; |
| 246 for (var line in lines) { |
| 247 line = line.trim(); |
| 248 if (line.isNotEmpty) { |
| 249 dependencies.add(Uri.parse(line)); |
| 250 } |
| 247 } | 251 } |
| 248 return file.readAsLines().then((List<String> lines) { | 252 |
| 249 var dependencies = new List<Uri>(); | 253 return dependencies; |
| 250 for (var line in lines) { | |
| 251 line = line.trim(); | |
| 252 if (line.length > 0) { | |
| 253 dependencies.add(Uri.parse(line)); | |
| 254 } | |
| 255 } | |
| 256 return dependencies; | |
| 257 }); | |
| 258 } | 254 } |
| 259 | 255 |
| 260 return readDepsFile("$_outputFile.deps").then((dependencies) { | 256 var dependencies = readDepsFile("$_outputFile.deps"); |
| 261 if (dependencies != null) { | 257 if (dependencies == null) return false; |
| 262 dependencies.addAll(_bootstrapDependencies); | 258 |
| 263 var jsOutputLastModified = TestUtils.lastModifiedCache | 259 dependencies.addAll(_bootstrapDependencies); |
| 264 .getLastModified(new Uri(scheme: 'file', path: _outputFile)); | 260 var jsOutputLastModified = TestUtils.lastModifiedCache |
| 265 if (jsOutputLastModified != null) { | 261 .getLastModified(new Uri(scheme: 'file', path: _outputFile)); |
| 266 for (var dependency in dependencies) { | 262 if (jsOutputLastModified == null) return false; |
| 267 var dependencyLastModified = | 263 |
| 268 TestUtils.lastModifiedCache.getLastModified(dependency); | 264 for (var dependency in dependencies) { |
| 269 if (dependencyLastModified == null || | 265 var dependencyLastModified = |
| 270 dependencyLastModified.isAfter(jsOutputLastModified)) { | 266 TestUtils.lastModifiedCache.getLastModified(dependency); |
| 271 return false; | 267 if (dependencyLastModified == null || |
| 272 } | 268 dependencyLastModified.isAfter(jsOutputLastModified)) { |
| 273 } | 269 return false; |
| 274 return true; | |
| 275 } | |
| 276 } | 270 } |
| 277 return false; | 271 } |
| 278 }); | 272 return true; |
| 279 } | 273 } |
| 280 | 274 |
| 281 void _buildHashCode(HashCodeBuilder builder) { | 275 void _buildHashCode(HashCodeBuilder builder) { |
| 282 super._buildHashCode(builder); | 276 super._buildHashCode(builder); |
| 283 builder.addJson(_outputFile); | 277 builder.addJson(_outputFile); |
| 284 builder.addJson(_neverSkipCompilation); | 278 builder.addJson(_alwaysCompile); |
| 285 builder.addJson(_bootstrapDependencies); | 279 builder.addJson(_bootstrapDependencies); |
| 286 } | 280 } |
| 287 | 281 |
| 288 bool _equal(CompilationCommand other) => | 282 bool _equal(CompilationCommand other) => |
| 289 super._equal(other) && | 283 super._equal(other) && |
| 290 _outputFile == other._outputFile && | 284 _outputFile == other._outputFile && |
| 291 _neverSkipCompilation == other._neverSkipCompilation && | 285 _alwaysCompile == other._alwaysCompile && |
| 292 deepJsonCompare(_bootstrapDependencies, other._bootstrapDependencies); | 286 deepJsonCompare(_bootstrapDependencies, other._bootstrapDependencies); |
| 293 } | 287 } |
| 294 | 288 |
| 295 class KernelCompilationCommand extends CompilationCommand { | 289 class KernelCompilationCommand extends CompilationCommand { |
| 296 KernelCompilationCommand._( | 290 KernelCompilationCommand._( |
| 297 String outputFile, | 291 String outputFile, |
| 298 bool neverSkipCompilation, | 292 bool neverSkipCompilation, |
| 299 List<Uri> bootstrapDependencies, | 293 List<Uri> bootstrapDependencies, |
| 300 String executable, | 294 String executable, |
| 301 List<String> arguments, | 295 List<String> arguments, |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 | 594 |
| 601 void _buildHashCode(HashCodeBuilder builder) { | 595 void _buildHashCode(HashCodeBuilder builder) { |
| 602 super._buildHashCode(builder); | 596 super._buildHashCode(builder); |
| 603 builder.addJson(_link); | 597 builder.addJson(_link); |
| 604 builder.addJson(_target); | 598 builder.addJson(_target); |
| 605 } | 599 } |
| 606 | 600 |
| 607 bool _equal(MakeSymlinkCommand other) => | 601 bool _equal(MakeSymlinkCommand other) => |
| 608 super._equal(other) && _link == other._link && _target == other._target; | 602 super._equal(other) && _link == other._link && _target == other._target; |
| 609 } | 603 } |
| OLD | NEW |