Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Conversation

@vially
Copy link
Contributor

@vially vially commented Mar 20, 2023

Prior to this change, the system fonts were being loaded twice, which was affecting application startup performance on Linux.

The first call was being triggered by Engine::SetupDefaultFontManager while the second one happened during the first call to SkFontMgr::RefDefault() which is usually triggered by SkTypeface::MakeFromStream(). The following stack traces show the code paths leading to these calls:

First call to DirectorySystemFontLoader::loadSystemFonts
libflutter_linux_gtk.so!DirectorySystemFontLoader::loadSystemFonts(const DirectorySystemFontLoader * this, const SkTypeface_FreeType::Scanner & scanner, SkFontMgr_Custom::Families * families) (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom_directory.cpp:21)
libflutter_linux_gtk.so!SkFontMgr_Custom::SkFontMgr_Custom(SkFontMgr_Custom * this, const SkFontMgr_Custom::SystemFontLoader & loader) (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom.cpp:131)
libflutter_linux_gtk.so!sk_make_sp<SkFontMgr_Custom, DirectorySystemFontLoader>(DirectorySystemFontLoader && args) (/home/vially/code/engine/src/third_party/skia/include/core/SkRefCnt.h:372)
libflutter_linux_gtk.so!SkFontMgr_New_Custom_Directory(const char * dir) (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom_directory.cpp:103)
libflutter_linux_gtk.so!txt::GetDefaultFontManager(uint32_t font_initialization_data) (/home/vially/code/engine/src/flutter/third_party/txt/src/txt/platform_linux.cc:23)
libflutter_linux_gtk.so!txt::FontCollection::SetupDefaultFontManager(txt::FontCollection * this, uint32_t font_initialization_data) (/home/vially/code/engine/src/flutter/third_party/txt/src/txt/font_collection.cc:48)
libflutter_linux_gtk.so!flutter::FontCollection::SetupDefaultFontManager(flutter::FontCollection * this, uint32_t font_initialization_data) (/home/vially/code/engine/src/flutter/lib/ui/text/font_collection.cc:45)
libflutter_linux_gtk.so!flutter::Engine::SetupDefaultFontManager(flutter::Engine * this) (/home/vially/code/engine/src/flutter/shell/common/engine.cc:151)
libflutter_linux_gtk.so!flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1::operator()() const(const class {...} * this) (/home/vially/code/engine/src/flutter/shell/common/shell.cc:690)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__invoke[abi:v15000]<flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1&>(flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1&)(class {...} & __f) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/invoke.h:403)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__invoke_void_return_wrapper<void, true>::__call<flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1&>(flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1&)(class {...} & __args) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/invoke.h:488)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__function::__alloc_func<flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1, std::_LIBCPP_ABI_NAMESPACE::allocator<flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1>, void ()>::operator()[abi:v15000]()(std::_LIBCPP_ABI_NAMESPACE::__function::__alloc_func<(lambda at ../../flutter/shell/common/shell.cc:688:39), std::_LIBCPP_ABI_NAMESPACE::allocator<(lambda at ../../flutter/shell/common/shell.cc:688:39)>, void ()> * this) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/function.h:185)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__function::__func<flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1, std::_LIBCPP_ABI_NAMESPACE::allocator<flutter::Shell::Setup(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::PlatformView, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::PlatformView> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Engine, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Engine> >, std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::Rasterizer, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::Rasterizer> >, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::ShellIOManager> const&)::$_1>, void ()>::operator()()(std::_LIBCPP_ABI_NAMESPACE::__function::__func<(lambda at ../../flutter/shell/common/shell.cc:688:39), std::_LIBCPP_ABI_NAMESPACE::allocator<(lambda at ../../flutter/shell/common/shell.cc:688:39)>, void ()> * this) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/function.h:359)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__function::__value_func<void ()>::operator()[abi:v15000]() const(const std::_LIBCPP_ABI_NAMESPACE::__function::__value_func<void ()> * this) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/function.h:512)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::function<void ()>::operator()() const(const std::_LIBCPP_ABI_NAMESPACE::function<void ()> * this) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/function.h:1187)
libflutter_linux_gtk.so!fml::MessageLoopImpl::FlushTasks(fml::MessageLoopImpl * this, fml::FlushType type) (/home/vially/code/engine/src/flutter/fml/message_loop_impl.cc:126)
libflutter_linux_gtk.so!fml::MessageLoopImpl::RunExpiredTasksNow(fml::MessageLoopImpl * this) (/home/vially/code/engine/src/flutter/fml/message_loop_impl.cc:139)
libflutter_linux_gtk.so!fml::MessageLoopLinux::OnEventFired(fml::MessageLoopLinux * this) (/home/vially/code/engine/src/flutter/fml/platform/linux/message_loop_linux.cc:90)
libflutter_linux_gtk.so!fml::MessageLoopLinux::Run(fml::MessageLoopLinux * this) (/home/vially/code/engine/src/flutter/fml/platform/linux/message_loop_linux.cc:70)
libflutter_linux_gtk.so!fml::MessageLoopImpl::DoRun(fml::MessageLoopImpl * this) (/home/vially/code/engine/src/flutter/fml/message_loop_impl.cc:94)
Second call to DirectorySystemFontLoader::loadSystemFonts
libflutter_linux_gtk.so!DirectorySystemFontLoader::loadSystemFonts(const DirectorySystemFontLoader * this, const SkTypeface_FreeType::Scanner & scanner, SkFontMgr_Custom::Families * families) (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom_directory.cpp:21)
libflutter_linux_gtk.so!SkFontMgr_Custom::SkFontMgr_Custom(SkFontMgr_Custom * this, const SkFontMgr_Custom::SystemFontLoader & loader) (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom.cpp:131)
libflutter_linux_gtk.so!sk_make_sp<SkFontMgr_Custom, DirectorySystemFontLoader>(DirectorySystemFontLoader && args) (/home/vially/code/engine/src/third_party/skia/include/core/SkRefCnt.h:372)
libflutter_linux_gtk.so!SkFontMgr_New_Custom_Directory(const char * dir) (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom_directory.cpp:103)
libflutter_linux_gtk.so!SkFontMgr::Factory() (/home/vially/code/engine/src/third_party/skia/src/ports/SkFontMgr_custom_directory_factory.cpp:20)
libflutter_linux_gtk.so!SkFontMgr::RefDefault()::$_0::operator()() const(const class {...} * this) (/home/vially/code/engine/src/third_party/skia/src/core/SkFontMgr.cpp:163)
libflutter_linux_gtk.so!SkOnce::operator()<SkFontMgr::RefDefault()::$_0>(SkFontMgr::RefDefault()::$_0&&)(SkOnce * this, class {...} && fn) (/home/vially/code/engine/src/third_party/skia/include/private/base/SkOnce.h:39)
libflutter_linux_gtk.so!SkFontMgr::RefDefault() (/home/vially/code/engine/src/third_party/skia/src/core/SkFontMgr.cpp:161)
libflutter_linux_gtk.so!SkTypeface::MakeFromStream(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<SkStreamAsset, std::_LIBCPP_ABI_NAMESPACE::default_delete<SkStreamAsset> > stream, int index) (/home/vially/code/engine/src/third_party/skia/src/core/SkTypeface.cpp:216)
libflutter_linux_gtk.so!flutter::AssetManagerFontStyleSet::createTypeface(flutter::AssetManagerFontStyleSet * this, int i) (/home/vially/code/engine/src/flutter/lib/ui/text/asset_manager_font_provider.cc:121)
libflutter_linux_gtk.so!flutter::AssetManagerFontStyleSet::getStyle(flutter::AssetManagerFontStyleSet * this, int index, SkFontStyle * style, SkString * name) (/home/vially/code/engine/src/flutter/lib/ui/text/asset_manager_font_provider.cc:90)
libflutter_linux_gtk.so!SkFontStyleSet::matchStyleCSS3(SkFontStyleSet * this, const SkFontStyle & pattern) (/home/vially/code/engine/src/third_party/skia/src/core/SkFontMgr.cpp:211)
libflutter_linux_gtk.so!flutter::AssetManagerFontStyleSet::matchStyle(flutter::AssetManagerFontStyleSet * this, const SkFontStyle & pattern) (/home/vially/code/engine/src/flutter/lib/ui/text/asset_manager_font_provider.cc:133)
libflutter_linux_gtk.so!skia::textlayout::FontCollection::matchTypeface(skia::textlayout::FontCollection * this, const SkString & familyName, SkFontStyle fontStyle) (/home/vially/code/engine/src/third_party/skia/modules/skparagraph/src/FontCollection.cpp:135)
libflutter_linux_gtk.so!skia::textlayout::FontCollection::findTypefaces(skia::textlayout::FontCollection * this, const std::_LIBCPP_ABI_NAMESPACE::vector<SkString, std::_LIBCPP_ABI_NAMESPACE::allocator<SkString> > & familyNames, SkFontStyle fontStyle, const std::_LIBCPP_ABI_NAMESPACE::optional<skia::textlayout::FontArguments> & fontArgs) (/home/vially/code/engine/src/third_party/skia/modules/skparagraph/src/FontCollection.cpp:94)
libflutter_linux_gtk.so!skia::textlayout::OneLineShaper::matchResolvedFonts(skia::textlayout::TextStyle const&, std::_LIBCPP_ABI_NAMESPACE::function<skia::textlayout::OneLineShaper::Resolved (sk_sp<SkTypeface>)> const&)(skia::textlayout::OneLineShaper * this, const skia::textlayout::TextStyle & textStyle, const skia::textlayout::OneLineShaper::TypefaceVisitor & visitor) (/home/vially/code/engine/src/third_party/skia/modules/skparagraph/src/OneLineShaper.cpp:417)
libflutter_linux_gtk.so!skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}::operator()(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>) const(const class {...} * this, skia::textlayout::Block block, SkTArray<SkShaper::Feature> features) (/home/vially/code/engine/src/third_party/skia/modules/skparagraph/src/OneLineShaper.cpp:616)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__invoke[abi:v15000]<skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}&, skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true> >(skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}&, skia::textlayout::Block&&, skia_private::TArray<SkShaper::Feature, true>&&)(class {...} & __f, skia_private::TArray<SkShaper::Feature, true> && __args, skia_private::TArray<SkShaper::Feature, true> && __args) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/invoke.h:403)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__invoke_void_return_wrapper<void, true>::__call<skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}&, skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true> >(skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}&, skia::textlayout::Block&&, skia_private::TArray<SkShaper::Feature, true>&&)(skia_private::TArray<SkShaper::Feature, true> && __args, skia_private::TArray<SkShaper::Feature, true> && __args, skia_private::TArray<SkShaper::Feature, true> && __args) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/invoke.h:488)
libflutter_linux_gtk.so!std::_LIBCPP_ABI_NAMESPACE::__function::__alloc_func<skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}, std::_LIBCPP_ABI_NAMESPACE::allocator<skia::textlayout::OneLineShaper::shape()::$_0::operator()(skia::textlayout::SkRange<unsigned long>, SkSpan<skia::textlayout::Block>, float&, unsigned long, unsigned char) const::{lambda(skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)#1}>, void (skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)>::operator()[abi:v15000](skia::textlayout::Block&&, skia_private::TArray<SkShaper::Feature, true>&&)(std::_LIBCPP_ABI_NAMESPACE::__function::__alloc_func<(lambda at ../../third_party/skia/modules/skparagraph/src/OneLineShaper.cpp:604:17), std::_LIBCPP_ABI_NAMESPACE::allocator<(lambda at ../../third_party/skia/modules/skparagraph/src/OneLineShaper.cpp:604:17)>, void (skia::textlayout::Block, skia_private::TArray<SkShaper::Feature, true>)> * this, skia_private::TArray<SkShaper::Feature, true> && __arg, skia_private::TArray<SkShaper::Feature, true> && __arg) (/home/vially/code/engine/src/third_party/libcxx/include/__functional/function.h:185)

The root cause here is that GetDefaultFontManager() does not set the newly initialized font manager as the SkFontMgr singleton. This means the first call to SkFontMgr::RefDefault() has to initialize another instance of the font manager. This affects both font manager implementations on Linux: custom directory and fontconfig.

This pull-request fixes that by replacing the custom GetDefaultFontManager() implementation on Linux with a call to SkFontMgr::RefDefault(). It turns out this is working as expected and it automatically selects the correct font manager factory depending on the enable-fontconfig GN flag.

This is part of a series of pull-requests that will attempt to fix some font-loading issues related to flutter/flutter#118911.

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the Flutter Style Guide and the C++, Objective-C, Java style guides.
  • I listed at least one issue that this PR fixes in the description above.
  • I added new tests to check the change I am making or feature I am adding, or Hixie said the PR is test-exempt. See testing the engine for instructions on writing and running engine tests.
  • I updated/added relevant documentation (doc comments with ///).
  • I signed the CLA.
  • All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@flutter-dashboard
Copy link

It looks like this pull request may not have tests. Please make sure to add tests before merging. If you need an exemption to this rule, contact Hixie on the #hackers channel in Chat (don't just cc him here, he won't see it! He's on Discord!).

If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix?

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.

#else
return SkFontMgr_New_Custom_Directory("/usr/share/fonts/");
#endif
// WARNING: Not using `SkFontMgr::RefDefault()` can cause performance issues
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this comment - using SkFontMgr::RefDefault does not need a specific explanation. RefDefault is the standard choice unless the platform has a specific reason to override it.

(IIRC the previous implementation was needed because at that time Skia did not ensure that the FontConfig font manager would be preferred over the directory font manager if both are available)

Copy link
Contributor Author

@vially vially Mar 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be fixed now, but for what it's worth the directory font manager is still the default unless the --enable-fontconfig GN flag is used (which doesn't seem to be enabled in the official build).

But I was going to propose enabling it by default on Linux (in a separate pull-request) because fontconfig seems to be faster than custom-directory on systems with lots of fonts installed (flutter/flutter#118911).

@vially vially force-pushed the fix-dup-load-system-fonts branch from 55eb98d to 1ee2601 Compare March 21, 2023 19:22
@jason-simmons jason-simmons added the autosubmit Merge PR when tree becomes green via auto submit App label Mar 21, 2023
@auto-submit auto-submit bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Mar 21, 2023
@auto-submit
Copy link
Contributor

auto-submit bot commented Mar 21, 2023

auto label is removed for flutter/engine, pr: 40469, due to This PR has not met approval requirements for merging. You have project association NONE and need 1 more review(s) in order to merge this PR.

  • Merge guidelines: You need at least one approved review if you are already a MEMBER or two member reviews if you are not a MEMBER before re-applying the autosubmit label. Reviewers: If you left a comment approving, please use the "approve" review action instead.

@auto-submit
Copy link
Contributor

auto-submit bot commented Mar 21, 2023

auto label is removed for flutter/engine, pr: 40469, due to Validations Fail.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants