blob: f6622fafbc69a2734fa8630caffcd08c5660733c [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. 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:convert' show LineSplitter, utf8;
import 'dart:developer' as dev show NativeRuntime;
import 'dart:io';
import '../presubmit_helper.dart' show getChangedFiles;
import '../test/utils/io_utils.dart';
Future<void> main() async {
Uri executable = getDartExecutable();
final List<String> allChangedFiles = getChangedFiles();
if (allChangedFiles.isEmpty) {
print("No changes in CL.");
return;
}
final List<String> changedDartFiles = [];
for (String changedFile in allChangedFiles) {
if (changedFile.toLowerCase().endsWith(".dart")) {
changedDartFiles.add(changedFile);
}
}
if (changedDartFiles.isEmpty) {
print("No changed dart files in CL.");
return;
}
Process p = await Process.start(
executable.toFilePath(), ["format", ...changedDartFiles]);
p.stderr
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
stderr.writeln("stderr> $line");
});
p.stdout
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((String line) {
stdout.writeln("stdout> $line");
});
exitCode = await p.exitCode;
}
Uri getDartExecutable() {
Uri executable = Uri.base.resolve(Platform.resolvedExecutable);
if (executable == Platform.script || dev.NativeRuntime.buildId != null) {
// Probably aot compiled. We need to find "dart" another way.
bool found = false;
try {
final Uri repoDir = computeRepoDirUri();
for (String candidatePath in [
"out/ReleaseX64/dart",
"out/ReleaseX64/dart-sdk/bin/dart",
"out/ReleaseX64/dart.exe",
"out/ReleaseX64/dart-sdk/bin/dart.exe",
"xcodebuild/ReleaseX64/dart",
"xcodebuild/ReleaseX64/dart-sdk/bin/dart",
]) {
Uri candidate = repoDir.resolve(candidatePath);
if (File.fromUri(candidate).existsSync()) {
executable = candidate;
found = true;
break;
}
}
} catch (e) {
print("Warning: $e");
}
if (!found) {
Uri? candidate = where("dart");
if (candidate != null) {
executable = candidate;
} else {
throw "Couldn't find a dart executable to use.";
}
}
print("Using $executable");
}
return executable;
}
Uri? where(String needle) {
String pathEnvironment = Platform.environment["PATH"] ?? '';
List<String> paths;
if (Platform.isWindows) {
paths = pathEnvironment.split(";");
} else {
paths = pathEnvironment.split(":");
}
// This isn't great but will probably work for our purposes.
List<String> extensions = ["", ".exe", ".bat", ".com"];
for (String path in paths) {
for (String extension in extensions) {
File f = new File("$path${Platform.pathSeparator}$needle$extension");
if (f.existsSync()) {
return f.uri;
}
}
}
return null;
}