[desc] Silence print() statements when outputing json Instead of outputting any print() statements encountered during the running of the Setup, ignore them with a no-op print callback which is swapped back for the original at the end of the command. Change-Id: Ic87dcb444110464fa9d56c6ca02f8e1c7a78724a Reviewed-on: https://gn-review.googlesource.com/c/gn/+/15440 Reviewed-by: David Turner <digit@google.com> Commit-Queue: Aaron Wood <aaronwood@google.com>
diff --git a/src/gn/build_settings.cc b/src/gn/build_settings.cc index b364ea2..6a26495 100644 --- a/src/gn/build_settings.cc +++ b/src/gn/build_settings.cc
@@ -78,3 +78,10 @@ if (item_defined_callback_) item_defined_callback_(std::move(item)); } + +const BuildSettings::PrintCallback BuildSettings::swap_print_callback( + const BuildSettings::PrintCallback callback) { + auto temp = std::move(print_callback_); + print_callback_ = callback; + return temp; +} \ No newline at end of file
diff --git a/src/gn/build_settings.h b/src/gn/build_settings.h index 82f11db..dd3bd9c 100644 --- a/src/gn/build_settings.h +++ b/src/gn/build_settings.h
@@ -129,7 +129,8 @@ // callback is is_null() (the default) the output will be printed to the // console. const PrintCallback& print_callback() const { return print_callback_; } - void set_print_callback(const PrintCallback& cb) { print_callback_ = cb; } + void set_print_callback(const PrintCallback cb) { print_callback_ = cb; } + const PrintCallback swap_print_callback(const PrintCallback cb); // A list of files that can call exec_script(). If the returned pointer is // null, exec_script may be called from anywhere.
diff --git a/src/gn/command_desc.cc b/src/gn/command_desc.cc index 95652f1..b50d4e9 100644 --- a/src/gn/command_desc.cc +++ b/src/gn/command_desc.cc
@@ -623,6 +623,25 @@ each one was set from. )"; +class PrintCallbackHolder { + public: + PrintCallbackHolder() {} + ~PrintCallbackHolder() { + if (_settings.has_value()) { + _settings.value()->swap_print_callback(_callback.value()); + } + } + void SwapCallbacks(BuildSettings* settings, + BuildSettings::PrintCallback new_callback) { + _settings = settings; + _callback = settings->swap_print_callback(new_callback); + } + + private: + std::optional<BuildSettings*> _settings; + std::optional<BuildSettings::PrintCallback> _callback; +}; + int RunDesc(const std::vector<std::string>& args) { if (args.size() != 2 && args.size() != 3) { Err(Location(), "Unknown command format. See \"gn help desc\"", @@ -634,6 +653,16 @@ // Deliberately leaked to avoid expensive process teardown. Setup* setup = new Setup; + + bool json = cmdline->GetSwitchValueString("format") == "json"; + PrintCallbackHolder print_callback_holder; + if (json) { + // Silence all output while running desc if outputting to json. + BuildSettings* settings = &setup->build_settings(); + print_callback_holder.SwapCallbacks(settings, + [](const std::string& str) {}); + } + if (!setup->DoSetup(args[0], false)) return 1; if (!setup->Run()) @@ -657,8 +686,6 @@ if (args.size() == 3) what_to_print = args[2]; - bool json = cmdline->GetSwitchValueString("format") == "json"; - if (target_matches.empty() && config_matches.empty()) { OutputString( "The input " + args[1] + " matches no targets, configs or files.\n",