| 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 /// Given the beginning and ending file names in a batch, does as much automated | 5 /// Given the beginning and ending file names in a batch, does as much automated |
| 6 /// migration and possible and prints out the remaining manual steps required. | 6 /// migration and possible and prints out the remaining manual steps required. |
| 7 /// | 7 /// |
| 8 /// This should be safe to run, and safe to re-run on an in-progress chunk. | 8 /// This should be safe to run, and safe to re-run on an in-progress chunk. |
| 9 /// However, it has not been thoroughly tested, so run at your own risk. | 9 /// However, it has not been thoroughly tested, so run at your own risk. |
| 10 | 10 |
| 11 import 'dart:io'; | 11 import 'dart:io'; |
| 12 | 12 |
| 13 import 'package:path/path.dart' as p; | |
| 14 | |
| 15 import 'package:migration/src/fork.dart'; | 13 import 'package:migration/src/fork.dart'; |
| 16 import 'package:migration/src/io.dart'; | 14 import 'package:migration/src/io.dart'; |
| 17 import 'package:migration/src/log.dart'; | 15 import 'package:migration/src/log.dart'; |
| 18 import 'package:migration/src/migrate_statuses.dart'; | 16 import 'package:migration/src/migrate_statuses.dart'; |
| 19 import 'package:migration/src/test_directories.dart'; | |
| 20 | 17 |
| 21 const simpleDirs = const ["corelib", "language", "lib"]; | 18 const simpleDirs = const ["corelib", "language", "lib"]; |
| 22 | 19 |
| 23 void main(List<String> arguments) { | 20 void main(List<String> arguments) { |
| 24 if (arguments.contains("--dry-run")) { | 21 if (arguments.contains("--dry-run")) { |
| 25 dryRun = true; | 22 dryRun = true; |
| 26 arguments = arguments.where((argument) => argument != "--dry-run").toList(); | 23 arguments = arguments.where((argument) => argument != "--dry-run").toList(); |
| 27 } | 24 } |
| 28 | 25 |
| 29 if (arguments.length != 2) { | 26 if (arguments.length != 2) { |
| 30 stderr.writeln( | 27 stderr.writeln( |
| 31 "Usage: dart migrate_batch.dart [--dry-run] <first file> <last file>"); | 28 "Usage: dart migrate_batch.dart [--dry-run] <first file> <last file>"); |
| 32 stderr.writeln(); | 29 stderr.writeln(); |
| 33 stderr.writeln("Example:"); | 30 stderr.writeln("Example:"); |
| 34 stderr.writeln(); | 31 stderr.writeln(); |
| 35 stderr.writeln( | 32 stderr.writeln(" \$ dart migrate_batch.dart map_to_string queue"); |
| 36 " \$ dart migrate_batch.dart corelib/map_to_string corelib/queue"); | |
| 37 exit(1); | 33 exit(1); |
| 38 } | 34 } |
| 39 | 35 |
| 40 var tests = scanTests(); | 36 var tests = scanTests(); |
| 41 | 37 |
| 42 var startIndex = findFork(tests, arguments[0]); | 38 var startIndex = findFork(tests, arguments[0]); |
| 43 var endIndex = findFork(tests, arguments[1]); | 39 var endIndex = findFork(tests, arguments[1]); |
| 44 | 40 |
| 45 if (startIndex == null || endIndex == null) exit(1); | 41 if (startIndex == null || endIndex == null) exit(1); |
| 46 | 42 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 } | 84 } |
| 89 | 85 |
| 90 print(summary); | 86 print(summary); |
| 91 var todoTests = allTodos.keys.toList(); | 87 var todoTests = allTodos.keys.toList(); |
| 92 todoTests.sort(); | 88 todoTests.sort(); |
| 93 for (var todoTest in todoTests) { | 89 for (var todoTest in todoTests) { |
| 94 print("- ${bold(todoTest)}:"); | 90 print("- ${bold(todoTest)}:"); |
| 95 allTodos[todoTest].forEach(todo); | 91 allTodos[todoTest].forEach(todo); |
| 96 } | 92 } |
| 97 } | 93 } |
| 98 | |
| 99 int findFork(List<Fork> forks, String description) { | |
| 100 var matches = <int>[]; | |
| 101 | |
| 102 for (var i = 0; i < forks.length; i++) { | |
| 103 if (forks[i].twoPath.contains(description)) matches.add(i); | |
| 104 } | |
| 105 | |
| 106 if (matches.isEmpty) { | |
| 107 print('Could not find a test matching "${bold(description)}".'); | |
| 108 return null; | |
| 109 } else if (matches.length == 1) { | |
| 110 return matches.first; | |
| 111 } else { | |
| 112 print('Description "${bold(description)}" is ambiguous. Could be any of:'); | |
| 113 for (var i in matches) { | |
| 114 print("- ${forks[i].twoPath.replaceAll(description, bold(description))}"); | |
| 115 } | |
| 116 | |
| 117 print("Please use a more precise description."); | |
| 118 return null; | |
| 119 } | |
| 120 } | |
| 121 | |
| 122 /// Loads all of the unforked test files. | |
| 123 /// | |
| 124 /// Creates an list of [Fork]s, ordered by their destination paths. Handles | |
| 125 /// tests that only appear in one fork or the other, or both. | |
| 126 List<Fork> scanTests() { | |
| 127 var tests = <String, Fork>{}; | |
| 128 | |
| 129 for (var fromDir in fromRootDirs) { | |
| 130 var twoDir = toTwoDirectory(fromDir); | |
| 131 for (var path in listFiles(fromDir)) { | |
| 132 var fromPath = p.relative(path, from: testRoot); | |
| 133 var twoPath = p.join(twoDir, p.relative(fromPath, from: fromDir)); | |
| 134 | |
| 135 tests.putIfAbsent(twoPath, () => new Fork(twoPath)); | |
| 136 } | |
| 137 } | |
| 138 | |
| 139 // Include tests that have already been migrated too so we can show what | |
| 140 // works remains to be done in them. | |
| 141 for (var dir in twoRootDirs) { | |
| 142 for (var path in listFiles(dir)) { | |
| 143 var twoPath = p.relative(path, from: testRoot); | |
| 144 tests.putIfAbsent(twoPath, () => new Fork(twoPath)); | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 var sorted = tests.values.toList(); | |
| 149 sorted.sort((a, b) => a.twoPath.compareTo(b.twoPath)); | |
| 150 return sorted; | |
| 151 } | |
| OLD | NEW |