|
8 | 8 | library dev_compiler.tool.patch_sdk;
|
9 | 9 |
|
10 | 10 | import 'dart:io';
|
| 11 | +import 'dart:math' as math; |
11 | 12 |
|
12 | 13 | import 'package:analyzer/analyzer.dart';
|
13 | 14 | import 'package:analyzer/src/generated/sdk.dart';
|
@@ -72,32 +73,63 @@ void main(List<String> argv) {
|
72 | 73 |
|
73 | 74 | var libraryFile = new File(libraryIn);
|
74 | 75 | if (libraryFile.existsSync()) {
|
75 |
| - var contents = <String>[]; |
76 |
| - var paths = <String>[]; |
| 76 | + var outPaths = <String>[libraryOut]; |
77 | 77 | var libraryContents = libraryFile.readAsStringSync();
|
78 |
| - paths.add(libraryOut); |
79 |
| - contents.add(libraryContents); |
| 78 | + |
| 79 | + int inputModifyTime = |
| 80 | + libraryFile.lastModifiedSync().millisecondsSinceEpoch; |
| 81 | + var partFiles = <File>[]; |
80 | 82 | for (var part in parseDirectives(libraryContents).directives) {
|
81 | 83 | if (part is PartDirective) {
|
82 | 84 | var partPath = part.uri.stringValue;
|
83 |
| - paths.add(path.join(path.dirname(libraryOut), partPath)); |
84 |
| - contents.add(new File(path.join(path.dirname(libraryIn), partPath)) |
85 |
| - .readAsStringSync()); |
| 85 | + outPaths.add(path.join(path.dirname(libraryOut), partPath)); |
| 86 | + |
| 87 | + var partFile = new File(path.join(path.dirname(libraryIn), partPath)); |
| 88 | + partFiles.add(partFile); |
| 89 | + inputModifyTime = math.max(inputModifyTime, |
| 90 | + partFile.lastModifiedSync().millisecondsSinceEpoch); |
86 | 91 | }
|
87 | 92 | }
|
88 | 93 |
|
89 | 94 | // See if we can find a patch file.
|
90 | 95 | var patchPath = path.join(
|
91 | 96 | patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
|
92 | 97 |
|
93 |
| - if (new File(patchPath).existsSync()) { |
94 |
| - var patchContents = new File(patchPath).readAsStringSync(); |
95 |
| - contents = _patchLibrary(contents, patchContents); |
| 98 | + var patchFile = new File(patchPath); |
| 99 | + bool patchExists = patchFile.existsSync(); |
| 100 | + if (patchExists) { |
| 101 | + inputModifyTime = math.max(inputModifyTime, |
| 102 | + patchFile.lastModifiedSync().millisecondsSinceEpoch); |
| 103 | + } |
| 104 | + |
| 105 | + // Compute output paths |
| 106 | + outPaths = outPaths |
| 107 | + .map((p) => path.join(sdkOut, path.relative(p, from: sdkLibIn))) |
| 108 | + .toList(); |
| 109 | + |
| 110 | + // Compare output modify time with input modify time. |
| 111 | + bool needsUpdate = false; |
| 112 | + for (var outPath in outPaths) { |
| 113 | + var outFile = new File(outPath); |
| 114 | + if (!outFile.existsSync() || |
| 115 | + outFile.lastModifiedSync().millisecondsSinceEpoch < |
| 116 | + inputModifyTime) { |
| 117 | + needsUpdate = true; |
| 118 | + break; |
| 119 | + } |
96 | 120 | }
|
97 |
| - for (var i = 0; i < paths.length; i++) { |
98 |
| - var outPath = |
99 |
| - path.join(sdkOut, path.relative(paths[i], from: sdkLibIn)); |
100 |
| - _writeSync(outPath, contents[i]); |
| 121 | + |
| 122 | + if (needsUpdate) { |
| 123 | + var contents = <String>[libraryContents]; |
| 124 | + contents.addAll(partFiles.map((f) => f.readAsStringSync())); |
| 125 | + if (patchExists) { |
| 126 | + var patchContents = patchFile.readAsStringSync(); |
| 127 | + contents = _patchLibrary(contents, patchContents); |
| 128 | + } |
| 129 | + |
| 130 | + for (var i = 0; i < outPaths.length; i++) { |
| 131 | + _writeSync(outPaths[i], contents[i]); |
| 132 | + } |
101 | 133 | }
|
102 | 134 | }
|
103 | 135 | }
|
|
0 commit comments