diff --git a/.ci.yaml b/.ci.yaml index 0a51da5a3a9..78b22e1e4d3 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -243,8 +243,6 @@ targets: - name: Linux packages_autoroller presubmit: false - # TODO(fujino): https://github.com/flutter/flutter/issues/129744 - bringup: true recipe: pub_autoroller/pub_autoroller timeout: 30 enabled_branches: diff --git a/dev/conductor/core/bin/packages_autoroller.dart b/dev/conductor/core/bin/packages_autoroller.dart index 6cb35b2cf87..a890927f0a6 100644 --- a/dev/conductor/core/bin/packages_autoroller.dart +++ b/dev/conductor/core/bin/packages_autoroller.dart @@ -80,7 +80,7 @@ ${parser.usage} } final FrameworkRepository framework = FrameworkRepository( - _localCheckouts, + _localCheckouts(token), mirrorRemote: Remote.mirror(mirrorUrl), upstreamRemote: Remote.upstream(upstreamUrl), ); @@ -106,7 +106,7 @@ String _parseOrgName(String remoteUrl) { return match.group(1)!; } -Checkouts get _localCheckouts { +Checkouts _localCheckouts(String token) { const FileSystem fileSystem = LocalFileSystem(); const ProcessManager processManager = LocalProcessManager(); const Platform platform = LocalPlatform(); @@ -114,6 +114,7 @@ Checkouts get _localCheckouts { stdout: io.stdout, stderr: io.stderr, stdin: io.stdin, + filter: (String message) => message.replaceAll(token, '[GitHub TOKEN]'), ); return Checkouts( fileSystem: fileSystem, diff --git a/dev/conductor/core/lib/src/stdio.dart b/dev/conductor/core/lib/src/stdio.dart index 8777b91f405..df8f81d0564 100644 --- a/dev/conductor/core/lib/src/stdio.dart +++ b/dev/conductor/core/lib/src/stdio.dart @@ -70,6 +70,7 @@ class VerboseStdio extends Stdio { required this.stdout, required this.stderr, required this.stdin, + this.filter, }); factory VerboseStdio.local() => VerboseStdio( @@ -82,26 +83,50 @@ class VerboseStdio extends Stdio { final io.Stdout stderr; final io.Stdin stdin; + /// If provided, all messages will be passed through this function before being logged. + final String Function(String)? filter; + @override void printError(String message) { + if (filter != null) { + message = filter!(message); + } super.printError(message); stderr.writeln(message); } + @override + void printWarning(String message) { + if (filter != null) { + message = filter!(message); + } + super.printWarning(message); + stderr.writeln(message); + } + @override void printStatus(String message) { + if (filter != null) { + message = filter!(message); + } super.printStatus(message); stdout.writeln(message); } @override void printTrace(String message) { + if (filter != null) { + message = filter!(message); + } super.printTrace(message); stdout.writeln(message); } @override void write(String message) { + if (filter != null) { + message = filter!(message); + } super.write(message); stdout.write(message); } diff --git a/dev/conductor/core/test/common.dart b/dev/conductor/core/test/common.dart index 9cf66ffdfe3..f1a2f399992 100644 --- a/dev/conductor/core/test/common.dart +++ b/dev/conductor/core/test/common.dart @@ -6,6 +6,7 @@ import 'package:args/args.dart'; import 'package:conductor_core/src/stdio.dart'; import 'package:test/test.dart'; +export 'package:test/fake.dart'; export 'package:test/test.dart' hide isInstanceOf; export '../../../../packages/flutter_tools/test/src/fake_process_manager.dart'; diff --git a/dev/conductor/core/test/next_test.dart b/dev/conductor/core/test/next_test.dart index f124aa24178..dee3a2e567b 100644 --- a/dev/conductor/core/test/next_test.dart +++ b/dev/conductor/core/test/next_test.dart @@ -1227,34 +1227,10 @@ void main() { } /// A [Stdio] that will throw an exception if any of its methods are called. -class _UnimplementedStdio implements Stdio { - const _UnimplementedStdio(); +class _UnimplementedStdio extends Fake implements Stdio { + _UnimplementedStdio(); - static const _UnimplementedStdio _instance = _UnimplementedStdio(); - static _UnimplementedStdio get instance => _instance; - - Never _throw() => throw Exception('Unimplemented!'); - - @override - List get logs => _throw(); - - @override - void printError(String message) => _throw(); - - @override - void printWarning(String message) => _throw(); - - @override - void printStatus(String message) => _throw(); - - @override - void printTrace(String message) => _throw(); - - @override - void write(String message) => _throw(); - - @override - String readLineSync() => _throw(); + static final _UnimplementedStdio instance = _UnimplementedStdio(); } class _TestRepository extends Repository { diff --git a/dev/conductor/core/test/packages_autoroller_test.dart b/dev/conductor/core/test/packages_autoroller_test.dart index 50e21a1aee5..9ce7a282a6c 100644 --- a/dev/conductor/core/test/packages_autoroller_test.dart +++ b/dev/conductor/core/test/packages_autoroller_test.dart @@ -512,4 +512,35 @@ void main() { expect(processManager, hasNoRemainingExpectations); }); }); + + test('VerboseStdio logger can filter out confidential pattern', () async { + const String token = 'secret'; + const String replacement = 'replacement'; + final VerboseStdio stdio = VerboseStdio( + stdin: _NoOpStdin(), + stderr: _NoOpStdout(), + stdout: _NoOpStdout(), + filter: (String msg) => msg.replaceAll(token, replacement), + ); + stdio.printStatus('Hello'); + expect(stdio.logs.last, '[status] Hello'); + + stdio.printStatus('Using $token'); + expect(stdio.logs.last, '[status] Using $replacement'); + + stdio.printWarning('Using $token'); + expect(stdio.logs.last, '[warning] Using $replacement'); + + stdio.printError('Using $token'); + expect(stdio.logs.last, '[error] Using $replacement'); + + stdio.printTrace('Using $token'); + expect(stdio.logs.last, '[trace] Using $replacement'); + }); +} + +class _NoOpStdin extends Fake implements io.Stdin {} +class _NoOpStdout extends Fake implements io.Stdout { + @override + void writeln([Object? object]) {} }