Skip to content

Work in progress portage repository support - #989

Draft
lu-zero wants to merge 10 commits into
reubeno:mainfrom
lu-zero:for-portage-repo
Draft

Work in progress portage repository support #989
lu-zero wants to merge 10 commits into
reubeno:mainfrom
lu-zero:for-portage-repo

Conversation

@lu-zero

@lu-zero lu-zero commented Feb 12, 2026

Copy link
Copy Markdown
Contributor

it is a draft for now.

@github-actions

github-actions Bot commented Feb 12, 2026

Copy link
Copy Markdown

Public API changes for crate: brush-builtins

Removed items

-pub trait brush_builtins::ShellBuilderExt
-pub fn brush_builtins::ShellBuilderExt::default_builtins(self, brush_builtins::BuiltinSet) -> Self
-impl<SE: brush_core::extensions::ShellExtensions, S: brush_core::shell::builder::shell_builder::State> brush_builtins::ShellBuilderExt for brush_core::shell::builder::ShellBuilder<SE, S>
-pub fn brush_core::shell::builder::ShellBuilder<SE, S>::default_builtins(self, brush_builtins::BuiltinSet) -> Self
-pub fn brush_builtins::default_builtins<SE: brush_core::extensions::ShellExtensions>(brush_builtins::BuiltinSet) -> std::collections::hash::map::HashMap<alloc::string::String, brush_core::builtins::Registration<SE>>

Added items

+pub trait brush_builtins::ShellExt
+pub fn brush_builtins::ShellExt::register_default_builtins(&mut self, brush_builtins::BuiltinSet)
+impl<SE: brush_core::extensions::ShellExtensions> brush_builtins::ShellExt for brush_core::shell::Shell<SE>
+pub fn brush_core::shell::Shell<SE>::register_default_builtins(&mut self, brush_builtins::BuiltinSet)
+pub fn brush_builtins::register_default_builtins<SE: brush_core::extensions::ShellExtensions>(&mut brush_core::shell::Shell<SE>, brush_builtins::BuiltinSet)

Public API changes for crate: brush-core

Removed items

-impl<SE: brush_core::extensions::ShellExtensions> brush_core::builtins::Registration<SE>
-pub const fn brush_core::builtins::Registration<SE>::special(self) -> Self
-pub fn brush_core::env::ShellEnvironment::get<S: core::convert::AsRef<str>>(&self, S) -> core::option::Option<(brush_core::env::EnvironmentScope, &brush_core::variables::ShellVariable)>
-pub fn brush_core::env::ShellEnvironment::get_mut<S: core::convert::AsRef<str>>(&mut self, S) -> core::option::Option<(brush_core::env::EnvironmentScope, &mut brush_core::variables::ShellVariable)>
-pub fn brush_core::env::ShellEnvironment::get_mut_using_policy<N: core::convert::AsRef<str>>(&mut self, N, brush_core::env::EnvironmentLookup) -> core::option::Option<&mut brush_core::variables::ShellVariable>
-pub fn brush_core::env::ShellEnvironment::get_using_policy<N: core::convert::AsRef<str>>(&self, N, brush_core::env::EnvironmentLookup) -> core::option::Option<&brush_core::variables::ShellVariable>
-pub fn brush_core::env::ShellEnvironment::is_set<S: core::convert::AsRef<str>>(&self, S) -> bool
-pub fn brush_core::env::ShellEnvironment::unset(&mut self, &str) -> core::result::Result<core::option::Option<brush_core::variables::ShellVariable>, brush_core::error::Error>
-pub fn brush_core::env::ShellEnvironment::update_or_add<N: core::convert::Into<alloc::string::String>>(&mut self, N, brush_core::variables::ShellValueLiteral, impl core::ops::function::Fn(&mut brush_core::variables::ShellVariable) -> core::result::Result<(), brush_core::error::Error>, brush_core::env::EnvironmentLookup, brush_core::env::EnvironmentScope) -> core::result::Result<(), brush_core::error::Error>
-pub fn brush_core::env::ShellEnvironment::update_or_add_array_element<N: core::convert::Into<alloc::string::String>>(&mut self, N, alloc::string::String, alloc::string::String, impl core::ops::function::Fn(&mut brush_core::variables::ShellVariable) -> core::result::Result<(), brush_core::error::Error>, brush_core::env::EnvironmentLookup, brush_core::env::EnvironmentScope) -> core::result::Result<(), brush_core::error::Error>
-pub fn brush_core::variables::ShellVariable::convert_to_associative_array(&mut self) -> core::result::Result<(), brush_core::error::Error>
-pub fn brush_core::variables::ShellVariable::convert_to_associative_array(&mut self) -> core::result::Result<(), brush_core::error::Error>
-pub fn brush_core::variables::ShellVariable::convert_to_indexed_array(&mut self) -> core::result::Result<(), brush_core::error::Error>
-pub fn brush_core::variables::ShellVariable::convert_to_indexed_array(&mut self) -> core::result::Result<(), brush_core::error::Error>
-pub fn brush_core::Shell<SE>::register_builtin<S: core::convert::Into<alloc::string::String>>(&mut self, S, brush_core::builtins::Registration<SE>)
-pub fn brush_core::Shell<SE>::register_builtin_if_unset<S: core::convert::Into<alloc::string::String>>(&mut self, S, brush_core::builtins::Registration<SE>)
-pub async fn brush_core::Shell<SE>::run_program(&mut self, brush_parser::ast::Program, &brush_core::ExecutionParameters) -> core::result::Result<brush_core::results::ExecutionResult, brush_core::error::Error>
-pub fn brush_core::Shell<SE>::env_var(&self, &str) -> core::option::Option<&brush_core::variables::ShellVariable>

Added items

+pub struct brush_core::builtins::HasLocalState
+pub struct brush_core::builtins::NeedsLocalState<St>(_)
+pub brush_core::builtins::Registration::_local: core::marker::PhantomData<L>
+pub brush_core::builtins::Registration::_shared: core::marker::PhantomData<S>
+pub brush_core::builtins::Registration::local_override: core::option::Option<alloc::boxed::Box<dyn brush_core::builtins::AnyState>>
+pub brush_core::builtins::Registration::state_init: fn() -> alloc::boxed::Box<dyn brush_core::builtins::AnyState>
+impl<SE: brush_core::extensions::ShellExtensions, S, L> brush_core::builtins::Registration<SE, S, L>
+pub fn brush_core::builtins::Registration<SE, S, L>::special(self) -> Self
+impl<SE: brush_core::extensions::ShellExtensions, S, St: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static> brush_core::builtins::Registration<SE, S, brush_core::builtins::NeedsLocalState<St>>
+pub fn brush_core::builtins::Registration<SE, S, brush_core::builtins::NeedsLocalState<St>>::with_state(self, St) -> brush_core::builtins::Registration<SE, S, brush_core::builtins::HasLocalState>
+impl<SE: brush_core::extensions::ShellExtensions, S, L> core::clone::Clone for brush_core::builtins::Registration<SE, S, L>
+pub fn brush_core::builtins::Registration<SE, S, L>::clone(&self) -> Self
+pub struct brush_core::builtins::SharedBuilder<T, SE: brush_core::extensions::ShellExtensions>
+impl<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static, SE: brush_core::extensions::ShellExtensions> brush_core::builtins::SharedBuilder<T, SE>
+pub fn brush_core::builtins::SharedBuilder<T, SE>::builtin<L>(self, impl core::convert::Into<alloc::string::String>, brush_core::builtins::Registration<SE, T, L>) -> Self
+pub const fn brush_core::builtins::SharedBuilder<T, SE>::new(T) -> Self
+pub struct brush_core::builtins::SharedHandle<'a, T, SE: brush_core::extensions::ShellExtensions>
+impl<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static, SE: brush_core::extensions::ShellExtensions> brush_core::builtins::SharedHandle<'_, T, SE>
+pub fn brush_core::builtins::SharedHandle<'_, T, SE>::builtin<L>(&mut self, impl core::convert::Into<alloc::string::String>, brush_core::builtins::Registration<SE, T, L>) -> core::result::Result<(), brush_core::error::Error>
+pub trait brush_core::builtins::AnyState: core::marker::Send + core::marker::Sync + 'static
+pub fn brush_core::builtins::AnyState::as_any(&self) -> &dyn core::any::Any
+pub fn brush_core::builtins::AnyState::as_any_mut(&mut self) -> &mut dyn core::any::Any
+pub fn brush_core::builtins::AnyState::clone_box(&self) -> alloc::boxed::Box<dyn brush_core::builtins::AnyState>
+impl<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static> brush_core::builtins::AnyState for T
+pub fn T::as_any(&self) -> &(dyn core::any::Any + 'static)
+pub fn T::as_any_mut(&mut self) -> &mut (dyn core::any::Any + 'static)
+pub fn T::clone_box(&self) -> alloc::boxed::Box<dyn brush_core::builtins::AnyState>
+pub type brush_core::builtins::Command::SharedState: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static
+pub type brush_core::builtins::Command::State: core::clone::Clone + core::default::Default + core::marker::Send + core::marker::Sync + 'static
+pub fn brush_core::builtins::Command::shared<'a, SE: brush_core::extensions::ShellExtensions>(&self, &'a brush_core::commands::ExecutionContext<'_, SE>) -> core::result::Result<&'a Self::SharedState, brush_core::error::Error>
+pub fn brush_core::builtins::Command::state<'a, SE: brush_core::extensions::ShellExtensions>(&self, &'a brush_core::commands::ExecutionContext<'_, SE>) -> core::result::Result<&'a Self::State, brush_core::error::Error>
+pub fn brush_core::builtins::Command::state_mut<'a, SE: brush_core::extensions::ShellExtensions>(&self, &'a mut brush_core::commands::ExecutionContext<'_, SE>) -> core::result::Result<&'a mut Self::State, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::builtin_state<B: brush_core::builtins::Command>(&self) -> core::result::Result<&<B as brush_core::builtins::Command>::State, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::builtin_state<B: brush_core::builtins::Command>(&self) -> core::result::Result<&<B as brush_core::builtins::Command>::State, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::builtin_state_mut<B: brush_core::builtins::Command>(&mut self) -> core::result::Result<&mut <B as brush_core::builtins::Command>::State, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::builtin_state_mut<B: brush_core::builtins::Command>(&mut self) -> core::result::Result<&mut <B as brush_core::builtins::Command>::State, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::shared<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static>(&self) -> core::result::Result<&T, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::shared<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static>(&self) -> core::result::Result<&T, brush_core::error::Error>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::stderr_async(&self) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::stderr_async(&self) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::stdin_async(&self) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::stdin_async(&self) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::stdout_async(&self) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::stdout_async(&self) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::try_fd_async(&self, brush_core::ShellFd) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::commands::ExecutionContext<'_, SE>::try_fd_async(&self, brush_core::ShellFd) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub enum brush_core::env::VarName
+pub brush_core::env::VarName::Auto(alloc::string::String)
+pub brush_core::env::VarName::Direct(alloc::string::String)
+pub brush_core::env::VarName::Resolved
+pub brush_core::env::VarName::Resolved::base: alloc::string::String
+pub brush_core::env::VarName::Resolved::subscript: core::option::Option<alloc::string::String>
+impl brush_core::env::VarName
+pub fn brush_core::env::VarName::direct(impl core::convert::Into<alloc::string::String>) -> Self
+impl core::convert::From<&alloc::string::String> for brush_core::env::VarName
+pub fn brush_core::env::VarName::from(&alloc::string::String) -> Self
+impl core::convert::From<&brush_core::env::ResolvedName> for brush_core::env::VarName
+impl core::convert::From<&brush_core::env::ResolvedName> for brush_core::env::VarName
+pub fn brush_core::env::VarName::from(&brush_core::env::ResolvedName) -> Self
+pub fn brush_core::env::VarName::from(&brush_core::env::ResolvedName) -> Self
+impl core::convert::From<&str> for brush_core::env::VarName
+pub fn brush_core::env::VarName::from(&str) -> Self
+impl core::convert::From<alloc::string::String> for brush_core::env::VarName
+pub fn brush_core::env::VarName::from(alloc::string::String) -> Self
+impl core::convert::From<brush_core::env::ResolvedName> for brush_core::env::VarName
+impl core::convert::From<brush_core::env::ResolvedName> for brush_core::env::VarName
+pub fn brush_core::env::VarName::from(brush_core::env::ResolvedName) -> Self
+pub fn brush_core::env::VarName::from(brush_core::env::ResolvedName) -> Self
+pub struct brush_core::env::ResolvedName
+impl brush_core::env::ResolvedName
+pub fn brush_core::env::ResolvedName::already_resolved(impl core::convert::Into<alloc::string::String>) -> Self
+pub fn brush_core::env::ResolvedName::into_name(self) -> alloc::string::String
+pub fn brush_core::env::ResolvedName::name(&self) -> &str
+pub fn brush_core::env::ResolvedName::subscript(&self) -> core::option::Option<&str>
+pub fn brush_core::env::ResolvedName::without_subscript(&self) -> Self
+pub struct brush_core::env::ResolvedVarRef<'a>
+impl<'a> brush_core::env::ResolvedVarRef<'a>
+pub const fn brush_core::env::ResolvedVarRef<'a>::base_var(&self) -> &'a brush_core::variables::ShellVariable
+pub const fn brush_core::env::ResolvedVarRef<'a>::has_subscript(&self) -> bool
+pub fn brush_core::env::ResolvedVarRef<'a>::resolved_value<SE: brush_core::extensions::ShellExtensions>(&self, &brush_core::Shell<SE>) -> alloc::borrow::Cow<'a, brush_core::variables::ShellValue>
+pub const fn brush_core::env::ResolvedVarRef<'a>::scope(&self) -> brush_core::env::EnvironmentScope
+pub fn brush_core::env::ResolvedVarRef<'a>::value_str<SE: brush_core::extensions::ShellExtensions>(&self, &brush_core::Shell<SE>) -> core::option::Option<alloc::borrow::Cow<'a, str>>
+pub struct brush_core::env::ResolvedVarRefMut<'a>
+impl brush_core::env::ResolvedVarRefMut<'_>
+pub const fn brush_core::env::ResolvedVarRefMut<'_>::base_var(&self) -> &brush_core::variables::ShellVariable
+pub const fn brush_core::env::ResolvedVarRefMut<'_>::base_var_mut(&mut self) -> &mut brush_core::variables::ShellVariable
+pub const fn brush_core::env::ResolvedVarRefMut<'_>::has_subscript(&self) -> bool
+pub const fn brush_core::env::ResolvedVarRefMut<'_>::scope(&self) -> brush_core::env::EnvironmentScope
+pub fn brush_core::env::ResolvedVarRefMut<'_>::value_str<SE: brush_core::extensions::ShellExtensions>(&self, &brush_core::Shell<SE>) -> core::option::Option<alloc::borrow::Cow<'_, str>>
+pub fn brush_core::env::ShellEnvironment::get<S: core::convert::AsRef<str>>(&self, S) -> core::option::Option<brush_core::env::ResolvedVarRef<'_>>
+pub fn brush_core::env::ShellEnvironment::get_mut<S: core::convert::AsRef<str>>(&mut self, S) -> core::option::Option<brush_core::env::ResolvedVarRefMut<'_>>
+pub fn brush_core::env::ShellEnvironment::is_set<S: core::convert::AsRef<str>, SE: brush_core::extensions::ShellExtensions>(&self, S, &brush_core::Shell<SE>) -> bool
+pub fn brush_core::env::ShellEnvironment::lookup<N: core::convert::Into<brush_core::env::VarName>>(&self, N) -> brush_core::env::VarLookup<'_>
+pub fn brush_core::env::ShellEnvironment::lookup_mut<N: core::convert::Into<brush_core::env::VarName>>(&mut self, N) -> brush_core::env::VarLookupMut<'_>
+pub fn brush_core::env::ShellEnvironment::resolve_nameref(&self, &str) -> core::result::Result<brush_core::env::ResolvedName, brush_core::error::Error>
+pub fn brush_core::env::ShellEnvironment::resolve_nameref_or_default(&self, &str) -> brush_core::env::ResolvedName
+pub fn brush_core::env::ShellEnvironment::resolve_nameref_to_name(&self, &str) -> core::result::Result<alloc::string::String, brush_core::error::Error>
+pub fn brush_core::env::ShellEnvironment::unset(&mut self, impl core::convert::Into<brush_core::env::VarName>) -> core::result::Result<core::option::Option<brush_core::variables::ShellVariable>, brush_core::error::Error>
+pub fn brush_core::env::ShellEnvironment::update_or_add(&mut self, impl core::convert::Into<brush_core::env::VarName>, brush_core::variables::ShellValueLiteral, impl core::ops::function::Fn(&mut brush_core::variables::ShellVariable) -> core::result::Result<(), brush_core::error::Error>, brush_core::env::EnvironmentLookup, brush_core::env::EnvironmentScope) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::env::ShellEnvironment::update_or_add_array_element(&mut self, impl core::convert::Into<brush_core::env::VarName>, alloc::string::String, alloc::string::String, impl core::ops::function::Fn(&mut brush_core::variables::ShellVariable) -> core::result::Result<(), brush_core::error::Error>, brush_core::env::EnvironmentLookup, brush_core::env::EnvironmentScope) -> core::result::Result<(), brush_core::error::Error>
+pub struct brush_core::env::VarLookup<'a>
+impl<'a> brush_core::env::VarLookup<'a>
+pub fn brush_core::env::VarLookup<'a>::get(self) -> core::option::Option<brush_core::env::ResolvedVarRef<'a>>
+pub fn brush_core::env::VarLookup<'a>::get_direct(self) -> core::option::Option<(brush_core::env::EnvironmentScope, &'a brush_core::variables::ShellVariable)>
+pub const fn brush_core::env::VarLookup<'a>::in_scope(self, brush_core::env::EnvironmentLookup) -> Self
+pub struct brush_core::env::VarLookupMut<'a>
+impl<'a> brush_core::env::VarLookupMut<'a>
+pub fn brush_core::env::VarLookupMut<'a>::get(self) -> core::option::Option<brush_core::env::ResolvedVarRefMut<'a>>
+pub fn brush_core::env::VarLookupMut<'a>::get_direct(self) -> core::option::Option<(brush_core::env::EnvironmentScope, &'a mut brush_core::variables::ShellVariable)>
+pub const fn brush_core::env::VarLookupMut<'a>::in_scope(self, brush_core::env::EnvironmentLookup) -> Self
+pub trait brush_core::env::VarNameExt: core::marker::Sized
+pub fn brush_core::env::VarNameExt::direct(self) -> brush_core::env::VarName
+impl brush_core::env::VarNameExt for &alloc::string::String
+pub fn &alloc::string::String::direct(self) -> brush_core::env::VarName
+impl brush_core::env::VarNameExt for &str
+pub fn &str::direct(self) -> brush_core::env::VarName
+impl brush_core::env::VarNameExt for alloc::string::String
+pub fn alloc::string::String::direct(self) -> brush_core::env::VarName
+pub fn brush_core::env::valid_nameref_target_name(&str) -> bool
+pub brush_core::error::ErrorKind::BuiltinStateNotRegistered(alloc::string::String)
+pub brush_core::error::ErrorKind::CircularNameReference(alloc::string::String)
+pub brush_core::error::ErrorKind::SharedStateNotRegistered(alloc::string::String)
+pub mod brush_core::openfiles::async_file
+pub enum brush_core::openfiles::async_file::AsyncOpenFile
+pub brush_core::openfiles::async_file::AsyncOpenFile::File(brush_core::openfiles::async_file::SharedFile)
+pub brush_core::openfiles::async_file::AsyncOpenFile::PipeReader(brush_core::openfiles::async_file::SharedPipeReader)
+pub brush_core::openfiles::async_file::AsyncOpenFile::PipeWriter(brush_core::openfiles::async_file::SharedPipeWriter)
+pub brush_core::openfiles::async_file::AsyncOpenFile::Stderr(tokio::io::stderr::Stderr)
+pub brush_core::openfiles::async_file::AsyncOpenFile::Stdin(tokio::io::stdin::Stdin)
+pub brush_core::openfiles::async_file::AsyncOpenFile::Stdout(tokio::io::stdout::Stdout)
+pub brush_core::openfiles::async_file::AsyncOpenFile::Stream(alloc::boxed::Box<dyn brush_core::openfiles::async_file::AsyncStream>)
+impl brush_core::openfiles::async_file::AsyncOpenFile
+impl brush_core::openfiles::async_file::AsyncOpenFile
+pub async fn brush_core::openfiles::async_file::AsyncOpenFile::flush(&mut self) -> core::io::error::Result<()>
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::is_terminal(&self) -> bool
+pub async fn brush_core::openfiles::async_file::AsyncOpenFile::read(&mut self, &mut [u8]) -> core::io::error::Result<usize>
+pub async fn brush_core::openfiles::async_file::AsyncOpenFile::read_to_string(&mut self) -> core::io::error::Result<alloc::string::String>
+pub async fn brush_core::openfiles::async_file::AsyncOpenFile::write(&mut self, &[u8]) -> core::io::error::Result<usize>
+pub async fn brush_core::openfiles::async_file::AsyncOpenFile::write_all(&mut self, &[u8]) -> core::io::error::Result<()>
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::from_pipe_reader(std::io::pipe::PipeReader) -> core::io::error::Result<Self>
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::from_pipe_writer(std::io::pipe::PipeWriter) -> core::io::error::Result<Self>
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::from_std_file(std::fs::File) -> Self
+impl core::convert::From<brush_core::openfiles::OpenFile> for brush_core::openfiles::async_file::AsyncOpenFile
+impl core::convert::From<brush_core::openfiles::OpenFile> for brush_core::openfiles::async_file::AsyncOpenFile
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::from(brush_core::openfiles::OpenFile) -> Self
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::from(brush_core::openfiles::OpenFile) -> Self
+impl tokio::io::async_read::AsyncRead for brush_core::openfiles::async_file::AsyncOpenFile
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::poll_read(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>, &mut tokio::io::read_buf::ReadBuf<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+impl tokio::io::async_write::AsyncWrite for brush_core::openfiles::async_file::AsyncOpenFile
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::poll_flush(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::poll_shutdown(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub fn brush_core::openfiles::async_file::AsyncOpenFile::poll_write(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>, &[u8]) -> core::task::poll::Poll<core::io::error::Result<usize>>
+pub enum brush_core::openfiles::async_file::AsyncOpenFileEntry<'a>
+pub brush_core::openfiles::async_file::AsyncOpenFileEntry::NotPresent
+pub brush_core::openfiles::async_file::AsyncOpenFileEntry::NotSpecified
+pub brush_core::openfiles::async_file::AsyncOpenFileEntry::Open(&'a brush_core::openfiles::async_file::AsyncOpenFile)
+pub struct brush_core::openfiles::async_file::AsyncOpenFiles
+impl brush_core::openfiles::async_file::AsyncOpenFiles
+pub const brush_core::openfiles::async_file::AsyncOpenFiles::STDERR_FD: brush_core::ShellFd
+pub const brush_core::openfiles::async_file::AsyncOpenFiles::STDIN_FD: brush_core::ShellFd
+pub const brush_core::openfiles::async_file::AsyncOpenFiles::STDOUT_FD: brush_core::ShellFd
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::add(&mut self, brush_core::openfiles::async_file::AsyncOpenFile) -> core::result::Result<brush_core::ShellFd, brush_core::error::Error>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::contains_fd(&self, brush_core::ShellFd) -> bool
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::fd_entry(&self, brush_core::ShellFd) -> brush_core::openfiles::async_file::AsyncOpenFileEntry<'_>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::iter_fds(&self) -> impl core::iter::traits::iterator::Iterator<Item = (brush_core::ShellFd, &brush_core::openfiles::async_file::AsyncOpenFile)>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::new() -> Self
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::remove_fd(&mut self, brush_core::ShellFd) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::set_fd(&mut self, brush_core::ShellFd, brush_core::openfiles::async_file::AsyncOpenFile) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::try_fd(&self, brush_core::ShellFd) -> core::option::Option<&brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::try_stderr(&self) -> core::option::Option<&brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::try_stdin(&self) -> core::option::Option<&brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::try_stdout(&self) -> core::option::Option<&brush_core::openfiles::async_file::AsyncOpenFile>
+impl core::convert::From<brush_core::openfiles::OpenFiles> for brush_core::openfiles::async_file::AsyncOpenFiles
+impl core::convert::From<brush_core::openfiles::OpenFiles> for brush_core::openfiles::async_file::AsyncOpenFiles
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::from(brush_core::openfiles::OpenFiles) -> Self
+pub fn brush_core::openfiles::async_file::AsyncOpenFiles::from(brush_core::openfiles::OpenFiles) -> Self
+pub struct brush_core::openfiles::async_file::SharedFile(_)
+impl tokio::io::async_read::AsyncRead for brush_core::openfiles::async_file::SharedFile
+pub fn brush_core::openfiles::async_file::SharedFile::poll_read(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>, &mut tokio::io::read_buf::ReadBuf<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+impl tokio::io::async_write::AsyncWrite for brush_core::openfiles::async_file::SharedFile
+pub fn brush_core::openfiles::async_file::SharedFile::poll_flush(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub fn brush_core::openfiles::async_file::SharedFile::poll_shutdown(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub fn brush_core::openfiles::async_file::SharedFile::poll_write(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>, &[u8]) -> core::task::poll::Poll<core::io::error::Result<usize>>
+pub struct brush_core::openfiles::async_file::SharedPipeReader(_)
+impl tokio::io::async_read::AsyncRead for brush_core::openfiles::async_file::SharedPipeReader
+pub fn brush_core::openfiles::async_file::SharedPipeReader::poll_read(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>, &mut tokio::io::read_buf::ReadBuf<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub struct brush_core::openfiles::async_file::SharedPipeWriter(_)
+impl tokio::io::async_write::AsyncWrite for brush_core::openfiles::async_file::SharedPipeWriter
+pub fn brush_core::openfiles::async_file::SharedPipeWriter::poll_flush(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub fn brush_core::openfiles::async_file::SharedPipeWriter::poll_shutdown(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>) -> core::task::poll::Poll<core::io::error::Result<()>>
+pub fn brush_core::openfiles::async_file::SharedPipeWriter::poll_write(core::pin::Pin<&mut Self>, &mut core::task::wake::Context<'_>, &[u8]) -> core::task::poll::Poll<core::io::error::Result<usize>>
+pub trait brush_core::openfiles::async_file::AsyncStream: tokio::io::async_read::AsyncRead + tokio::io::async_write::AsyncWrite + core::marker::Send + core::marker::Sync + core::marker::Unpin
+pub fn brush_core::openfiles::async_file::AsyncStream::clone_box(&self) -> alloc::boxed::Box<dyn brush_core::openfiles::async_file::AsyncStream>
+pub fn brush_core::openfiles::async_file::AsyncStream::try_borrow_as_fd(&self) -> core::result::Result<std::os::fd::owned::BorrowedFd<'_>, brush_core::error::Error>
+pub fn brush_core::openfiles::async_file::AsyncStream::try_clone_to_owned(&self) -> core::result::Result<std::os::fd::owned::OwnedFd, brush_core::error::Error>
+pub enum brush_core::variables::DynamicValueKind
+pub brush_core::variables::DynamicValueKind::AssociativeArray
+pub brush_core::variables::DynamicValueKind::IndexedArray
+pub brush_core::variables::DynamicValueKind::Scalar
+pub brush_core::variables::ShellValue::Dynamic::kind: brush_core::variables::DynamicValueKind
+pub fn brush_core::variables::ShellValue::has_element_at(&self, &str, &brush_core::Shell<impl brush_core::extensions::ShellExtensions>) -> bool
+pub fn brush_core::variables::ShellValue::has_element_at(&self, &str, &brush_core::Shell<impl brush_core::extensions::ShellExtensions>) -> bool
+pub fn brush_core::variables::ShellVariable::convert_to_associative_array(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_associative_array(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_associative_array_for_reassignment(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_associative_array_for_reassignment(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_indexed_array(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_indexed_array(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_indexed_array_for_reassignment(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub fn brush_core::variables::ShellVariable::convert_to_indexed_array_for_reassignment(&mut self, core::option::Option<&brush_core::variables::ShellValue>) -> core::result::Result<(), brush_core::error::Error>
+pub brush_core::ErrorKind::BuiltinStateNotRegistered(alloc::string::String)
+pub brush_core::ErrorKind::CircularNameReference(alloc::string::String)
+pub brush_core::ErrorKind::SharedStateNotRegistered(alloc::string::String)
+pub brush_core::ShellValue::Dynamic::kind: brush_core::variables::DynamicValueKind
+pub fn brush_core::ExecutionParameters::try_fd_async(&self, &brush_core::Shell<impl brush_core::extensions::ShellExtensions>, brush_core::ShellFd) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::ExecutionParameters::try_stderr_async(&self, &brush_core::Shell<impl brush_core::extensions::ShellExtensions>) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::ExecutionParameters::try_stdin_async(&self, &brush_core::Shell<impl brush_core::extensions::ShellExtensions>) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::ExecutionParameters::try_stdout_async(&self, &brush_core::Shell<impl brush_core::extensions::ShellExtensions>) -> core::option::Option<brush_core::openfiles::async_file::AsyncOpenFile>
+pub fn brush_core::Shell<SE>::builtin_state<T: 'static>(&self, &str) -> core::option::Option<&T>
+pub fn brush_core::Shell<SE>::builtin_state_mut<T: 'static>(&mut self, &str) -> core::option::Option<&mut T>
+pub fn brush_core::Shell<SE>::builtin_state_mut_of<B: brush_core::builtins::Command>(&mut self, &str) -> core::option::Option<&mut <B as brush_core::builtins::Command>::State>
+pub fn brush_core::Shell<SE>::builtin_state_of<B: brush_core::builtins::Command>(&self, &str) -> core::option::Option<&<B as brush_core::builtins::Command>::State>
+pub fn brush_core::Shell<SE>::get_shared<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static>(&self) -> core::result::Result<&T, brush_core::error::Error>
+pub fn brush_core::Shell<SE>::register_builtin<L>(&mut self, impl core::convert::Into<alloc::string::String>, brush_core::builtins::Registration<SE, (), L>)
+pub fn brush_core::Shell<SE>::register_builtin_if_unset<L>(&mut self, impl core::convert::Into<alloc::string::String>, brush_core::builtins::Registration<SE, (), L>)
+pub fn brush_core::Shell<SE>::register_shared<T>(&mut self, brush_core::builtins::SharedBuilder<T, SE>) where T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static
+pub fn brush_core::Shell<SE>::set_shared<T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static>(&mut self, T)
+pub fn brush_core::Shell<SE>::shared<T: 'static>(&self) -> core::option::Option<&T>
+pub fn brush_core::Shell<SE>::shared_handle<T>(&mut self) -> brush_core::builtins::SharedHandle<'_, T, SE> where T: core::clone::Clone + core::marker::Send + core::marker::Sync + 'static
+pub async fn brush_core::Shell<SE>::run_program(&mut self, &brush_parser::ast::Program, &brush_core::ExecutionParameters) -> core::result::Result<brush_core::results::ExecutionResult, brush_core::error::Error>
+pub async fn brush_core::Shell<SE>::source_program<S: core::convert::Into<alloc::string::String>, I: core::iter::traits::iterator::Iterator<Item = S>>(&mut self, &brush_parser::ast::Program, &brush_core::sourceinfo::SourceInfo, I, &brush_core::ExecutionParameters) -> core::result::Result<brush_core::results::ExecutionResult, brush_core::error::Error>
+pub fn brush_core::Shell<SE>::env_is_set(&self, &str) -> bool
+pub fn brush_core::Shell<SE>::env_var(&self, &str) -> core::option::Option<brush_core::env::ResolvedVarRef<'_>>

Changed items

-pub struct brush_core::builtins::Registration<SE: brush_core::extensions::ShellExtensions>
+pub struct brush_core::builtins::Registration<SE: brush_core::extensions::ShellExtensions, S, L>
-pub fn brush_core::builtins::builtin<B: brush_core::builtins::Command + core::marker::Send + core::marker::Sync, SE: brush_core::extensions::ShellExtensions>() -> brush_core::builtins::Registration<SE>
+pub fn brush_core::builtins::builtin<B: brush_core::builtins::Command + core::marker::Send + core::marker::Sync, SE: brush_core::extensions::ShellExtensions>() -> brush_core::builtins::Registration<SE, <B as brush_core::builtins::Command>::SharedState, brush_core::builtins::NeedsLocalState<<B as brush_core::builtins::Command>::State>>
-pub fn brush_core::builtins::decl_builtin<B: brush_core::builtins::DeclarationCommand + core::marker::Send + core::marker::Sync, SE: brush_core::extensions::ShellExtensions>() -> brush_core::builtins::Registration<SE>
+pub fn brush_core::builtins::decl_builtin<B: brush_core::builtins::DeclarationCommand + core::marker::Send + core::marker::Sync, SE: brush_core::extensions::ShellExtensions>() -> brush_core::builtins::Registration<SE, <B as brush_core::builtins::Command>::SharedState, brush_core::builtins::NeedsLocalState<<B as brush_core::builtins::Command>::State>>
-pub fn brush_core::builtins::raw_arg_builtin<B: brush_core::builtins::DeclarationCommand + core::default::Default + core::marker::Send + core::marker::Sync, SE: brush_core::extensions::ShellExtensions>() -> brush_core::builtins::Registration<SE>
+pub fn brush_core::builtins::raw_arg_builtin<B: brush_core::builtins::DeclarationCommand + core::default::Default + core::marker::Send + core::marker::Sync, SE: brush_core::extensions::ShellExtensions>() -> brush_core::builtins::Registration<SE, <B as brush_core::builtins::Command>::SharedState, brush_core::builtins::NeedsLocalState<<B as brush_core::builtins::Command>::State>>
-pub fn brush_core::ShellBuilder<SE, S>::builtin(self, impl core::convert::Into<alloc::string::String>, brush_core::builtins::Registration<SE>) -> Self
+pub fn brush_core::ShellBuilder<SE, S>::builtin<L>(self, impl core::convert::Into<alloc::string::String>, brush_core::builtins::Registration<SE, (), L>) -> Self

Public API changes for crate: brush-experimental-builtins

Removed items

-pub trait brush_experimental_builtins::ShellBuilderExt
-pub fn brush_experimental_builtins::ShellBuilderExt::experimental_builtins(self) -> Self
-impl<SE: brush_core::extensions::ShellExtensions, S: brush_core::shell::builder::shell_builder::State> brush_experimental_builtins::ShellBuilderExt for brush_core::shell::builder::ShellBuilder<SE, S>
-pub fn brush_core::shell::builder::ShellBuilder<SE, S>::experimental_builtins(self) -> Self
-pub fn brush_experimental_builtins::experimental_builtins<SE: brush_core::extensions::ShellExtensions>() -> std::collections::hash::map::HashMap<alloc::string::String, brush_core::builtins::Registration<SE>>

Added items

+pub fn brush_experimental_builtins::register_experimental_builtins<SE: brush_core::extensions::ShellExtensions>(&mut brush_core::shell::Shell<SE>)

Public API changes for crate: brush-parser

Added items

+pub fn brush_parser::arithmetic::parse_with(&str, brush_parser::ParserImpl) -> core::result::Result<brush_parser::ast::ArithmeticExpr, brush_parser::WordParseError>
+pub brush_parser::ast::Program::comments: alloc::vec::Vec<brush_parser::SourceSpan>
+pub fn brush_parser::prompt::parse_with(&str, brush_parser::ParserImpl) -> core::result::Result<alloc::vec::Vec<brush_parser::prompt::PromptPiece>, brush_parser::WordParseError>
+pub fn brush_parser::readline_binding::parse_key_sequence_readline_binding_with(&str, brush_parser::ParserImpl) -> core::result::Result<brush_parser::readline_binding::KeySequenceReadlineBinding, brush_parser::BindingParseError>
+pub fn brush_parser::readline_binding::parse_key_sequence_shell_cmd_binding_with(&str, brush_parser::ParserImpl) -> core::result::Result<brush_parser::readline_binding::KeySequenceShellCommandBinding, brush_parser::BindingParseError>
+pub fn brush_parser::readline_binding::parse_key_sequence_with(&str, brush_parser::ParserImpl) -> core::result::Result<brush_parser::readline_binding::KeySequence, brush_parser::BindingParseError>
+pub mod brush_parser::winnow_str
+pub struct brush_parser::winnow_str::ParseContext<'a>
+pub brush_parser::winnow_str::ParseContext::comments: &'a core::cell::RefCell<alloc::vec::Vec<core::ops::range::Range<usize>>>
+pub brush_parser::winnow_str::ParseContext::options: &'a brush_parser::ParserOptions
+pub brush_parser::winnow_str::ParseContext::pending_heredoc_trailing: &'a core::cell::RefCell<core::option::Option<&'a str>>
+pub brush_parser::winnow_str::ParseContext::source_info: &'a brush_parser::SourceInfo
+pub struct brush_parser::winnow_str::PositionTracker
+impl brush_parser::winnow_str::PositionTracker
+pub fn brush_parser::winnow_str::PositionTracker::new(&str) -> Self
+pub fn brush_parser::winnow_str::parse_program(&str, &brush_parser::ParserOptions, &brush_parser::SourceInfo) -> core::result::Result<brush_parser::ast::Program, brush_parser::ParseError>
+pub type brush_parser::winnow_str::StrStream<'a> = winnow::stream::locating::LocatingSlice<&'a str>
+pub brush_parser::ParserImpl::Winnow

Changed items

-pub brush_parser::WordParseError::ArithmeticExpression(brush_parser::ParseErrorLocation)
+pub brush_parser::WordParseError::ArithmeticExpression(alloc::string::String)
-pub brush_parser::WordParseError::Prompt(brush_parser::ParseErrorLocation)
+pub brush_parser::WordParseError::Prompt(alloc::string::String)

Public API changes for crate: brush-shell

Added items

+pub brush_shell::args::CommandLineArgs::peg_parser: bool

Performance Benchmark Report

Benchmark name Baseline (μs) Test/PR (μs) Delta (μs) Delta %
clone_shell_object 18.29 μs 23.48 μs 5.19 μs 🟠 +28.40%
eval_arithmetic 0.13 μs 0.13 μs -0.00 μs ⚪ Unchanged
expand_one_string 1.69 μs 1.92 μs 0.23 μs 🟠 +13.95%
for_loop 30.23 μs 32.94 μs 2.71 μs 🟠 +8.98%
full_peg_complex 55.05 μs 54.41 μs -0.64 μs 🟢 -1.16%
full_peg_for_loop 6.27 μs 6.50 μs 0.22 μs 🟠 +3.54%
full_peg_nested_expansions 15.67 μs 15.28 μs -0.40 μs 🟢 -2.53%
full_peg_pipeline 4.14 μs 4.26 μs 0.12 μs 🟠 +2.90%
full_peg_simple 1.71 μs 1.80 μs 0.09 μs 🟠 +5.51%
function_call 3.90 μs 3.83 μs -0.06 μs ⚪ Unchanged
instantiate_shell 55.15 μs 57.59 μs 2.44 μs 🟠 +4.43%
instantiate_shell_with_init_scripts 24973.45 μs 28579.25 μs 3605.80 μs 🟠 +14.44%
parse_peg_bash_completion 2226.02 μs 2231.98 μs 5.96 μs ⚪ Unchanged
parse_peg_complex 19.23 μs 19.71 μs 0.49 μs 🟠 +2.54%
parse_peg_for_loop 1.91 μs 2.01 μs 0.10 μs 🟠 +5.25%
parse_peg_pipeline 2.01 μs 2.11 μs 0.09 μs 🟠 +4.67%
parse_peg_simple 1.04 μs 1.09 μs 0.05 μs 🟠 +4.41%
run_echo_builtin_command 13.44 μs 14.01 μs 0.56 μs 🟠 +4.19%
tokenize_sample_script 3.43 μs 3.50 μs 0.06 μs 🟠 +1.86%

Benchmarks added:

  • full_winnow_str_for_loop
  • extended_test_simple
  • extended_test_nested
  • full_winnow_str_nested_expansions
  • full_winnow_str_simple
  • extended_test_complex
  • extended_test_binary
  • extended_test_regex
  • extended_test_complex_regex
  • full_winnow_str_pipeline
  • parse_winnow_str_complex
  • parse_winnow_str_simple
  • extended_test_logical
  • full_winnow_str_complex
  • parse_winnow_str_for_loop
  • parse_winnow_str_pipeline

Code Coverage Report: Only Changed Files listed

Package Coverage
Overall Coverage 🟢 34.55%

Minimum allowed coverage is 20%, this run produced 34.55%
Maximum allowed coverage difference is -5%

Test Summary: bash-completion test suite

Outcome Count Percentage
✅ Pass 13 0.62
❗️ Error 2087 98.96
❎ Expected Fail 9 0.43
📊 Total 2109 100.00

OctopusET added a commit to OctopusET/brush that referenced this pull request Feb 14, 2026
Convert winnow_str.rs from a single file into a directory module with
submodules organized by parser concern:

- mod.rs: types (PError, StrStream, ParseContext) and parse_program entry
- position.rs: PositionTracker with line break caching
- chars.rs: character-level parsers, whitespace, separators, keywords
- word.rs: balanced delimiters, expansions, quoting, word assembly
- redirect.rs: I/O redirections, here-documents
- command.rs: simple commands, assignments, command dispatch
- pipeline.rs: pipe sequences, pipelines, and/or lists
- compound.rs: compound lists, subshells, brace groups, if/while/for/case
- extended_test.rs: extended test [[ ]] expressions
- function.rs: function definitions, compound command dispatch
- program.rs: complete commands and top-level program

This includes the full winnow parser implementation from PR reubeno#989 rather
than just the scaffold, structured into modules from the start.
@lu-zero
lu-zero force-pushed the for-portage-repo branch 6 times, most recently from cda64e6 to fcbf9f4 Compare February 22, 2026 16:41
Comment thread brush-interactive/src/minimal/input_backend.rs Fixed
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from 6097665 to 67672ce Compare February 24, 2026 21:13
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from 6ab6863 to 8d41c7c Compare March 10, 2026 07:47
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from a0d22d3 to f92f312 Compare March 19, 2026 21:25
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from cd47497 to b19d6b7 Compare April 2, 2026 21:37
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from b12c0fa to 1d260b3 Compare April 4, 2026 19:20
Comment thread brush-interactive/src/minimal/input_backend.rs Fixed
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from 6b4d28a to cf600d3 Compare April 12, 2026 19:11
@lu-zero
lu-zero force-pushed the for-portage-repo branch 7 times, most recently from febf353 to 14502d4 Compare May 11, 2026 21:29
@lu-zero
lu-zero force-pushed the for-portage-repo branch from 14502d4 to abbd993 Compare May 27, 2026 16:33

/// Registers experimental built-in commands on the given shell.
pub fn register_experimental_builtins<SE: brush_core::extensions::ShellExtensions>(
shell: &mut brush_core::Shell<SE>,
Comment thread brush-parser/src/parser/winnow_str/compound.rs Fixed
Comment thread brush-parser/src/parser/winnow_str/compound.rs Fixed
@lu-zero
lu-zero force-pushed the for-portage-repo branch from abbd993 to 4450a11 Compare May 28, 2026 07:21
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from eaf5928 to 00ca9c5 Compare June 15, 2026 05:34
@lu-zero
lu-zero force-pushed the for-portage-repo branch from 3b69419 to 92ebb64 Compare July 16, 2026 07:51
@lu-zero
lu-zero force-pushed the for-portage-repo branch 2 times, most recently from 940bec3 to 636eadd Compare July 29, 2026 16:55
lu-zero added 10 commits August 1, 2026 15:43
Async file views share OpenFile Arcs so subshells do not exhaust fds.
Includes wasm stdio polyfill and tokio fs/io-std features.

Assisted-by: Grok:grok-4.5
Use async reads/writes for non-terminal streams where Portage work
already did so (mapfile, read, echo, printf, and peers).

Assisted-by: Grok:grok-4.5
AnyState/Command::State, SharedBuilder/SharedHandle, source_program,
and factory/registry wiring used by Portage-oriented extensions.

Assisted-by: Grok:grok-4.5
Split env into env/mod.rs + env/names.rs; resolve namerefs in expansion
and builtins; comprehensive nameref compat tests.

Assisted-by: Grok:grok-4.5
DynamicValueKind, declare -a/-A conversion, de-special scalar dynamics,
assoc key indexing, freeze snapshots.

Assisted-by: Grok:grok-4.5
Modular winnow_str parser, tokenizer/word case-in-subst handling,
comment span tracking, and parser unit/snapshot tests.

Assisted-by: Grok:grok-4.5
Shell entry defaults, interactive bits, Cargo.lock, typos allowlist,
and leftover workflow/docs updates.

Assisted-by: Grok:grok-4.5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants