fix(forge_select): skip interactive prompts when stdin is not a terminal#2571
Merged
tusharmath merged 1 commit intomainfrom Mar 16, 2026
Merged
fix(forge_select): skip interactive prompts when stdin is not a terminal#2571tusharmath merged 1 commit intomainfrom
tusharmath merged 1 commit intomainfrom
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Skip interactive prompts in
forge_selectwhen stdin is not a terminal, preventing the process from blocking indefinitely in non-interactive sessions.Context
When Forge runs in a non-interactive environment (e.g., piped input, CI pipelines, detached sessions), the interactive selection prompts (
Select,MultiSelect,Input) attempt to read from stdin and block indefinitely since there is no terminal to interact with. This makes Forge unusable in scripted or automated workflows where stdin is not a TTY.Changes
is_terminal()check at the start of theprompt()method in all three interactive selection components:InputBuilder::prompt- text input promptsMultiSelectBuilder::prompt- multi-select (fzf-based) promptsSelectBuilder::prompt- single-select (fzf-based) and confirm promptsOk(None)immediately when stdin is not a terminal, allowing callers to handle the absence of user input gracefullyKey Implementation Details
Uses
std::io::IsTerminal(stabilized in Rust 1.70) to detect whether stdin is connected to a terminal. The guard is placed as the very first check in eachprompt()method, before any other logic (editor initialization, option validation, etc.), ensuring no resources are allocated unnecessarily.Testing