flutter/dev/tools/find_engine_commit.dart
Michael Goderbauer 5491c8c146
Auto-format Framework (#160545)
This auto-formats all *.dart files in the repository outside of the
`engine` subdirectory and enforces that these files stay formatted with
a presubmit check.

**Reviewers:** Please carefully review all the commits except for the
one titled "formatted". The "formatted" commit was auto-generated by
running `dev/tools/format.sh -a -f`. The other commits were hand-crafted
to prepare the repo for the formatting change. I recommend reviewing the
commits one-by-one via the "Commits" tab and avoiding Github's "Files
changed" tab as it will likely slow down your browser because of the
size of this PR.

---------

Co-authored-by: Kate Lovett <katelovett@google.com>
Co-authored-by: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com>
2024-12-19 20:06:21 +00:00

121 lines
3.5 KiB
Dart

// 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 'dart:io';
void _validate(List<String> args) {
bool errors = false;
if (!File('bin/internal/engine.version').existsSync()) {
errors = true;
print('This program must be run from the root of your flutter repository.');
}
if (!File('../engine/src/flutter/DEPS').existsSync()) {
errors = true;
print(
'This program assumes the engine directory is a sibling to the flutter repository directory.',
);
}
if (args.length != 1) {
errors = true;
print('This program takes the engine revision as a single argument.');
}
if (errors) {
exit(-1);
}
}
const String engineRepo = '../engine/src/flutter';
Future<void> main(List<String> args) async {
_validate(args);
await _fetchUpstream();
await _fetchUpstream(engineRepo);
String? flutterRevision;
await for (final FlutterEngineRevision revision in _logEngineVersions()) {
if (!await containsRevision(args[0], revision.engineRevision)) {
if (flutterRevision == null) {
print('Revision not found.');
exit(-1);
}
print('earliest revision: $flutterRevision');
print('Tags that contain this engine revision:');
print(await _tagsForRevision(flutterRevision));
exit(0);
}
flutterRevision = revision.flutterRevision;
}
}
Future<void> _fetchUpstream([String workingDirectory = '.']) async {
print(
'Fetching remotes for "$workingDirectory" - you may be prompted for SSH credentials by git.',
);
final ProcessResult fetchResult = await Process.run('git', <String>[
'fetch',
'--all',
], workingDirectory: workingDirectory);
if (fetchResult.exitCode != 0) {
throw Exception('Failed to fetch upstream in repository $workingDirectory');
}
}
Future<String> _tagsForRevision(String flutterRevision) async {
final ProcessResult tagResult = await Process.run('git', <String>[
'tag',
'--contains',
flutterRevision,
]);
return tagResult.stdout as String;
}
Future<bool> containsRevision(String ancestorRevision, String revision) async {
final ProcessResult result = await Process.run('git', <String>[
'merge-base',
'--is-ancestor',
ancestorRevision,
revision,
], workingDirectory: engineRepo);
return result.exitCode == 0;
}
Stream<FlutterEngineRevision> _logEngineVersions() async* {
final ProcessResult result = await Process.run('git', <String>[
'log',
'--oneline',
'-p',
'--',
'bin/internal/engine.version',
]);
if (result.exitCode != 0) {
print(result.stderr);
throw Exception('Failed to log bin/internal/engine.version');
}
final List<String> lines = (result.stdout as String).split('\n');
int index = 0;
while (index < lines.length - 1) {
final String flutterRevision = lines[index].split(' ').first;
index += 1;
while (!lines[index].startsWith('+') || lines[index].startsWith('+++')) {
index += 1;
}
if (index >= lines.length) {
break;
}
final String engineRevision = lines[index].substring(1);
yield FlutterEngineRevision(flutterRevision, engineRevision);
index += lines[index + 1].startsWith(r'\ ') ? 2 : 1;
}
}
class FlutterEngineRevision {
const FlutterEngineRevision(this.flutterRevision, this.engineRevision);
final String flutterRevision;
final String engineRevision;
@override
String toString() => '$flutterRevision: $engineRevision';
}