| Index: tools/migration/bin/migrate_batch.dart
|
| diff --git a/tools/migration/bin/migrate_batch.dart b/tools/migration/bin/migrate_batch.dart
|
| index 43fe1c0d4a42cf2aa703f6583130858a96bbfe0f..4b23fe0a30c9723af30f12f861169f027b5c8d03 100644
|
| --- a/tools/migration/bin/migrate_batch.dart
|
| +++ b/tools/migration/bin/migrate_batch.dart
|
| @@ -13,6 +13,7 @@ import 'dart:io';
|
| import 'package:path/path.dart' as p;
|
|
|
| import 'package:migration/src/log.dart';
|
| +import 'package:migration/src/validate.dart';
|
| import 'package:status_file/status_file.dart';
|
|
|
| const simpleDirs = const ["corelib", "language", "lib"];
|
| @@ -64,7 +65,7 @@ void main(List<String> arguments) {
|
| }
|
|
|
| if ((endIndex - startIndex) == 0) {
|
| - print(bold("No tests to migrate."));
|
| + print(bold("No tests in range."));
|
| return;
|
| }
|
|
|
| @@ -72,20 +73,33 @@ void main(List<String> arguments) {
|
| "to ${bold(last)}...");
|
| print("");
|
|
|
| - tests = tests.getRange(startIndex, endIndex);
|
| - var todos = <String>[];
|
| + var allTodos = <String, List<String>>{};
|
| + tests = tests.sublist(startIndex, endIndex);
|
| var migratedTests = 0;
|
| var unmigratedTests = 0;
|
| for (var test in tests) {
|
| - if (test.migrate(todos)) {
|
| + var todos = test.migrate();
|
| + if (todos.isEmpty) {
|
| migratedTests++;
|
| } else {
|
| unmigratedTests++;
|
| + allTodos[test.twoPath] = todos;
|
| }
|
| }
|
|
|
| - print("");
|
| + // Print status file entries.
|
| + var statusFileEntries = new StringBuffer();
|
| + var statusFiles = loadStatusFiles();
|
| + for (var statusFile in statusFiles) {
|
| + printStatusFileEntries(statusFileEntries, tests, statusFile);
|
| + }
|
|
|
| + new File("statuses.migration")
|
| + .writeAsStringSync(statusFileEntries.toString());
|
| + print("Wrote relevant test status file entries to 'statuses.migration'.");
|
| +
|
| + // Tell the user what's left TODO.
|
| + print("");
|
| var summary = "";
|
|
|
| if (migratedTests > 0) {
|
| @@ -94,24 +108,17 @@ void main(List<String> arguments) {
|
| }
|
|
|
| if (unmigratedTests > 0) {
|
| - var s = migratedTests == 1 ? "" : "s";
|
| + var s = unmigratedTests == 1 ? "" : "s";
|
| summary += "Need manual work on ${red(unmigratedTests)} test$s:";
|
| }
|
|
|
| print(summary);
|
| - todos.forEach(todo);
|
| -
|
| - // Print status file entries.
|
| - var statusFileEntries = new StringBuffer();
|
| - var statusFiles = loadStatusFiles();
|
| - for (var statusFile in statusFiles) {
|
| - printStatusFileEntries(statusFileEntries, tests, statusFile);
|
| + var todoTests = allTodos.keys.toList();
|
| + todoTests.sort();
|
| + for (var todoTest in todoTests) {
|
| + print("- ${bold(todoTest)}:");
|
| + allTodos[todoTest].forEach(todo);
|
| }
|
| -
|
| - new File("statuses.migration")
|
| - .writeAsStringSync(statusFileEntries.toString());
|
| - print(
|
| - bold("Wrote relevant test status file entries to 'statuses.migration'"));
|
| }
|
|
|
| /// Returns a [String] of the relevant status file entries associated with the
|
| @@ -148,7 +155,9 @@ void printStatusFileEntries(
|
| String toTwoPath(String path) {
|
| // Allow eliding "_test" and/or ".dart" to make things more command-line
|
| // friendly.
|
| - if (!path.endsWith("_test.dart")) path += "_test.dart";
|
| + if (!path.endsWith(".dart") && !path.endsWith("_test.dart")) {
|
| + path += "_test.dart";
|
| + }
|
| if (!path.endsWith(".dart")) path += ".dart";
|
|
|
| for (var dir in simpleDirs) {
|
| @@ -183,10 +192,11 @@ List<Fork> scanTests() {
|
| addTestDirectory(String fromDir, String twoDir) {
|
| for (var entry
|
| in new Directory(p.join(testRoot, fromDir)).listSync(recursive: true)) {
|
| - if (!entry.path.endsWith("_test.dart")) continue;
|
| + if (!entry.path.endsWith(".dart")) continue;
|
|
|
| var fromPath = p.relative(entry.path, from: testRoot);
|
| var twoPath = p.join(twoDir, p.relative(fromPath, from: fromDir));
|
| +
|
| var fork = tests.putIfAbsent(twoPath, () => new Fork(twoPath));
|
| if (fromDir.contains("_strong")) {
|
| fork.strongPath = fromPath;
|
| @@ -241,6 +251,9 @@ void moveFile(String from, String to) {
|
| return;
|
| }
|
|
|
| + // Create the directory if needed.
|
| + new Directory(p.dirname(p.join(testRoot, to))).createSync(recursive: true);
|
| +
|
| new File(p.join(testRoot, from)).renameSync(p.join(testRoot, to));
|
| }
|
|
|
| @@ -260,13 +273,6 @@ void deleteFile(String path) {
|
| new File(p.join(testRoot, path)).deleteSync();
|
| }
|
|
|
| -bool checkForUnitTest(String path, String source) {
|
| - if (!source.contains("package:unittest")) return false;
|
| -
|
| - note("${bold(path)} uses unittest package.");
|
| - return true;
|
| -}
|
| -
|
| class Fork {
|
| final String twoPath;
|
| String onePath;
|
| @@ -298,10 +304,10 @@ class Fork {
|
|
|
| Fork(this.twoPath);
|
|
|
| - bool migrate(List<String> todos) {
|
| + List<String> migrate() {
|
| print("- ${bold(twoPath)}:");
|
|
|
| - var todosBefore = todos.length;
|
| + var todos = <String>[];
|
| var isMigrated = new File(p.join(testRoot, twoPath)).existsSync();
|
|
|
| // If there is a migrated version and it's the same as an unmigrated one,
|
| @@ -314,8 +320,8 @@ class Fork {
|
| } else {
|
| note("${bold(onePath)} does not match already-migrated "
|
| "${bold(twoPath)}.");
|
| - todos.add("Merge ${bold(onePath)} into ${bold(twoPath)}.");
|
| - checkForUnitTest(onePath, oneSource);
|
| + todos.add("Merge from ${bold(onePath)} into this file.");
|
| + validateFile(onePath, oneSource);
|
| }
|
| }
|
|
|
| @@ -326,8 +332,8 @@ class Fork {
|
| } else {
|
| note("${bold(strongPath)} does not match already-migrated "
|
| "${bold(twoPath)}.");
|
| - todos.add("Merge ${bold(strongPath)} into ${bold(twoPath)}.");
|
| - checkForUnitTest(strongPath, strongSource);
|
| + todos.add("Merge from ${bold(strongPath)} into this file.");
|
| + validateFile(strongPath, strongSource);
|
| }
|
| }
|
| } else {
|
| @@ -343,20 +349,19 @@ class Fork {
|
| moveFile(onePath, twoPath);
|
| deleteFile(strongPath);
|
| done("Merged identical forks.");
|
| - checkForUnitTest(twoPath, oneSource);
|
| + validateFile(twoPath, oneSource);
|
| } else {
|
| // Otherwise, a manual merge is required. Start with the strong one.
|
| + print(new File(strongPath).existsSync());
|
| moveFile(strongPath, twoPath);
|
| done("Moved strong fork, kept 1.0 fork, manual merge required.");
|
| - todos.add("Merge ${bold(onePath)} into ${bold(twoPath)}.");
|
| - checkForUnitTest(onePath, oneSource);
|
| + todos.add("Merge from ${bold(onePath)} into this file.");
|
| + validateFile(onePath, oneSource);
|
| }
|
| }
|
|
|
| - if (checkForUnitTest(twoPath, twoSource)) {
|
| - todos.add("Migrate ${bold(twoPath)} off unittest.");
|
| - }
|
| + validateFile(twoPath, twoSource, todos);
|
|
|
| - return todos.length == todosBefore;
|
| + return todos;
|
| }
|
| }
|
|
|