project_migrator.dart 2.49 KB
Newer Older
1 2 3 4 5 6
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:meta/meta.dart';

7 8
import 'file_system.dart';
import 'logger.dart';
9

10 11
/// Project is generated from a template on Flutter project creation.
/// Sometimes (due to behavior changes in Xcode, Gradle, etc) these files need to be altered
12
/// from the original template.
13 14
abstract class ProjectMigrator {
  ProjectMigrator(this.logger);
15 16 17 18

  @protected
  final Logger logger;

19
  void migrate();
20 21

  /// Return null if the line should be deleted.
22
  @protected
23
  String? migrateLine(String line) {
24 25
    return line;
  }
26 27

  @protected
28 29 30 31
  String migrateFileContents(String fileContents) {
    return fileContents;
  }

32 33 34 35
  @protected
  bool get migrationRequired => _migrationRequired;
  bool _migrationRequired = false;

36 37 38
  @protected
  /// Calls [migrateLine] per line, then [migrateFileContents]
  /// including the line migrations.
39
  void processFileLines(File file) {
40 41 42 43 44 45
    final List<String> lines = file.readAsLinesSync();

    final StringBuffer newProjectContents = StringBuffer();
    final String basename = file.basename;

    for (final String line in lines) {
46
      final String? newProjectLine = migrateLine(line);
47 48 49
      if (newProjectLine == null) {
        logger.printTrace('Migrating $basename, removing:');
        logger.printTrace('    $line');
50
        _migrationRequired = true;
51 52 53 54 55 56 57
        continue;
      }
      if (newProjectLine != line) {
        logger.printTrace('Migrating $basename, replacing:');
        logger.printTrace('    $line');
        logger.printTrace('with:');
        logger.printTrace('    $newProjectLine');
58
        _migrationRequired = true;
59 60 61 62
      }
      newProjectContents.writeln(newProjectLine);
    }

63 64 65 66
    final String projectContentsWithMigratedLines = newProjectContents.toString();
    final String projectContentsWithMigratedContents = migrateFileContents(projectContentsWithMigratedLines);
    if (projectContentsWithMigratedLines != projectContentsWithMigratedContents) {
      logger.printTrace('Migrating $basename contents');
67
      _migrationRequired = true;
68 69
    }

70 71
    if (migrationRequired) {
      logger.printStatus('Upgrading $basename');
72
      file.writeAsStringSync(projectContentsWithMigratedContents);
73 74 75
    }
  }
}
76

77 78
class ProjectMigration {
  ProjectMigration(this.migrators);
79

80
  final List<ProjectMigrator> migrators;
81

82
  void run() {
83
    for (final ProjectMigrator migrator in migrators) {
84
      migrator.migrate();
85 86 87
    }
  }
}