touchups on the scripts

This commit is contained in:
Nate Anderson 2025-02-06 17:36:53 -07:00
parent fdc49bcb8d
commit 22b13b9720
4 changed files with 79 additions and 40 deletions

View File

@ -28,8 +28,8 @@ dev_dependencies:
very_good_analysis: ^5.1.0
scripts:
run_build: dart scripts/run_build_runner.dart
run_watch: dart scripts/run_build_runner.dart --watch
runner_build: dart scripts/run_build_runner.dart
runner_watch: dart scripts/run_build_runner.dart --watch
build: dart_frog build
dev: dart_frog dev
e2e: dart scripts/test_runner.dart

View File

@ -54,20 +54,23 @@ void main(List<String> args) async {
Future<void> runBuildRunner(String packagePath, {required bool watch}) async {
final package = packagePath.split('/').last;
print('📦 Starting build_runner for $package...');
Future<(Process, bool)> buildRunnerFunc() => watch ? _runBuildRunnerWatch(packagePath) : _runBuildRunner(packagePath);
Future<(Process, bool, String)> buildRunnerFunc() =>
watch ? _runBuildRunnerWatch(packagePath) : _runBuildRunner(packagePath);
const maxAttempts = 5;
Future<void> attemptRecover(Object? e, int i) async {
try {
print('\n⚠️ Error in $package:\n$e\nAttempting recovery (${i + 1} / $maxAttempts)...\n');
print('\n⚠️ Error in $package:\n$e🤞 Attempting recovery (${i + 1} / $maxAttempts)...');
print(' Waiting 10 seconds before retry...');
await Future<void>.delayed(const Duration(seconds: 1));
await Future<void>.delayed(const Duration(seconds: 10));
// Recovery attempt
print(' Running pub get...');
final cmd = package == 'frontend' ? 'flutter' : 'dart';
print('📥 Running $cmd pub get...');
await Process.run(
package == 'frontend' ? 'flutter' : 'dart',
cmd,
['pub', 'get'],
workingDirectory: packagePath,
);
@ -82,11 +85,11 @@ Future<void> runBuildRunner(String packagePath, {required bool watch}) async {
Object? err;
for (var i = 0; i < maxAttempts; i++) {
try {
final (process, needsRestart) = await buildRunnerFunc();
final (process, needsRestart, errLogs) = await buildRunnerFunc();
final removed = runnerWatchProcesses.remove(process.pid);
assert(removed != null, true);
if (needsRestart) {
await attemptRecover(process.stderr, i);
await attemptRecover(errLogs, i);
} else {
return;
}
@ -98,12 +101,21 @@ Future<void> runBuildRunner(String packagePath, {required bool watch}) async {
exitRunners();
}
Future<(Process, bool)> _runBuildRunner(String package) async {
final process = await Process.start(
'dart',
['run', 'build_runner', 'build', '--delete-conflicting-outputs'],
workingDirectory: package,
);
Future<(Process, bool, String)> _runBuildRunner(String package) async {
late final Process process;
if (package == 'frontend') {
process = await Process.start(
'flutter',
['pub', 'run', 'build_runner', 'build', '--delete-conflicting-outputs'],
workingDirectory: package,
);
} else {
process = await Process.start(
'dart',
['run', 'build_runner', 'build', '--delete-conflicting-outputs'],
workingDirectory: package,
);
}
runnerWatchProcesses.addAll({process.pid: process});
@ -123,7 +135,7 @@ Future<(Process, bool)> _runBuildRunner(String package) async {
.join('\n');
print('Build runner failed for $package:\n$relevantErrors');
return (process, true);
return (process, true, '');
}
// Print success with minimal output
@ -131,16 +143,26 @@ Future<(Process, bool)> _runBuildRunner(String package) async {
outputLines.where((line) => line.contains('Succeeded') || line.contains('Generated')).join('\n').trim();
print(' ${successMessage.isEmpty ? "Completed successfully" : successMessage}');
return (process, false);
return (process, false, '');
}
Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async {
Future<(Process, bool, String)> _runBuildRunnerWatch(String packagePath) async {
final package = packagePath.split('/').last;
final process = await Process.start(
'dart',
['run', 'build_runner', 'watch', '--delete-conflicting-outputs'],
workingDirectory: packagePath,
);
late final Process process;
if (package == 'frontend') {
process = await Process.start(
'flutter',
['pub', 'run', 'build_runner', 'watch', '--delete-conflicting-outputs'],
workingDirectory: packagePath,
);
} else {
process = await Process.start(
'dart',
['run', 'build_runner', 'watch', '--delete-conflicting-outputs'],
workingDirectory: packagePath,
);
}
final logs = <String>[];
runnerWatchProcesses.addAll({process.pid: process});
@ -153,6 +175,7 @@ Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async {
print('🚩 [${package.toUpperCase()}] - ${line.trim()}');
restart = true;
}
logs.add(line);
});
process.stderr.transform(const SystemEncoding().decoder).listen((line) {
@ -160,13 +183,14 @@ Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async {
print('🎯 [${package.toUpperCase()}] - ${line.trim()}');
restart = true;
}
logs.add(line);
});
final code = await process.exitCode;
if (!restart) {
restart = code != 0;
}
return (process, restart);
return (process, restart, logs.join('\n'));
}
void exitRunners() {

View File

@ -9,24 +9,45 @@ void main() async {
final backendPath = '$projectRootPath/backend';
// Start the server
print('Starting Dart Frog server...');
print('🐸 Building Dart Frog server...');
final build = await Process.start(
'dart_frog',
['build'],
workingDirectory: backendPath,
mode: ProcessStartMode.inheritStdio,
);
List<String> serverLogs = [];
if (await build.exitCode != 0) {
stdout.writeln('💀 Failed to build backend:');
for (final element in [build.stdout, build.stderr]) {
element
..transform(const SystemEncoding().decoder)
..listen((line) => stdout.write(line));
}
stdout.writeln();
exit(1);
}
final serverLogs = <String>[];
final server = await Process.start('dart', ['build/bin/server.dart'], workingDirectory: backendPath);
server.stdout.transform(const SystemEncoding().decoder).listen((line) => serverLogs.add(line));
server.stderr.transform(const SystemEncoding().decoder).listen((line) => serverLogs.add(line));
server.stdout.transform(const SystemEncoding().decoder).listen(serverLogs.add);
server.stderr.transform(const SystemEncoding().decoder).listen(serverLogs.add);
unawaited(
server.exitCode.then((code) async {
if (code != 0) {
stdout
..writeln('💀 Failed to run backend:\n')
..write(serverLogs.join('\n'));
exit(1);
}
}),
);
// Wait for server to be ready
print('Waiting for server to be ready...');
print('⏲️ Waiting for server to be ready...');
await _waitForServer();
print('Running tests...');
print('🤞 Running tests...');
try {
// Run the tests
final testResult = await Process.run('dart', ['test', '$backendPath/test_e2e/tests/']);
@ -39,12 +60,14 @@ void main() async {
if (testResult.exitCode != 0) {
final sub = serverLogs.length > 10 ? serverLogs.length - 10 : 0;
stdout.write("Server logs:\n${serverLogs.sublist(sub).join('\n')}");
} else {
stdout.writeln("💨 Passed like a light breeze 😮‍💨");
}
// Exit with the same code as the test process
exit(testResult.exitCode);
} catch (e) {
print('Error running tests: $e');
print('💩 Error running tests 💩: $e');
build.kill();
server.kill();

View File

@ -320,14 +320,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.3.0"
http:
dependency: transitive
description:
name: http
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.3.0"
http_multi_server:
dependency: transitive
description: