From 37671b5a5f38b8c4f3e1799e8a2077ac0a949a7b Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Tue, 14 Apr 2026 14:30:48 -0700 Subject: [PATCH 1/6] checkin --- .github/workflows/beta.yml | 64 ++++++++++--------- .../test/misc/animated_positioned_test.dart | 3 +- cupertino_gallery/lib/widgets/sheet_page.dart | 35 +++++----- .../Package.swift | 28 ++++++++ .../FlutterGeneratedPluginSwiftPackage.swift | 3 + .../Flutter/ephemeral/flutter_lldb_helper.py | 32 ++++++++++ .../ios/Flutter/ephemeral/flutter_lldbinit | 5 ++ .../.plugin_symlinks/url_launcher_linux | 1 + .../ephemeral/Flutter-Generated.xcconfig | 11 ++++ .../Package.swift | 28 ++++++++ .../FlutterGeneratedPluginSwiftPackage.swift | 3 + .../ephemeral/flutter_export_environment.sh | 12 ++++ .../.plugin_symlinks/url_launcher_windows | 1 + pubspec.yaml | 10 ++- tool/ci_script.dart | 43 ++++++++++++- 15 files changed, 229 insertions(+), 50 deletions(-) create mode 100644 gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift create mode 100644 gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift create mode 100644 gemini_tasks/ios/Flutter/ephemeral/flutter_lldb_helper.py create mode 100644 gemini_tasks/ios/Flutter/ephemeral/flutter_lldbinit create mode 120000 gemini_tasks/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux create mode 100644 gemini_tasks/macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100644 gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift create mode 100644 gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift create mode 100755 gemini_tasks/macos/Flutter/ephemeral/flutter_export_environment.sh create mode 120000 gemini_tasks/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index 2d441fed394..b93b1040d70 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -15,42 +15,44 @@ defaults: shell: bash jobs: + # TODO(ewindmill) -- Something with Beta branch and shaders is broken + # Test all samples on the beta channel. Since the beta channel will soon be # promoted to stable, this branch is only concerned with the beta. - Beta-CI: - name: Test flutter beta channel - runs-on: ${{ matrix.os }} - if: github.repository == 'flutter/samples' - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - with: - distribution: 'zulu' - java-version: '17' - - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - with: - channel: beta - - run: flutter pub get && dart tool/ci_script.dart + # Beta-CI: + # name: Test flutter beta channel + # runs-on: ${{ matrix.os }} + # if: github.repository == 'flutter/samples' + # strategy: + # fail-fast: false + # matrix: + # os: [ubuntu-latest, macos-latest, windows-latest] + # steps: + # - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + # - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 + # with: + # distribution: 'zulu' + # java-version: '17' + # - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 + # with: + # channel: beta + # - run: flutter pub get && dart tool/ci_script.dart # Verify the Android add-to-app samples build and pass tests with the beta # channel. - android-build: - runs-on: ubuntu-latest - if: github.repository == 'flutter/samples' - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - with: - distribution: 'zulu' - java-version: '17' - - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - with: - channel: beta - - run: ./tool/android_ci_script.sh + # android-build: + # runs-on: ubuntu-latest + # if: github.repository == 'flutter/samples' + # steps: + # - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + # - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 + # with: + # distribution: 'zulu' + # java-version: '17' + # - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 + # with: + # channel: beta + # - run: ./tool/android_ci_script.sh # Verify the iOS add-to-app samples build and pass tests with the beta # channel. diff --git a/animations/test/misc/animated_positioned_test.dart b/animations/test/misc/animated_positioned_test.dart index 69bbc305055..dc3e9b6a368 100644 --- a/animations/test/misc/animated_positioned_test.dart +++ b/animations/test/misc/animated_positioned_test.dart @@ -28,5 +28,6 @@ void main() { var newPosition = tester.getTopLeft(button); expect(newPosition, isNot(offsetMoreOrLessEquals(initialPosition))); }); - }); + // TODO: Exception: Asset 'shaders/ink_sparkle.frag' manifest could not be decoded: INVALID_ARGUMENT:Unsupported runtime stages format version. Expected 2, got 1. + }, skip: true); } diff --git a/cupertino_gallery/lib/widgets/sheet_page.dart b/cupertino_gallery/lib/widgets/sheet_page.dart index 1020135d67d..9d27c0bd209 100644 --- a/cupertino_gallery/lib/widgets/sheet_page.dart +++ b/cupertino_gallery/lib/widgets/sheet_page.dart @@ -13,22 +13,25 @@ class SheetPage extends StatelessWidget { onPressed: () { Navigator.of(context).push( CupertinoSheetRoute( - builder: (BuildContext context) { - return CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - middle: const Text('Sheet'), - trailing: GestureDetector( - child: const Icon(CupertinoIcons.xmark), - onTap: () { - Navigator.of(context).pop(); - }, - ), - ), - child: const Center( - child: Text('This is a sheet'), - ), - ); - }, + scrollableBuilder: + (BuildContext context, ScrollController controller) { + Widget widgetBuilder(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: const Text('Sheet'), + trailing: GestureDetector( + child: const Icon(CupertinoIcons.xmark), + onTap: () { + Navigator.of(context).pop(); + }, + ), + ), + child: const Center(child: Text('This is a sheet')), + ); + } + + return widgetBuilder(context); + }, ), ); }, diff --git a/gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift b/gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift new file mode 100644 index 00000000000..36cb990e0ee --- /dev/null +++ b/gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. +// +// Generated file. Do not edit. +// + +import PackageDescription + +let package = Package( + name: "FlutterGeneratedPluginSwiftPackage", + platforms: [ + .iOS("13.0") + ], + products: [ + .library(name: "FlutterGeneratedPluginSwiftPackage", type: .static, targets: ["FlutterGeneratedPluginSwiftPackage"]) + ], + dependencies: [ + .package(name: "url_launcher_ios", path: "../.packages/url_launcher_ios") + ], + targets: [ + .target( + name: "FlutterGeneratedPluginSwiftPackage", + dependencies: [ + .product(name: "url-launcher-ios", package: "url_launcher_ios") + ] + ) + ] +) diff --git a/gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift b/gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift new file mode 100644 index 00000000000..62e7b11aa92 --- /dev/null +++ b/gemini_tasks/ios/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift @@ -0,0 +1,3 @@ +// +// Generated file. Do not edit. +// diff --git a/gemini_tasks/ios/Flutter/ephemeral/flutter_lldb_helper.py b/gemini_tasks/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 00000000000..a88caf99df9 --- /dev/null +++ b/gemini_tasks/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/gemini_tasks/ios/Flutter/ephemeral/flutter_lldbinit b/gemini_tasks/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 00000000000..e3ba6fbedcd --- /dev/null +++ b/gemini_tasks/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/gemini_tasks/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux b/gemini_tasks/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux new file mode 120000 index 00000000000..7e6ea13b954 --- /dev/null +++ b/gemini_tasks/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux @@ -0,0 +1 @@ +/Users/ewindmill/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.1/ \ No newline at end of file diff --git a/gemini_tasks/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/gemini_tasks/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 00000000000..23fc2ae7c4b --- /dev/null +++ b/gemini_tasks/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/ewindmill/development/flutter +FLUTTER_APPLICATION_PATH=/Users/ewindmill/development/samples/gemini_tasks +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift b/gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift new file mode 100644 index 00000000000..970f29e87d1 --- /dev/null +++ b/gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Package.swift @@ -0,0 +1,28 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. +// +// Generated file. Do not edit. +// + +import PackageDescription + +let package = Package( + name: "FlutterGeneratedPluginSwiftPackage", + platforms: [ + .macOS("10.15") + ], + products: [ + .library(name: "FlutterGeneratedPluginSwiftPackage", type: .static, targets: ["FlutterGeneratedPluginSwiftPackage"]) + ], + dependencies: [ + .package(name: "url_launcher_macos", path: "../.packages/url_launcher_macos") + ], + targets: [ + .target( + name: "FlutterGeneratedPluginSwiftPackage", + dependencies: [ + .product(name: "url-launcher-macos", package: "url_launcher_macos") + ] + ) + ] +) diff --git a/gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift b/gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift new file mode 100644 index 00000000000..62e7b11aa92 --- /dev/null +++ b/gemini_tasks/macos/Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage/Sources/FlutterGeneratedPluginSwiftPackage/FlutterGeneratedPluginSwiftPackage.swift @@ -0,0 +1,3 @@ +// +// Generated file. Do not edit. +// diff --git a/gemini_tasks/macos/Flutter/ephemeral/flutter_export_environment.sh b/gemini_tasks/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 00000000000..b1414fafb7d --- /dev/null +++ b/gemini_tasks/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/ewindmill/development/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/ewindmill/development/samples/gemini_tasks" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/gemini_tasks/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows b/gemini_tasks/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows new file mode 120000 index 00000000000..211d895d34e --- /dev/null +++ b/gemini_tasks/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows @@ -0,0 +1 @@ +/Users/ewindmill/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.4/ \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index b0047f8e9a1..db9c9667551 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,6 @@ workspace: - compass_app/server - context_menus - date_planner - - deeplink_store_example - desktop_photo_search/fluent_ui - desktop_photo_search/material - dynamic_theme @@ -61,3 +60,12 @@ skip_ci: - add_to_app/multiple_flutters/multiple_flutters_module - add_to_app/plugin/flutter_module_using_plugin - add_to_app/prebuilt_module/flutter_module + +skip_ci_beta: + # TODO: lots of shader arg failures in the tests on beta branch + - animations + - compass_app/app + - compass_app/server + - deeplink_store_example + # TODO(ewindmill): info - lib/basic_text_input_client.dart:262:11 - 'setStyle' is deprecated and shouldn't be used. Use updateStyle instead. This feature was deprecated after v3.41.0-0.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use on beta branch + - simplistic_editor diff --git a/tool/ci_script.dart b/tool/ci_script.dart index 8aad8972557..c530339208d 100644 --- a/tool/ci_script.dart +++ b/tool/ci_script.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'package:path/path.dart' as path; import 'package:yaml/yaml.dart'; @@ -8,19 +9,39 @@ Future main() async { final pubspecContent = await pubspecFile.readAsString(); final pubspecYaml = loadYaml(pubspecContent); + // contains full list of samples final workspace = pubspecYaml['workspace'] as YamlList?; + if (workspace == null) { print('No workspace found in pubspec.yaml'); exit(1); } + // CI always skips the samples on this list final skipCiList = pubspecYaml['skip_ci'] as YamlList?; + // CI will also skip for samples on specific branches + // This is useful when API changes in the beta branch are causing CI to fail + // and there isn't a solution that works in both beta and main + final channel = await _getFlutterChannel(); + print('Current Flutter channel: $channel'); + + final channelSkipKey = 'skip_ci_$channel'; + final channelSkipList = pubspecYaml[channelSkipKey] as YamlList?; + if (channelSkipList != null) { + print('Applying skips for channel "$channel": $channelSkipList'); + } + // pub workspace, only run 'get' once await _runCommand('flutter', ['pub', 'get'], workingDirectory: rootDir.path); final packages = workspace - .where((e) => skipCiList == null || !skipCiList.contains(e)) + .where((e) { + if (skipCiList != null && skipCiList.contains(e)) return false; + if (channelSkipList != null && channelSkipList.contains(e)) + return false; + return true; + }) .map((e) => e.toString()) .toList(); @@ -70,3 +91,23 @@ Future _runCommand( exit(exitCode); } } + +Future _getFlutterChannel() async { + try { + final result = await Process.run('flutter', [ + '--version', + '--machine', + ], runInShell: true); + if (result.exitCode != 0) { + print('Flutter version command failed with exit code ${result.exitCode}'); + print('Stdout: ${result.stdout}'); + print('Stderr: ${result.stderr}'); + return 'unknown'; + } + final machineInfo = jsonDecode(result.stdout as String); + return machineInfo['channel'] as String? ?? 'unknown'; + } catch (e) { + print('Error detecting Flutter channel: $e'); + return 'unknown'; + } +} From 9925e351803a392abc988cb98135477f41bc6c89 Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Tue, 14 Apr 2026 14:31:07 -0700 Subject: [PATCH 2/6] checkin --- .github/workflows/beta.yml | 64 ++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index b93b1040d70..2d441fed394 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -15,44 +15,42 @@ defaults: shell: bash jobs: - # TODO(ewindmill) -- Something with Beta branch and shaders is broken - # Test all samples on the beta channel. Since the beta channel will soon be # promoted to stable, this branch is only concerned with the beta. - # Beta-CI: - # name: Test flutter beta channel - # runs-on: ${{ matrix.os }} - # if: github.repository == 'flutter/samples' - # strategy: - # fail-fast: false - # matrix: - # os: [ubuntu-latest, macos-latest, windows-latest] - # steps: - # - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - # - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - # with: - # distribution: 'zulu' - # java-version: '17' - # - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - # with: - # channel: beta - # - run: flutter pub get && dart tool/ci_script.dart + Beta-CI: + name: Test flutter beta channel + runs-on: ${{ matrix.os }} + if: github.repository == 'flutter/samples' + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 + with: + distribution: 'zulu' + java-version: '17' + - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 + with: + channel: beta + - run: flutter pub get && dart tool/ci_script.dart # Verify the Android add-to-app samples build and pass tests with the beta # channel. - # android-build: - # runs-on: ubuntu-latest - # if: github.repository == 'flutter/samples' - # steps: - # - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - # - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - # with: - # distribution: 'zulu' - # java-version: '17' - # - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - # with: - # channel: beta - # - run: ./tool/android_ci_script.sh + android-build: + runs-on: ubuntu-latest + if: github.repository == 'flutter/samples' + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 + with: + distribution: 'zulu' + java-version: '17' + - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 + with: + channel: beta + - run: ./tool/android_ci_script.sh # Verify the iOS add-to-app samples build and pass tests with the beta # channel. From d561d1ad49e24ebe3b7d5bdc0faaa4dd6a69cfa6 Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Tue, 14 Apr 2026 14:47:52 -0700 Subject: [PATCH 3/6] refactor: replace shell-based CI and utility scripts with a Dart-based cleaning tool and update workspace configuration --- pubspec.yaml | 13 ++++-- tool/clean_all.dart | 76 +++++++++++++++++++++++++++++++ tool/flutter_ci_script_beta.sh | 62 ------------------------- tool/flutter_ci_script_master.sh | 65 --------------------------- tool/flutter_ci_script_shared.sh | 33 -------------- tool/flutter_ci_script_stable.sh | 59 ------------------------ tool/flutter_clean_packages.sh | 77 -------------------------------- tool/flutter_pub_upgrade.sh | 16 ------- 8 files changed, 85 insertions(+), 316 deletions(-) create mode 100644 tool/clean_all.dart delete mode 100755 tool/flutter_ci_script_beta.sh delete mode 100755 tool/flutter_ci_script_master.sh delete mode 100644 tool/flutter_ci_script_shared.sh delete mode 100755 tool/flutter_ci_script_stable.sh delete mode 100644 tool/flutter_clean_packages.sh delete mode 100755 tool/flutter_pub_upgrade.sh diff --git a/pubspec.yaml b/pubspec.yaml index db9c9667551..9ab28ca72e8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,6 +25,7 @@ workspace: - compass_app/server - context_menus - date_planner + - deeplink_store_example - desktop_photo_search/fluent_ui - desktop_photo_search/material - dynamic_theme @@ -63,9 +64,13 @@ skip_ci: skip_ci_beta: # TODO: lots of shader arg failures in the tests on beta branch - - animations - - compass_app/app - - compass_app/server - - deeplink_store_example + # - animations + # - compass_app/app + # - compass_app/server + # - deeplink_store_example + # - desktop_photo_search/fluent_ui + # - desktop_photo_search/material + # - form_app + - material_3_demo # TODO(ewindmill): info - lib/basic_text_input_client.dart:262:11 - 'setStyle' is deprecated and shouldn't be used. Use updateStyle instead. This feature was deprecated after v3.41.0-0.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use on beta branch - simplistic_editor diff --git a/tool/clean_all.dart b/tool/clean_all.dart new file mode 100644 index 00000000000..d13b3d9cca3 --- /dev/null +++ b/tool/clean_all.dart @@ -0,0 +1,76 @@ +import 'dart:io'; +import 'package:path/path.dart' as path; +import 'package:yaml/yaml.dart'; + +/// Runs `flutter clean` in every package listed in the root pubspec.yaml +/// workspace. Useful for clearing stale build artifacts after switching Flutter +/// channels. +Future main() async { + final rootDir = Directory.current; + final pubspecFile = File(path.join(rootDir.path, 'pubspec.yaml')); + final pubspecContent = await pubspecFile.readAsString(); + final pubspecYaml = loadYaml(pubspecContent); + + final workspace = pubspecYaml['workspace'] as YamlList?; + if (workspace == null) { + print('No workspace found in pubspec.yaml'); + exit(1); + } + + final flutterBin = _resolveFlutterBin(); + print('Using flutter: $flutterBin'); + + var cleaned = 0; + var skipped = 0; + + for (final entry in workspace) { + final package = entry.toString(); + final packagePath = path.join(rootDir.path, package); + + // Only clean packages that have a pubspec.yaml (i.e. are Flutter/Dart pkgs) + final pubspec = File(path.join(packagePath, 'pubspec.yaml')); + if (!await pubspec.exists()) { + print('-- Skipping \'$package\' (no pubspec.yaml found)'); + skipped++; + continue; + } + + print('== Cleaning \'$package\' =='); + final process = await Process.start( + flutterBin, + ['clean'], + workingDirectory: packagePath, + runInShell: true, + mode: ProcessStartMode.inheritStdio, + ); + final exitCode = await process.exitCode; + if (exitCode != 0) { + print( + 'Warning: flutter clean failed with exit code $exitCode in $packagePath', + ); + } else { + cleaned++; + } + } + + print(''); + print('Done. Cleaned $cleaned package(s), skipped $skipped.'); +} + +/// Resolves the path to the `flutter` binary by finding it relative to the +/// running Dart SDK. Falls back to 'flutter' (uses PATH) if not found. +String _resolveFlutterBin() { + // Platform.resolvedExecutable points to the dart binary, e.g.: + // /path/to/flutter/bin/cache/dart-sdk/bin/dart + // Flutter binary is at /path/to/flutter/bin/flutter + final dartBin = File(Platform.resolvedExecutable); + final flutterBin = path.join( + dartBin.parent.parent.parent.parent.path, + 'bin', + 'flutter', + ); + if (File(flutterBin).existsSync()) { + return flutterBin; + } + return 'flutter'; // fallback to PATH +} diff --git a/tool/flutter_ci_script_beta.sh b/tool/flutter_ci_script_beta.sh deleted file mode 100755 index af1e154dc45..00000000000 --- a/tool/flutter_ci_script_beta.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -set -e - -DIR="${BASH_SOURCE%/*}" -source "$DIR/flutter_ci_script_shared.sh" - -flutter doctor -v - -declare -ar PROJECT_NAMES=( - "add_to_app/android_view/flutter_module_using_plugin" - "add_to_app/books/flutter_module_books" - "add_to_app/fullscreen/flutter_module" - "add_to_app/multiple_flutters/multiple_flutters_module" - "add_to_app/plugin/flutter_module_using_plugin" - "add_to_app/prebuilt_module/flutter_module" - "analysis_defaults" - "android_splash_screen" - "animations" - "asset_transformation" - "background_isolate_channels" - "code_sharing/client" - "code_sharing/server" - "code_sharing/shared" - "compass_app/app" - "compass_app/server" - "context_menus" - "deeplink_store_example" - "desktop_photo_search/fluent_ui" - "desktop_photo_search/material" - "dynamic_theme" - "flutter_maps_firestore" - "form_app" - "game_template" - "google_maps" - "infinite_list" - "ios_app_clip" - # TODO(ewindmill): replace deprecated activeColor with activeThumbColor in 3.33 -# "isolate_example" - # TODO(ewindmill) - RadioGroup api changed. - # "material_3_demo" - "navigation_and_routing" - # TODO(domesticmouse): Angle brackets will be interpreted as HTML. - # "pedometer" - "pedometer/example" - "place_tracker" - "platform_channels" - "platform_design" - "platform_view_swift" - "provider_counter" - "provider_shopper" - "simple_shader" - "simplistic_calculator" - "simplistic_editor" - "testing_app" - "veggieseasons" - "web_embedding/element_embedding_demo" -) - -ci_projects "beta" "${PROJECT_NAMES[@]}" - -echo "-- Success --" diff --git a/tool/flutter_ci_script_master.sh b/tool/flutter_ci_script_master.sh deleted file mode 100755 index 77711edf712..00000000000 --- a/tool/flutter_ci_script_master.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -set -e - -DIR="${BASH_SOURCE%/*}" -source "$DIR/flutter_ci_script_shared.sh" - -flutter doctor -v - -declare -ar PROJECT_NAMES=( - "add_to_app/android_view/flutter_module_using_plugin" - "add_to_app/books/flutter_module_books" - "add_to_app/fullscreen/flutter_module" - "add_to_app/multiple_flutters/multiple_flutters_module" - "add_to_app/plugin/flutter_module_using_plugin" - "add_to_app/prebuilt_module/flutter_module" - "analysis_defaults" - "android_splash_screen" - "animations" - "asset_transformation" - "background_isolate_channels" - "code_sharing/client" - # TODO(ewindmill): The integration tests are failing - # "code_sharing/server" - "code_sharing/shared" - "compass_app/app" - # TODO(ewindmill): The integration tests are failing - # "compass_app/server" - "context_menus" - "date_planner" - "deeplink_store_example" - "desktop_photo_search/fluent_ui" - "desktop_photo_search/material" - "dynamic_theme" - "flutter_maps_firestore" - "form_app" - "game_template" - "google_maps" - "infinite_list" - "ios_app_clip" - # TODO(ewindmill): replace deprecated activeColor with activeThumbColor in 3.33 - # "isolate_example" - # TODO(ewindmill) - RadioGroup api changed. - # "material_3_demo" - "navigation_and_routing" - # TODO(domesticmouse): Angle brackets will be interpreted as HTML. - # "pedometer" - "pedometer/example" - "place_tracker" - "platform_channels" - "platform_design" - "platform_view_swift" - "provider_counter" - "provider_shopper" - "simple_shader" - "simplistic_calculator" - "simplistic_editor" - "testing_app" - "veggieseasons" - "web_embedding/element_embedding_demo" -) - -ci_projects "master" "${PROJECT_NAMES[@]}" - -echo "-- Success --" diff --git a/tool/flutter_ci_script_shared.sh b/tool/flutter_ci_script_shared.sh deleted file mode 100644 index 8b511a6218f..00000000000 --- a/tool/flutter_ci_script_shared.sh +++ /dev/null @@ -1,33 +0,0 @@ -function ci_projects () { - local channel="$1" - - shift - local arr=("$@") - for PROJECT_NAME in "${arr[@]}" - do - echo "== Testing '${PROJECT_NAME}' on Flutter's $channel channel ==" - pushd "${PROJECT_NAME}" - - # Grab packages. - flutter pub get - - # Run the analyzer to find any static analysis issues. - dart analyze --fatal-infos --fatal-warnings - - # Run the formatter on all the dart files to make sure everything's linted. - dart format --output none . - - # Run the actual tests. - if [ -d "test" ] - then - if grep -q "flutter:" "pubspec.yaml"; then - flutter test - else - # If the project is not a Flutter project, use the Dart CLI. - dart test - fi - fi - - popd - done -} diff --git a/tool/flutter_ci_script_stable.sh b/tool/flutter_ci_script_stable.sh deleted file mode 100755 index 2d2604acf94..00000000000 --- a/tool/flutter_ci_script_stable.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -set -e - -DIR="${BASH_SOURCE%/*}" -source "$DIR/flutter_ci_script_shared.sh" - -flutter doctor -v - -declare -ar PROJECT_NAMES=( - "add_to_app/android_view/flutter_module_using_plugin" - "add_to_app/books/flutter_module_books" - "add_to_app/fullscreen/flutter_module" - "add_to_app/multiple_flutters/multiple_flutters_module" - "add_to_app/plugin/flutter_module_using_plugin" - "add_to_app/prebuilt_module/flutter_module" - "analysis_defaults" - "android_splash_screen" - "animations" - "asset_transformation" - "background_isolate_channels" - "code_sharing/client" - "code_sharing/server" - "code_sharing/shared" - "compass_app/app" - "compass_app/server" - "context_menus" - "deeplink_store_example" - "desktop_photo_search/fluent_ui" - "desktop_photo_search/material" - "dynamic_theme" - "flutter_maps_firestore" - "form_app" - "game_template" - "google_maps" - "infinite_list" - "ios_app_clip" - "isolate_example" - "material_3_demo" - "platform_channels" - "platform_design" - "navigation_and_routing" - "pedometer" - "pedometer/example" - "place_tracker" - "platform_view_swift" - "provider_counter" - "provider_shopper" - "simple_shader" - "simplistic_calculator" - "simplistic_editor" - "testing_app" - "veggieseasons" - "web_embedding/element_embedding_demo" -) - -ci_projects "stable" "${PROJECT_NAMES[@]}" - -echo "-- Success --" diff --git a/tool/flutter_clean_packages.sh b/tool/flutter_clean_packages.sh deleted file mode 100644 index f6feecfd81f..00000000000 --- a/tool/flutter_clean_packages.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -set -e - -flutter doctor -v - -declare -ar PROJECT_NAMES=( - "add_to_app/android_view/flutter_module_using_plugin" - "add_to_app/books/flutter_module_books" - "add_to_app/fullscreen/flutter_module" - "add_to_app/multiple_flutters/multiple_flutters_module" - "add_to_app/plugin/flutter_module_using_plugin" - "add_to_app/prebuilt_module/flutter_module" - "ai_recipe_generation" - "analysis_defaults" - "android_splash_screen" - "animations" - "asset_transformation" - "background_isolate_channels" - "code_sharing/client" - "code_sharing/server" - "code_sharing/shared" - "context_menus" - "deeplink_store_example" - "desktop_photo_search/fluent_ui" - "desktop_photo_search/material" - "dynamic_theme" - "experimental/federated_plugin/federated_plugin" - "experimental/federated_plugin/federated_plugin/example" - "experimental/federated_plugin/federated_plugin_macos" - "experimental/federated_plugin/federated_plugin_platform_interface" - "experimental/federated_plugin/federated_plugin_web" - "experimental/federated_plugin/federated_plugin_windows" - "experimental/pedometer" - "experimental/pedometer/example" - "experimental/varfont_shader_puzzle" - "experimental/web_dashboard" - "flutter_maps_firestore" - "form_app" - "game_template" - "google_maps" - "infinite_list" - "ios_app_clip" - "isolate_example" - "material_3_demo" - "navigation_and_routing" - "place_tracker" - "platform_channels" - "platform_design" - "platform_view_swift" - "provider_counter" - "provider_shopper" - "simple_shader" - "simplistic_calculator" - "simplistic_editor" - "testing_app" - "veggieseasons" - "web_embedding/element_embedding_demo" -) - -echo "--- Running flutter clean and flutter pub get for each sample ---" - -for PROJECT_NAME in "${PROJECT_NAMES[@]}" - do - echo "== Cleaning '${PROJECT_NAME}' with Flutter clean ==" - pushd "${PROJECT_NAME}" - - # run `flutter clean` for project - flutter clean - - # Grab packages. - flutter pub get - - popd - done - -echo "--- Success ---" \ No newline at end of file diff --git a/tool/flutter_pub_upgrade.sh b/tool/flutter_pub_upgrade.sh deleted file mode 100755 index cab1d8f6a06..00000000000 --- a/tool/flutter_pub_upgrade.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -scriptDirectory="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -# It seems federated_plugin_* isn't happy to run flutter pub upgrade -for dir in `find "${scriptDirectory}/.." -name pubspec.yaml -exec dirname {} \; | grep -v federated_plugin | grep -v experimental | sort` -do - ( - cd $dir - echo "Updating `pwd`" - flutter pub upgrade - flutter pub outdated - ) -done From 8fab750b61f5065a45e2f44a65ee4a3f86f8938e Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Tue, 14 Apr 2026 14:57:53 -0700 Subject: [PATCH 4/6] checkin --- pubspec.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 9ab28ca72e8..983998a1b4b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,14 +63,6 @@ skip_ci: - add_to_app/prebuilt_module/flutter_module skip_ci_beta: - # TODO: lots of shader arg failures in the tests on beta branch - # - animations - # - compass_app/app - # - compass_app/server - # - deeplink_store_example - # - desktop_photo_search/fluent_ui - # - desktop_photo_search/material - # - form_app - material_3_demo # TODO(ewindmill): info - lib/basic_text_input_client.dart:262:11 - 'setStyle' is deprecated and shouldn't be used. Use updateStyle instead. This feature was deprecated after v3.41.0-0.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use on beta branch - simplistic_editor From 2759edc9b28035fa9b70cef15e64267f84398cd6 Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Tue, 14 Apr 2026 14:58:27 -0700 Subject: [PATCH 5/6] checkin --- animations/test/misc/animated_positioned_test.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/animations/test/misc/animated_positioned_test.dart b/animations/test/misc/animated_positioned_test.dart index dc3e9b6a368..69bbc305055 100644 --- a/animations/test/misc/animated_positioned_test.dart +++ b/animations/test/misc/animated_positioned_test.dart @@ -28,6 +28,5 @@ void main() { var newPosition = tester.getTopLeft(button); expect(newPosition, isNot(offsetMoreOrLessEquals(initialPosition))); }); - // TODO: Exception: Asset 'shaders/ink_sparkle.frag' manifest could not be decoded: INVALID_ARGUMENT:Unsupported runtime stages format version. Expected 2, got 1. - }, skip: true); + }); } From 86bf8abd39240f61d40c5943d7d0dfb52c539276 Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Tue, 14 Apr 2026 15:28:38 -0700 Subject: [PATCH 6/6] remove beta ci --- .github/workflows/beta.yml | 69 -------------------------------------- .github/workflows/main.yml | 2 +- 2 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 .github/workflows/beta.yml diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml deleted file mode 100644 index 2d441fed394..00000000000 --- a/.github/workflows/beta.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: Beta Branch CI - -# Declare default permissions as read only. -permissions: read-all - -on: - push: - branches: [beta] - pull_request: - branches: [beta] - workflow_dispatch: - -defaults: - run: - shell: bash - -jobs: - # Test all samples on the beta channel. Since the beta channel will soon be - # promoted to stable, this branch is only concerned with the beta. - Beta-CI: - name: Test flutter beta channel - runs-on: ${{ matrix.os }} - if: github.repository == 'flutter/samples' - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - with: - distribution: 'zulu' - java-version: '17' - - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - with: - channel: beta - - run: flutter pub get && dart tool/ci_script.dart - - # Verify the Android add-to-app samples build and pass tests with the beta - # channel. - android-build: - runs-on: ubuntu-latest - if: github.repository == 'flutter/samples' - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - with: - distribution: 'zulu' - java-version: '17' - - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - with: - channel: beta - - run: ./tool/android_ci_script.sh - - # Verify the iOS add-to-app samples build and pass tests with the beta - # channel. - # ios-build: - # runs-on: macos-latest - # if: github.repository == 'flutter/samples' - # steps: - # - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - # - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 - # with: - # distribution: 'zulu' - # java-version: '17' - # - uses: subosito/flutter-action@e938fdf56512cc96ef2f93601a5a40bde3801046 - # with: - # channel: beta - # - run: ./tool/ios_ci_script.sh diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1b84ef177fc..689aa71fa98 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: strategy: fail-fast: false matrix: - flutter_version: [stable, beta] + flutter_version: [stable] os: [ubuntu-latest, macos-latest] steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd