Index: tool/patch_sdk.dart |
diff --git a/tool/patch_sdk.dart b/tool/patch_sdk.dart |
index 276d5fd53e94a4a91914298fcacbe83f8cff3262..e8bc7409ef59495f084ba5790cf062e86ac397de 100755 |
--- a/tool/patch_sdk.dart |
+++ b/tool/patch_sdk.dart |
@@ -8,6 +8,7 @@ |
library dev_compiler.tool.patch_sdk; |
import 'dart:io'; |
+import 'dart:math' as math; |
import 'package:analyzer/analyzer.dart'; |
import 'package:analyzer/src/generated/sdk.dart'; |
@@ -72,17 +73,21 @@ void main(List<String> argv) { |
var libraryFile = new File(libraryIn); |
if (libraryFile.existsSync()) { |
- var contents = <String>[]; |
- var paths = <String>[]; |
+ var outPaths = <String>[libraryOut]; |
var libraryContents = libraryFile.readAsStringSync(); |
- paths.add(libraryOut); |
- contents.add(libraryContents); |
+ |
+ int inputModifyTime = |
+ libraryFile.lastModifiedSync().millisecondsSinceEpoch; |
+ var partFiles = <File>[]; |
for (var part in parseDirectives(libraryContents).directives) { |
if (part is PartDirective) { |
var partPath = part.uri.stringValue; |
- paths.add(path.join(path.dirname(libraryOut), partPath)); |
- contents.add(new File(path.join(path.dirname(libraryIn), partPath)) |
- .readAsStringSync()); |
+ outPaths.add(path.join(path.dirname(libraryOut), partPath)); |
+ |
+ var partFile = new File(path.join(path.dirname(libraryIn), partPath)); |
+ partFiles.add(partFile); |
+ inputModifyTime = math.max(inputModifyTime, |
+ partFile.lastModifiedSync().millisecondsSinceEpoch); |
} |
} |
@@ -90,14 +95,41 @@ void main(List<String> argv) { |
var patchPath = path.join( |
patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart'); |
- if (new File(patchPath).existsSync()) { |
- var patchContents = new File(patchPath).readAsStringSync(); |
- contents = _patchLibrary(contents, patchContents); |
+ var patchFile = new File(patchPath); |
+ bool patchExists = patchFile.existsSync(); |
+ if (patchExists) { |
+ inputModifyTime = math.max(inputModifyTime, |
+ patchFile.lastModifiedSync().millisecondsSinceEpoch); |
+ } |
+ |
+ // Compute output paths |
+ outPaths = outPaths |
+ .map((p) => path.join(sdkOut, path.relative(p, from: sdkLibIn))) |
+ .toList(); |
+ |
+ // Compare output modify time with input modify time. |
+ bool needsUpdate = false; |
+ for (var outPath in outPaths) { |
+ var outFile = new File(outPath); |
+ if (!outFile.existsSync() || |
+ outFile.lastModifiedSync().millisecondsSinceEpoch < |
+ inputModifyTime) { |
+ needsUpdate = true; |
+ break; |
+ } |
} |
- for (var i = 0; i < paths.length; i++) { |
- var outPath = |
- path.join(sdkOut, path.relative(paths[i], from: sdkLibIn)); |
- _writeSync(outPath, contents[i]); |
+ |
+ if (needsUpdate) { |
+ var contents = <String>[libraryContents]; |
+ contents.addAll(partFiles.map((f) => f.readAsStringSync())); |
+ if (patchExists) { |
+ var patchContents = patchFile.readAsStringSync(); |
+ contents = _patchLibrary(contents, patchContents); |
+ } |
+ |
+ for (var i = 0; i < outPaths.length; i++) { |
+ _writeSync(outPaths[i], contents[i]); |
+ } |
} |
} |
} |