Skip to content

Release notes

brush v0.4.0

View on GitHub

🚀 Release Notes

This is a significant release, containing several months of work and more than 200 merged PRs. It includes a broad set of new features, bug fixes, and quality improvements, most notably a myriad of bash compatibility fixes that materially raise the bar on which real-world scripts and interactive sessions brush can handle.

Some key highlights:

  • A meaningful step forward in bash compatibility. Major bash language features are now implemented or substantially expanded, e.g.: set -e, set -u, pipefail, failglob, the ERR trap, coprocesses, and a great deal more.
  • Improved robustness across edge cases. Closed pipes, broken stdout, unusual file-descriptor states, non-UTF8 history files, and platform corner cases are now handled gracefully. A systematic audit also removed an entire class of avoidable failure modes.
  • Broader platform support. Using brush as a login shell on macOS is now supported, Windows path handling is overhauled, FreeBSD, Android and 32-bit targets build cleanly again, and wasm32-wasip2 is now exercised in CI.
  • A more capable interactive shell. Optional TOML config, zsh-style preexec/precmd hooks, experimental terminal integration, expanded readline-macro support, and many completion improvements.
  • API improvements and foundations for what's next. Scaffolding for a winnow-based parser, a generic Shell<Extensions> for embedders, an opt-in bundled-coreutils build, and serde features for both AST and shell state. This work has required breaking changes to API surface, mostly to brush-core. Some changes were also made to brush-parser's API but we expect migration for parser-only consumers to be straightforward and relatively minimal. Please reach out to us if you encounter challenges in this area.

A heartfelt thank-you to everyone who filed issues, reproduced bugs on unusual platforms, and contributed code over the last several months 🙏. A significant percentage of the work below is in direct response to community reports.


✅ bash compatibility

This release expands brush's coverage of widely-used bash language features. Among the most commonly-relied-on additions:

  • set -e (errexit) and pipefail (#852) are implemented with bash-faithful semantics, including the long list of exemptions bash has accumulated over the years. See the compatibility reference for the current status of supported set options.
  • set -u (nounset) (#774, #1007) now actually errors on unset variable references, including the subtle interaction with ${#arr[i]}.
  • failglob (#1011) treats no-match globs as an error.
  • The ERR trap (#1020) is implemented, complementing the EXIT trap work from the previous release. As a corollary, EXIT traps now also fire correctly under -c (#1080).
  • Coprocesses (coproc) (#1029, #1068), both parsing and execution. See the compatibility reference.
  • A new --noglob/-f command-line flag (#1091), proper -- option-terminator handling for -c (#1076), and an exit code of 2 for unknown command-line options (#1050).

Heads up: because set -e, set -u, pipefail, and failglob previously had limited effect in brush, scripts that ran cleanly under v0.3.0 may now exit with errors that bash would also have produced. This is the intended behavior. If you see a divergence from bash, please file an issue.

Beyond the headline options, this release lands a long list of more focused compatibility fixes. Many are small, but in aggregate they account for the bulk of the change list. Highlights worth calling out:

  • Arithmetic got serious attention: high-radix literals (#1019), faithful overflow/underflow (#1017), legacy $[expr] syntax (#1004), the missing |= and ^= assignment operators (#911), array indices inside array indices (#910), arithmetic-for parsing/eval fixes (#1018), and infinite-recursion detection (#1021).
  • Heredocs are substantially more robust inside command substitutions and quoted contexts (#1014, #1055, #1056, #1067).
  • Pattern and extglob correctness work covers escaped parens (#960), backslash preservation (#963), pattern character-set escaping (#824), brace-sequence step direction (#1025), and the nullglob + quoted-empty-string interaction (#1035).
  • Builtins matured across the board: caller was added (#812), read is now much closer to feature-complete (#914), mapfile -O works (#558), getopts got OPTERR semantics (#1048) and short-option fixes (#827), compgen -A picked up binding, command, and reserved-word completion (#814, #1027, #1047), printf %q quotes empty strings as '' (#1026), and the rules for shadowing special builtins with functions are now correct (#922).
  • Variables and prompts: BASH_ARGC/BASH_ARGV (#1013) and $_ (#1030) are populated; OSTYPE is set on macOS (#1097); prompts handle \l, \[/\], and $? correctly (#913, #909, #798); and $- correctly reflects -c (#767).

If you've previously hit a bash-compatibility issue with brush, there's a decent chance it's resolved here. If not, please open an issue!


Robustness improvements

v0.4.0 also includes a substantial amount of plumbing work that won't show up in our feature lists but contributed to raising our quality. A big thanks to contributors who put these (and others) together:

  • A systematic unwrap() audit (#921) hardened brush against a class of unusual-input edge cases.
  • Closed stdout and stderr are now handled gracefully; this is important when brush is on the producing side of a | head pipeline (#873, #875).
  • File-descriptor failures (e.g., dup failures from clone) are now reported cleanly rather than aborting (#1051).
  • Path search now finds executables reachable via symlinks (#991, #992), broadening the set of environments where commands resolve as expected.
  • History import tolerates non-UTF8 and otherwise unusual entries (#878).
  • Regex-cache contention under concurrent use is reduced (#1043), with additional allocation-reduction work in brace expansion and other hot paths (#884, #886, #936, #940).

Broader platform support

We aim for portability and this release advances that goal on several fronts:

  • macOS: using brush as your login shell is now supported, thanks to a fix for a startup hang in that scenario (#1095). If you'd like to set brush as your chsh target on a Mac, please give it a try.
  • Windows: broad path-handling improvements (#1075), proper /dev/null emulation (#1044, #1104), and CI now exercises the Windows test suite (#1083) to keep the platform on solid footing. Windows support remains in an experimental state, but it has matured meaningfully this cycle. If you've tried brush on Windows previously, this is a good time to revisit, and we'd appreciate hearing how it goes.
  • FreeBSD builds again (#980).
  • Android and 32-bit targets build cleanly (#1070).
  • WebAssembly: split_paths is now safe under WASM (#1064), and basic wasm32-wasip2 smoke tests run in CI (#1098).

Interactive shell improvements

The interactive experience picked up several things that interactive-shell users have requested:

  • TOML configuration file for brush-shell: an opt-in alternative to shell-script-based configuration for brush-specific shell-level settings (#895). See the configuration reference for the file format, location, and available settings. Experimental.
  • preexec / precmd hooks in the style of zsh: useful for prompt frameworks, timing, integration tools (#652). Enable via the [experimental] zsh-hooks setting documented in the configuration reference. Experimental.
  • Shell/terminal integration: semantic prompt and command marking that modern terminals can use to enable command navigation, exit-status display, and similar features (#872). Enable via the [experimental] terminal-shell-integration setting in the configuration reference. Experimental.
  • Readline macros: initial support (#880) plus follow-up to handle more macro forms found in real inputrc files (#967). Many additional fixes to improve compatibility with shell extension tools like starship, atuin, fzf, and others.
  • Hint-acceptance key bindings are now exposed (#802).
  • A bag of completion fixes that mostly fall under "things you'd never notice unless they were broken": filenames with spaces and special characters now escape correctly (#870); shell variables get a sensible default fallback completion (#954); . and .. are offered (#887); mark-directories is honored (#817); COMP_KEY/COMP_TYPE are populated for completion functions (#1008); COMP_WORDBREAKS default matches bash (#828); word tokenizing during completion was corrected (#816); and deduplication of completions is deferred to the presentation layer so functions see the full list (#1012).
  • Profile/rc loading is now deferred until the input backend is attached (#879), which matters for rc files that probe terminal capabilities at startup.

For embedders and crate consumers

The brush crates are published to crates.io, and several of the changes in this release are aimed at people building on top of brush-core, brush-parser, et al. The most important ones:

  • Shell is now generic over a ShellExtensions type parameter (#941). This is the scaffolding that lets embedders extend brush with custom builtins, custom variable behavior, and other hooks without forking. Existing code that names Shell directly will need to either pick a concrete extension type or thread the generic through; a default extension type is provided for the common case. We plan to continue building on this for better low-overhead, static inspection and extension of brush-core behaviors.
  • Shell fields are now private (#900) and shell.rs was split into shell/*.rs (#945). Callers using the public re-exports and accessor/builder methods are unaffected; callers reaching into private state will need to migrate.
  • serde features are now available on both brush-parser (#783) and brush-core (#831) for AST and shell-state serialization. This makes a number of new use cases viable, e.g.: memoizing initialization, snapshotting shell state.
  • PEG parser reorganization (#899) along with scaffolding for a future winnow-based parser (#974). The PEG parser remains the production parser; the winnow work is groundwork for a faster, more diagnosable replacement in a future release.
  • brush-parser: ParsingNearToken was renamed to ParsingNear (#1022).
  • MSRV bumped to Rust 1.88 (#981).
  • fuzz-testing Cargo feature was renamed to arbitrary (#844) to better reflect what it actually gates.
  • Build/test/validate scripting moved to cargo xtask subcommands (#898); see cargo xtask --help.

Experimental work to keep an eye on

A few items in this release are intentionally marked experimental; they are usable today, but the shape of the API or UX may evolve based on feedback (hint: we want your feedback!):

  • Bundled coreutils builtins behind a feature flag (#1031). Opt in at build time to ship a single binary that resolves common utilities (ls, cat, etc.) internally, useful for container/embedded scenarios where a coreutils package isn't available, or for platforms like Windows that don't typically offer these utilities. See the experimental features reference.
  • Full shell-state serialization via the experimental save builtin (#835): primarily a debugging and tooling aid today, but a building block for future features. See the experimental features reference.
  • The TOML config, preexec/precmd, and terminal-integration features mentioned above are all in the experimental bucket. The experimental features reference covers how to enable each one. Try them and tell us what feels off.

Application-level breaking changes

If you're a script author or interactive user (rather than an embedder), these are the changes most likely to be visible to you:

  • Stricter set -e / set -u / pipefail / failglob enforcement. These options had limited effect in v0.3.0; they now behave like bash. Scripts that previously ran without surfacing errors may need updates.
  • readonly now operates on global scope (#1003), matching bash. Code that depended on the prior local behavior will observe a difference.
  • Reserved words are rejected as function names (#978).
  • Unknown command-line options exit with code 2 (#1050), matching bash.
  • Profile/rc loading happens after input backend attach (#879). Visible only to rc files that probed for terminal capabilities at startup.

🙏 Acknowledgments

Releases like this one don't happen without the people who file thoughtful issues, reproduce bugs on platforms the maintainers don't have access to, and send code. Thank you to everyone who contributed to this release! Whether your name appears below or you helped via an issue, a discussion, or a reproducing test case we value and count on your contribution.

Special thanks go to the contributors whose work shows up in many of the bullet points above:

  • @lu-zero - has been the driving force behind a multi-release effort to modernize brush's parser and improve bash compatibility from the ground up. The work landing in this release is laying the groundwork for substantially more significant parser, diagnostics, and compatibility improvements in upcoming release: enriched ASTs, source-location tracking, parser reorganization, and the early scaffolding for a winnow-based parser. Thank you for the sustained, foundational contributions.
  • @Elsie19 - focused, high-quality bash-compat fixes spread across builtins, expansion, and corner cases.
  • @oech3 - ongoing edge-case testing, exit-code validation, and bug finding.
  • @StudioLE - surgical heredoc / tokenizer fixes that resolved a cluster of long-standing parser bugs.
  • @takeshiD and @xtqqczze - repeated, well-targeted contributions across the codebase.

And thank you to everyone else who authored or co-authored a commit in this release:

If you contributed and aren't listed here, that's a bug and unintentional! Please let me know and I'll correct it.


The full change list

For the exhaustive, auto-generated list of every commit and PR since brush v0.3.0, see CHANGELOG.md.

brush v0.3.0

View on GitHub

🚀 Release Notes

This is a major release, containing architectural improvements and compatibility-focused features and fixes. A big thanks to all of the contributors over the last few months, including issue filers, question-askers, and code contributors 🙏.

Based on user-filed issues (thank you!), targeted work went into improving compatibility with popular tools like fzf and neofetch.

Additionally, a significant amount of work went into refactoring and improving usability of the public API surface within the crate-based libraries that make up brush's core. These come with breaking changes for programmatic clients, but we're confident they will come with significant benefit.

The following summary covers the most notable changes and the full change details are below.

✅ Features and Improvements

Builtins
  • The fc builtin received its initial implementation!
  • bind implementation received support for binding key sequences to readline functions (e.g., "\C-a":beginning-of-line).
  • trap now fully implements the EXIT trap.
Standard variables
  • Basic support for use of BASH_XTRACEFD was added. A new command-line parameter to brush (--inherit-fd) enables allow-listing inherited file descriptors for use within the shell.
Control flow
  • Support for an undocumented C-like syntax for arithmetic for loops has been implemented for improved compatibility.

🪳 Notable bug fixes

  • Fixes for quote handling of \' in double-quoted word contexts.
  • Targeted fixes to history importing make it more robust against non-UTF8 compatible text.
  • Fixes for parsing of here-documents in quoted command substitutions.
  • Fixes for nuanced quote removal in parameter expressions with replacements (e.g., "${var:+'x'}").
  • Fixes for command substitution expansions resulting in spawning processes with large volumes of output (e.g., $(emit-a-lot-of-text)).
  • Updates to the open file table made by commandless exec (e.g., exec 2>/dev/null) are now reflected immediately, even when in a loop context.

🚧 API Changes

Changes in this section pertain to programmatic clients of the brush-core, brush-parser, and brush-interactive crates. They do not apply to application-level shell users.

brush-builtins

All shell builtins have been moved into a new dedicated brush-builtins crate. With this move, significant refactoring was done to ensure that these builtins are all implementable using public APIs exposed by brush-core. In doing so, this also significantly advanced the richness of the latter APIs.

Important

Programmatic clients of the brush-core crate will find that a constructed Shell is not automatically populated with the usual set of builtins. New optional APIs exist in the brush-builtins crate to retrieve default builtins and in brush-core to register them with a Shell instance.

Parsing and AST

As an important step on our journey to evolve brush's parsers, @lu_zero has made contributions that start enriching our parsed Abstract Syntax Trees (ASTs) with links back to the source text. As part of this work, a new SourceLocation trait was introduced and implemented for many AST node types. Work will continue in the coming releases.

API Ergonomics

To improve ergonomics, we've introduce builder-based construction utilities to key structures like brush_core::Shell. We will continue to expand on this adoption over time to simplify the work of constructing these values.

Note that the signature of Shell::new() has changed and may require adjustment in callers.

Error handling

As preparatory work for future improvements, we've overhauled the core error types and execution result types in brush-core:

  • Error has been renamed to ErrorKind, with a new wrapping Error struct type that can carry additional context. This will be used in the future for improved diagnostics.

  • Clients of brush-core can now provide their own custom error formatter to render a displayable string from an Error value. This will be used by some of our frontends for fancier diagnostics in the future. It also decouples error formatting from writing.

  • Multiple overlapping result types across the core interpreter, command utilities, and builtins have been consolidated into a coherent set of ExecutionResult, ExecutionExitCode, and ExecutionControlFlow types. Along the way a handful of bugs for edge cases were identified and resolved as part of the streamlining.

Details

  • build(deps): bump the github-actions group with 6 updates by @dependabot[bot] in #669
  • build(deps): bump procfs from 0.17.0 to 0.18.0 in the cargo group across 1 directory by @dependabot[bot] in #671
  • build(deps): bump the github-actions group with 5 updates by @dependabot[bot] in #675
  • Add a ShellBuilder by @lu-zero in #651
  • build(deps): bump the cargo group with 4 updates by @dependabot[bot] in #676
  • fix: clean cache in cd pipeline by @reubeno in #679
  • ci: run static code checks on linux + macOS too by @reubeno in #678
  • build(deps): bump serde from 1.0.221 to 1.0.223 in the cargo group by @dependabot[bot] in #680
  • build(deps): bump the github-actions group with 5 updates by @dependabot[bot] in #681
  • build(deps): bump the github-actions group with 2 updates by @dependabot[bot] in #683
  • build(deps): bump the cargo group with 5 updates by @dependabot[bot] in #684
  • chore: fix build error with cargo nightly by @reubeno in #687
  • build(deps): bump the github-actions group with 4 updates by @dependabot[bot] in #685
  • build(deps): bump the cargo group with 3 updates by @dependabot[bot] in #686
  • refactor: use Shell builder pattern in more code by @reubeno in #688
  • refactor: update Shell::new() to take creation options as owned by @reubeno in #689
  • ci: fix benchmark execution by @reubeno in #691
  • refactor: move builtins into their own crate by @reubeno in #690
  • refactor: Shell struct API improvements by @reubeno in #692
  • chore(msrv)!: upgrade MSRV to 1.87.0 by @reubeno in #693
  • refactor: os_pipe::pipe() -> std::io::pipe() by @reubeno in #695
  • chore: update dependencies by @reubeno in #696
  • build(deps): bump the github-actions group with 6 updates by @dependabot[bot] in #697
  • build(deps): bump bon from 3.7.2 to 3.8.0 in the cargo group by @dependabot[bot] in #698
  • build(deps): bump the github-actions group with 4 updates by @dependabot[bot] in #707
  • build(deps): bump the cargo group with 5 updates by @dependabot[bot] in #708
  • fix: workaround error on nightly by @reubeno in #711
  • fix: don't fail importing unreadable history lines by @reubeno in #710
  • refactor: extract script + function call stacks to their own modules by @reubeno in #709
  • docs: first draft of an AI policy in CONTRIBUTING.md by @reubeno in #694
  • build(deps): bump the github-actions group with 3 updates by @dependabot[bot] in #712
  • build(deps): bump the cargo group with 8 updates by @dependabot[bot] in #713
  • fix: tokenizer handling of here docs in quoted command substitutions by @reubeno in #716
  • build(deps): bump the github-actions group with 5 updates by @dependabot[bot] in #718
  • build(deps): bump the cargo group with 2 updates by @dependabot[bot] in #717
  • docs: add an initial AGENTS.md file by @reubeno in #714
  • refactor: error/result type overhaul by @reubeno in #720
  • feat: enable custom error formatting by @reubeno in #722
  • fix: address lint errors from stable + nightly by @reubeno in #723
  • chore: add instructions to guide advisory-only copilot code reviews by @reubeno in #721
  • ci: add cooldown settings for dependabot by @reubeno in #724
  • fix: add missing license symlink by @reubeno in #725
  • fix: add missing cfg conditions on builtin registrations by @reubeno in #726
  • Refactor SourcePosition to use Arc by @lu-zero in #727
  • Introduce source location by @lu-zero in #728
  • fix: correct read variable update behavior on empty input by @reubeno in #729
  • fix: address race conditions in basic input tests by @reubeno in #730
  • ci: upgrade bash-completion by @reubeno in #731
  • fix: do not pass along exported-but-unset vars by @reubeno in #732
  • fix: comment unsafe blocks + better harden 1 block by @reubeno in #733
  • ci: update cd workflow runners by @reubeno in #734
  • test: add not-yet-passing tests for set -u and set -e by @reubeno in #736
  • refactor: move more platform-specific code under sys by @reubeno in #735
  • feat: implement fc builtin by @reubeno in #739
  • feat(bind): extend key binding support by @reubeno in #740
  • docs: add fzf demo tape by @reubeno in #741
  • docs: update readme by @reubeno in #742
  • feat: implement alternate arithmetic for syntax by @reubeno in #744
  • fix(builtins): suppress error when type -p sees no command by @reubeno in #745
  • feat: implement BASH_XTRACEFD by @reubeno in #747
  • fix: command substitutions with large output by @reubeno in #748
  • feat: revisit how ExecutionParameters layer open files atop the Shell by @reubeno in #749
  • feat: basic support for trap EXIT by @reubeno in #750
  • fix: correct handling of expansion in parameter exprs with replacements by @reubeno in #751
  • test: add new command substitution test case by @reubeno in #752
  • build(deps): bump the github-actions group with 4 updates by @dependabot[bot] in #754
  • build(deps): bump the cargo group with 3 updates by @dependabot[bot] in #755
  • feat: implement opt-in fd inheritance from host env by @reubeno in #753
  • fix: correct expansion behavior in prompts by @reubeno in #756
  • chore: update dependencies by @reubeno in #757
  • chore: add brush crate + docs publishing by @reubeno in #760
  • fix: escaping and pipeline parse issues by @reubeno in #762
  • chore: prep release by @reubeno in #763
  • fix: correct changelog and versions by @reubeno in #764

Full Changelog: brush-shell-v0.2.23...brush-shell-v0.3.0

brush v0.2.22

View on GitHub

🚀 Release Notes

This release contains a few focused changes and dependency upgrades.

Notable changes:

  • Added initial (optional) miette integration for improved error messages. (Thanks to @lu-zero for making this happen!)
  • Resolved some warnings and errors with the experimental Windows build of brush. (Thanks to @twz123 for identifying issues with the homedir crate!)
  • Excluded from history commands executed by bind bindings.

🗒️ Details

  • fix: exclude bind-bound commands from history by @reubeno in #650
  • build(deps): bump the cargo group with 4 updates by @dependabot[bot] in #654
  • build(deps): bump the github-actions group with 5 updates by @dependabot[bot] in #655
  • Add minimal miette support by @lu-zero in #648
  • fix(cmdline): improve error handling for unknown cmdline options by @reubeno in #656
  • docs: update readme by @reubeno in #657
  • build(deps): bump the github-actions group with 7 updates by @dependabot[bot] in #658
  • build(deps): bump the cargo group with 4 updates by @dependabot[bot] in #659
  • chore: additional clippy fixes by @reubeno in #661
  • chore: downgrade homedir by @reubeno in #662
  • chore: address warnings on windows targets by @reubeno in #663
  • build(deps): bump tracing-subscriber from 0.3.19 to 0.3.20 in the cargo group by @dependabot[bot] in #664
  • chore: prepare release by @reubeno in #665

Full Changelog: brush-shell-v0.2.21...brush-shell-v0.2.22

brush v0.2.21

View on GitHub

🚀 Release Notes

This release contains several bug fixes to improve compatibility with bash, as well as some feature work focused on command history. We are now also publishing more complete license notices along with the binaries we release on GitHub.

Notable features and fixes:

  • Implemented history builtin! This has been in the works for a while, but we saw it reach stability during this release cycle.
  • Resolved a handful of issues discovered by users trying to run Arch's makepkg script under brush, including some missing functionality in brace expansion and arithmetic expression parsing. (Thanks to @theoparis for finding and reporting these!)
  • Resolved panics occurring with strings containing multi-byte characters. (Thanks to @colindean for catching and root-causing these!)
  • Adds support for (<"$file") special-case supported by bash.

Notable installation improvements:

  • brush is now installable via homebrew! (Thanks to @colindean for updating our readme with instructions.)
  • brush is installable (more officially) from Arch! (Thanks to @roland-5 for readme updates on that.)

🗒️ Details

  • fix(ci): correct CD workflow run name by @reubeno in #603
  • build(deps): bump the github-actions group with 3 updates by @dependabot[bot] in #605
  • Arch Linux - update installation instruction by @roland-5 in #604
  • fix: prepare tests to run against bash-5.3 by @reubeno in #610
  • build(deps): bump the github-actions group across 1 directory with 4 updates by @dependabot[bot] in #611
  • build(deps): bump the cargo group across 1 directory with 5 updates by @dependabot[bot] in #609
  • build(deps): bump the cargo group with 3 updates by @dependabot[bot] in #612
  • build(deps): bump the cargo group with 2 updates by @dependabot[bot] in #613
  • build(deps): bump the github-actions group with 3 updates by @dependabot[bot] in #617
  • build(deps): bump tokio from 1.46.1 to 1.47.0 in the cargo group by @dependabot[bot] in #616
  • build(deps): bump the cargo group with 2 updates by @dependabot[bot] in #619
  • build(deps): bump the github-actions group with 2 updates by @dependabot[bot] in #620
  • build(deps): bump the cargo group with 2 updates by @dependabot[bot] in #621
  • feat(history): implement history builtin by @reubeno in #599
  • ci: publish license notices by @reubeno in #622
  • chore: update dependencies by @reubeno in #623
  • fix(parser): resolve issue with parser confusing subshell for arith expr by @reubeno in #624
  • fix(expansion): support broader set of nested brace expansions by @reubeno in #625
  • fix(unset): correct unset of associative array element by @reubeno in #626
  • build(deps): bump indenter from 0.3.3 to 0.3.4 in the cargo group by @dependabot[bot] in #627
  • build(deps): bump the github-actions group with 7 updates by @dependabot[bot] in #628
  • fix(declare): refine varname validation by @reubeno in #629
  • fix: hyphenated script args by @reubeno in #630
  • fix: special case for command subst by @reubeno in #632
  • chore: update lock file by @reubeno in #633
  • chore: remove unused import from python script by @reubeno in #634
  • ci: pin rust-toolchain tasks by @reubeno in #635
  • chore: remove unused global variable by @reubeno in #636
  • chore: remove unused global variable by @reubeno in #637
  • build(deps): bump slab from 0.4.10 to 0.4.11 in the cargo group by @dependabot[bot] in #640
  • Adds Homebrew nudge to installation section by @colindean in #638
  • fix: correct obvious string indexing errors by @reubeno in #641
  • fix: fixes for preexec-style bash extensions by @reubeno in #643
  • chore: cleanup allow attributes, switch to expect where possible by @reubeno in #642
  • chore: rename license notice document by @reubeno in #645
  • chore: prepare release by @reubeno in #644
  • fix: add back 2 suppressions by @reubeno in #647

New Contributors

Full Changelog: brush-shell-v0.2.20...brush-shell-v0.2.21

brush v0.2.20

View on GitHub

🚀 Release Notes

This release includes a targeted change to the project's default compiler flags (see #600 for details). Prior to this change, release builds defaulted to optimizing for the build host's hardware platform; while useful for individuals, this is problematic for users who plan to use the built binaries on a different system.

Notable features and fixes:

  • Fixed "illegal instruction" issue sometimes seen when building brush on one system and running on another. (Thanks to @kachick for diagnosing and fixing this!)
  • Added support for +o/-o on the brush command line.
  • Corrected behavior of positional parameter shadowing with source/. builtin.

Notable API improvements:

  • Ergonomics improvements to Shell::invoke_function, ShellValue construction, and a few other places. (Thanks to @Elsie19 for contributions here!)

🗒️ Details

  • chore: suppress cognitive complexity errors (for now) by @reubeno in #583
  • fix(dot): only shadow args when provided to source by @reubeno in #582
  • docs: README.md installation updates by @reubeno in #580
  • ci: fix dry-run PR trigger on CD workflow by @reubeno in #584
  • chore: update dependencies + deny policy by @reubeno in #586
  • tests: tag test binary dependencies by @reubeno in #585
  • tests: add test cases for open issues by @reubeno in #587
  • docs: update README.md badges by @reubeno in #588
  • fix(input): multiline input with basic input backend by @reubeno in #589
  • feat: enable -o/+o on brush command line by @reubeno in #590
  • tests: add not-yet-passing history tests by @reubeno in #591
  • build(deps): bump the github-actions group with 5 updates by @dependabot in #592
  • build(deps): bump test-with from 0.15.1 to 0.15.2 in the cargo group by @dependabot in #593
  • chore: remove unneeded dev deps by @reubeno in #594
  • chore: add some tools to devcontainer by @reubeno in #595
  • ci: enable advanced codeql scanning by @reubeno in #597
  • feat(api): API usability improvements for Shell::invoke_function by @reubeno in #596
  • chan(ShellValue): take in an Into by @Elsie19 in #598
  • perf: avoid CPU-specific optimization by @kachick in #600
  • chore: update dependencies by @reubeno in #601
  • chore: prepare release by @reubeno in #602

Full Changelog: brush-shell-v0.2.19...brush-shell-v0.2.20

brush v0.2.19

View on GitHub

🚀 Release Notes

This release included a batch of compatibility fixes, ergonomics improvements to the API surfaces of brush-core and brush-parser crates, and some targeted performance improvements.

Notable features:

  • Add BRUSH_VERSION variable to distinguish versions of brush from the version of bash it targets compatibility with. (Thanks to @kachick for proposing and implementing this one.)
  • API adjustments to script parsing in brush-core for ergonomics. (Thanks to @hwittenborn for contributing this.)
  • Initial (non-translating) support for gettext quoted strings. (Thanks to @Elsie19 for identifying this gap and merging in an initial implementation.)
  • Overhaul of printf builtin using the uucore crate from the Rust coreutils project.
  • Added support for >&-, >&N-, and other bash-extended redirection forms.

Highlighted fixes:

  • Correct handling of escape sequences in ANSI-C strings.
  • Handle here documents terminated by EOF (Thanks to @mati865 for reporting this.)
  • Fix behavior of brush when commands are piped to stdin. (Thanks to @andychu for catching and reporting this.)

Other shout-outs:

  • Big shout-out to @andychu for onboarding brush to the Oils project's cross-shell compatibility testing! More discussion of this can be found here.

🗒️ Details

  • fix(typeset): mark typeset as a declaration builtin by @reubeno in #517
  • fix(tokenizer): correctly treat $( (...) ) as a cmd substitution by @reubeno in #521
  • feat(AndOrList): add iteration abilities by @Elsie19 in #512
  • build(deps): bump the cargo group with 3 updates by @dependabot in #522
  • fix(backquote): correct backslash handling by @reubeno in #524
  • fix(test): reuse -ef, -nt, -ot support by @reubeno in #525
  • fix(vars): ensure effective GID is first in GROUPS by @reubeno in #526
  • fix(arithmetic): permit space after unary operator by @reubeno in #527
  • feat(vars): implement correct updating for -u/-c/-l vars by @reubeno in #529
  • ci: hash-pin actions + explicitly constrain token needs by @reubeno in #532
  • feat(env): introduce brush specific variable by @kachick in #531
  • ci: clean up ci report workflow by @reubeno in #533
  • ci: enable checks against workflow yaml by @reubeno in #534
  • ci: fix pedantic warnings from newer zizmor release by @reubeno in #535
  • feat: enable cargo-binstall to work with brush by @reubeno in #536
  • test: work-in-progress script to run bash test suite by @reubeno in #537
  • build(deps): bump pprof from 0.14.0 to 0.15.0 in the cargo group by @dependabot in #542
  • ci: run cd workflow in dry-run mode on PR by @reubeno in #543
  • build(deps): bump the github-actions group with 2 updates by @dependabot in #541
  • test(parser): enable serde::Serialize on AST et al. for test targets by @reubeno in #544
  • Allow reading a script from bytes by @hwittenborn in #509
  • test(parser): start using insta crate for snapshot-testing parser by @reubeno in #545
  • Add ability to clear all functions from shell environment by @hwittenborn in #546
  • build(deps): bump the github-actions group with 3 updates by @dependabot in #549
  • test(tokenizer): adopt insta for tokenizer tests by @reubeno in #550
  • feat(parser): add gettext enabled quotes by @Elsie19 in #446
  • fix(tokenizer): correctly handle here docs terminated by EOF by @reubeno in #551
  • chore: upgrade MSRV to 1.85.0 by @reubeno in #553
  • chore: upgrade crates to Rust 2024 edition by @reubeno in #554
  • feat(printf): replace printf impl with uucore wrapper by @reubeno in #552
  • chore: enable more lints + fixes by @reubeno in #555
  • fix(interactive): fix behavior of cmds piped to stdin by @reubeno in #539
  • chore: upgrade dependencies by @reubeno in #556
  • chore: update resolver version in Cargo.toml by @reubeno in #557
  • fix(traps): add stub definition for RETURN trap by @reubeno in #559
  • fix(functions): allow func names to contain slashes by @reubeno in #560
  • fix(tokenizer): handle escaped single-quote in ANSI-C quoted string by @reubeno in #561
  • fix(arithmetic): correct left shift handling by @reubeno in #562
  • build(deps): bump the github-actions group with 4 updates by @dependabot in #564
  • fix(local): enable use of local to detect function by @reubeno in #565
  • fix(expansion): handle signed numbers in ranges by @reubeno in #566
  • fix(redirection): assorted fixes to redirection by @reubeno in #567
  • fix(prompt): implement \A by @reubeno in #569
  • feat(args): add --rcfile command-line option by @reubeno in #568
  • fix(expansion): correct ${!PARAM@...} by @reubeno in #570
  • fix(ci): upgrade taiki-e/install-action to v2.53.2 to resolve build issue by @reubeno in #572
  • fix(expansion): fix parsing escaped single-quotes in ANSI-C strs by @reubeno in #571
  • perf: remove redundant lookups in path searching by @reubeno in #573
  • Abstract parse errors by @lu-zero in #574
  • build(deps): bump the github-actions group with 4 updates by @dependabot in #577
  • fix(for/case): allow reserved words in for word lists by @reubeno in #578
  • chore: prepare release by @reubeno in #579

New Contributors

Full Changelog: brush-shell-v0.2.18...brush-shell-v0.2.19

brush v0.2.18

View on GitHub

🚀 Release Notes

Since our last release we've seen an influx of interest, thanks in part to getting posted to Hacker News and elsewhere. Welcome all! We appreciate your interest, questions, filed issues, and support 😄

This release focuses on a wave of fixes to address some of the user feedback we've received, as well as some targeted features that had been on our backlog for quite some time.
Some select highlights:

  • Ergonomic improvements to the brush-core exported API surface for applications embedding brush. (Particular thanks to @Elsie19 and other contributors on this).
  • Support for logical/physical options (-L, -P) to cd, pwd, et al. (This builds on the work that @39555 started several months back; thanks for your patience until we were able to get to it!)
  • Significant improvements to the mapfile/readarray builtin. (Thanks to @Elsie19 on overhauling mapfile's core input loop.)
  • Initial implementation of the ulimit builtin. (Thanks to @lu-zero for getting it from unimplemented to something reasonable.)
  • Initial implementation of bind -x support, used by many shell extensions and users' .bashrc files; there's more to do, but this covers a long asked-for feature request from the community.

There's plenty more bug fixes and changes -- as usual, the full details are below. And a big shout-out to our new contributors as well as contributors who dove in deeper this cycle! 🙏

🗒️ Details

  • fix: correct release tag check in cd pipeline by @reubeno in #443
  • feat(apply_unary_predicate_to_str): implement -R operand by @Elsie19 in #439
  • feat(Shell): add methods to add environmental variables and builtins by @Elsie19 in #447
  • ref(Shell): turn &Path parameters into AsRef<Path> by @Elsie19 in #448
  • build(deps): bump taiki-e/upload-rust-binary-action from 1.24.0 to 1.25.0 in the github-actions group by @dependabot in #450
  • fix(prompt): support PROMPT_COMMAND arrays by @reubeno in #451
  • fix(trap): handle '-' unregistration syntax by @reubeno in #452
  • test(extended-tests): explicitly set modified date on test files by @reubeno in #453
  • chore: upgrade dependencies: reedline, nix, clap, thiserror, etc. by @reubeno in #456
  • chore: enable (and fix) current checks across all workspace crates by @reubeno in #457
  • feat: implement {cd,pwd} -{L,P} by @reubeno in #458
  • build(deps): bump the cargo group with 3 updates by @dependabot in #461
  • build(deps): bump the github-actions group with 2 updates by @dependabot in #460
  • fix(complete): fixes + tests for "declare -r" by @reubeno in #462
  • fix: enable unnameable_types lint and mitigate errors by @reubeno in #459
  • fix(builtin): fix issues with 'builtin' invoking declaration builtins by @reubeno in #466
  • fix(declare): turn down volume on non-existent functions by @reubeno in #467
  • fix(expansion): allow negative subscripts with indexed arrays + slices by @reubeno in #468
  • chore: better log + connect unimpl functionality with GH issues by @reubeno in #476
  • chore: separate release and bench profiles by @reubeno in #477
  • test: add compat test for $_ (not yet passing) by @reubeno in #480
  • docs: update readme by @reubeno in #481
  • test: add known failing tests for reported issues by @reubeno in #483
  • feat(builtins): implement basic bind -x support by @reubeno in #478
  • fix: allow "bind" usage in .bashrc by @reubeno in #485
  • build(deps): bump the cargo group with 3 updates by @dependabot in #487
  • feat(mapfile): Register also as readarray by @lu-zero in #486
  • fix(expansion): fix issues parsing backquoted commands nested in single/double-quoted strings by @reubeno in #491
  • feat(funcs): implement function exporting/importing by @reubeno in #492
  • fix(break,continue): use default_value_t for flag values by @Elsie19 in #493
  • docs: add discord invite to readme by @reubeno in #494
  • chore(edit_mode): Fix clippy lints by @lu-zero in #495
  • fix(help): better compact argument help by @reubeno in #499
  • fix(input): map Ctrl+_ -> undo by @reubeno in #500
  • fix: fix typos + add spell-checking PR check by @reubeno in #501
  • feat(mapfile): implement -n, -d, -s by @Elsie19 in #490
  • Implement ulimit by @lu-zero in #482
  • docs(readme): a Fish as a shell implemented in Rust by @brettcannon in #505
  • chore: prepare release by @reubeno in #504
  • fix: add missing tokio feature to unblock release by @reubeno in #506
  • fix: suppress warning when building with --no-default-features by @reubeno in #508

New Contributors

Full Changelog: brush-shell-v0.2.17...brush-shell-v0.2.18

brush v0.2.17

View on GitHub

Release Notes

This release brings:

  • Targeted ergonomics improvements for users of brush_core::Shell
  • Minor completion improvements for syntactically complex command-lines
  • Build and test support for -musl variants of brush
  • Early experimental build-only support for building for wasm32-unknown-unknown

And a big shout-out to our new contributors! Please keep reading for more details.

What's Changed

  • build(deps): bump the cargo group with 3 updates by @dependabot in #426
  • chore: get building for wasm32-unknown-unknown by @reubeno in #425
  • fix: honor COMP_WORDBREAKS in completion tokenization by @reubeno in #407
  • build(deps): bump the cargo group with 2 updates by @dependabot in #427
  • ci: build musl variant + reenable aarch64 tests by @reubeno in #428
  • build(deps): bump rand from 0.9.0 to 0.9.1 in the cargo group by @dependabot in #431
  • test: implement --skip in brush-compat-tests harness by @reubeno in #432
  • docs: Add instructions for installing from the AUR by @orhun in #433
  • fix: handle complete builtin run without options by @reubeno in #435
  • chore(Shell): use relaxed typing for string input by @Elsie19 in #437
  • feat(Shell): add get_env_var method for more generic variable returns by @Elsie19 in #438
  • build: add workflow for publishing release binaries to GH by @reubeno in #440
  • chore: prepare release by @reubeno in #441

New Contributors

Full Changelog: brush-shell-v0.2.16...brush-shell-v0.2.17

brush v0.2.16

View on GitHub

Release Notes

This release brings an assortment of fixes for reported compatibility issues and an upgrade of reedline to 0.39.0. Most notably:

  • exec now supports being used commandlessly, to update open file descriptors in the running shell
  • arithmetic expressions support base#literal syntax for integer literals
  • $PS4 is prompt-expanded when used in set -x et al.
  • command -p is now implemented
  • targeted fixes to support running our compatibility test suite in more environments (e.g., NixOS)

Keep reading for more details.

What's Changed

  • fix(builtins): implement command-less exec semantics with open fds by @reubeno in #384
  • fix(builtins): correct read handling of IFS/space by @reubeno in #385
  • fix(extglob): correct handling of extglobs with empty branches by @reubeno in #386
  • feat(arithmetic): support explicit base#literal in arithmetic by @reubeno in #388
  • docs: add how to use via nixpkgs by @kachick in #387
  • build(deps): bump the cargo group with 2 updates by @dependabot in #389
  • fix: default PS1 and PS2 in interactive mode by @reubeno in #390
  • fix: correct path tests on empty strings by @reubeno in #391
  • fix: reset default prompt color by @reubeno in #392
  • build(deps): bump the cargo group with 2 updates by @dependabot in #393
  • Expand contents of PS4 when tracing by @dan4thewin in #396
  • docs: fill out TBD sections in CONTRIBUTING.md + add extension suggestions by @reubeno in #397
  • chore: upgrade cached crate by @reubeno in #398
  • docs: add lines-of-code badge to readme by @reubeno in #399
  • docs: symlink licenses under crate dirs by @reubeno in #400
  • build(deps): bump serde from 1.0.218 to 1.0.219 in the cargo group by @dependabot in #401
  • chore: rewrite dir diffing test code to minimize deps by @reubeno in #403
  • feat: implement command -p by @reubeno and @39555 in #402
  • fix: allow newline in empty array assignment by @idealseal in #405
  • fix: improve panic handling output by @reubeno in #409
  • build(deps): bump the cargo group with 2 updates by @dependabot in #410
  • test: add more linux distros to test matrix by @reubeno in #412
  • ci: bump bash-completion tests to 2.16.0 by @reubeno in #414
  • test: enable testing on nixos/nix container image by @reubeno in #413
  • chore: upgrade reedline + other deps by @reubeno in #415
  • fix(regex): enable multiline mode for extended test regexes by @reubeno in #416
  • fix: parse '#' as char only if inside a variable expansion by @idealseal in #418
  • build(deps): bump whoami from 1.5.2 to 1.6.0 in the cargo group by @dependabot in #423
  • chore: prepare release by @reubeno in #424

New Contributors

Full Changelog: brush-shell-v0.2.15...brush-shell-v0.2.16

brush v0.2.15

View on GitHub

Release Notes

Another release with a sizable number of targeted fixes for posted issues, performance tweaks, and a couple of smaller features. The most noticeable feature may be the introduction of "dynamic variables" into the shell implementation, which allowed us to add quick support for standard special variables like $SHELLOPTS, $BASHOPTS, et al.
 

What's Changed

  • build(deps): bump the cargo group across 1 directory with 4 updates by @dependabot in #320
  • fix(builtins): skip unenumerable vars in set builtin by @reubeno in #322
  • test(perf): update tokenizer/parser benchmarks by @reubeno in #321
  • fix(patterns): fix incorrect parse of char ranges by @reubeno in #323
  • chore: remove unneeded string cloning for arithmetic eval by @reubeno in #324
  • feat(continue): implement continue n for n >= 2 by @reubeno in #326
  • fix(completion): improve basic backend completion output by @reubeno in #327
  • chore: update readme by @reubeno in #331
  • chore: test updates by @reubeno in #330
  • feat(options): implement dotglob semantics by @reubeno in #332
  • feat(options): implement "set -t" by @reubeno in #333
  • build(deps): bump indexmap from 2.7.0 to 2.7.1 in the cargo group by @dependabot in #334
  • feat(options): implement "set -a" by @reubeno in #336
  • chore: adopt native arm64 github runners by @reubeno in #335
  • chore: remove some unneeded pub(crate) visibility annotations by @reubeno in #346
  • fix(exit): correct exit semantics in various compund statements by @reubeno in #347
  • fix(for): correct semantics for "for" without "in" by @reubeno in #348
  • fix: correct semantics of = in non-extended test commands by @reubeno in #349
  • fix(return): error if return used outside sourced script or function by @reubeno in #350
  • build: partially revert recent arm64 changes by @reubeno in #352
  • fix(arithmetic): recursively evaluate var references by @reubeno in #351
  • fix(arithmetic): fixes for nested parenthesis parsing in arithmetic by @reubeno in #353
  • fix(builtins): fix set builtin handling of - and -- by @reubeno in #354
  • fix(builtins): do not interpret --help in command builtin command args by @reubeno in #355
  • fix(builtins): correct more 'set' argument parsing by @reubeno in #356
  • fix(variables): more correct handling of integer variables by @reubeno in #357
  • fix(redirection): make sure redirection fd + operator are contiguous by @reubeno in #359
  • feat(env): introduce dynamic vars backed by rust code by @reubeno in #360
  • perf: minor optimizations for shell create + command run by @reubeno in #362
  • perf: simplify export enumeration by @reubeno in #363
  • chore: minor cleanups and test additions by @reubeno in #364
  • perf: skip word parsing if no expansion required by @reubeno in #365
  • chore: remove unneeded result wrappings by @reubeno in #367
  • chore: remove a few object clones by @reubeno in #368
  • fix: better error when cwd is gone by @reubeno in #370
  • fix(builtins): fix read builtin ignoring tab chars by @reubeno in #371
  • fix(expansion): handle negative substring offset by @reubeno in #372
  • fix(completion): better handle native errors in completion funcs by @reubeno in #373
  • fix: propagate execution parameters more thoroughly by @reubeno in #374
  • fix(redirection): allow continuing past redir errors by @reubeno in #375
  • build(deps): bump the cargo group with 3 updates by @dependabot in #376
  • chore: switch to testing on debian:testing by @reubeno in #377
  • chore: fix rng warnings by @reubeno in #378
  • test: run bash-completion tests by @reubeno in #292
  • test: resolve false errors about side effects in bash-completion tests by @reubeno in #379
  • fix(builtins): correct parsing of bind positional arg by @reubeno in #381
  • chore: prepare release by @reubeno in #382

Full Changelog: brush-shell-v0.2.14...brush-shell-v0.2.15

brush v0.2.14

View on GitHub

Release Notes

This is a sizable release, incorporating a large number of bug-fixes and performance improvements, as well as some targeted features to close compatibility gaps. Notably this includes brace expansion, support for additional shopt/set options, support for the time special keyword, and support for multiple additional builtin commands.

What's Changed

  • fix: stop incorrectly parsing assignment as function def by @reubeno in #273
  • fix: assorted non-fatal clippy warnings by @reubeno in #274
  • fix: multiple issues blocking docker cmd completion by @reubeno in #275
  • fix: correct handling of multi-byte chars in highlighter by @reubeno in #277
  • feat(prompts): enable PS0, custom right-side prompts, more by @reubeno in #278
  • feat(set): implement nullglob option by @reubeno in #279
  • fix: improve substring ops with multi-byte chars by @reubeno in #280
  • fix: better handle escape chars in pattern bracket exprs by @reubeno in #281
  • feat(set): implement nocaseglob + nocasematch options by @reubeno in #282
  • build(deps): bump the cargo group with 3 updates by @dependabot in #285
  • build(deps): bump the cargo group with 4 updates by @dependabot in #289
  • feat(completion): progress toward passing bash-completion test suite by @reubeno in #288
  • feat: implement brace expansion by @reubeno in #290
  • feat(options): implement noclobber option (a.k.a. -C) by @reubeno in #291
  • build(deps): bump the cargo group with 3 updates by @dependabot in #294
  • chore: pin workflows to specific ubuntu versions by @reubeno in #293
  • chore: update reedline + Cargo.lock by @reubeno in #296
  • build(deps): bump anyhow from 1.0.94 to 1.0.95 in the cargo group by @dependabot in #297
  • fix: implement date and time in prompts by @reubeno in #298
  • build(deps): bump the cargo group with 2 updates by @dependabot in #299
  • fix(completion): handle -o {default,dirnames,plusdirs} by @reubeno in #300
  • perf: cache parsing for arithmetic expressions by @reubeno in #301
  • build(deps): bump the cargo group with 2 updates by @dependabot in #304
  • fix(jobs): only report job status when job control option is enabled by @reubeno in #306
  • feat(builtins): implement more of kill builtin by @reubeno in #305
  • perf: remove setup operations from microbenchmarks by @reubeno in #307
  • feat(builtins): implement times builtin by @reubeno in #309
  • feat(non-posix): implement time keyword by @reubeno in #310
  • feat(builtins): implement suspend by @reubeno in #311
  • chore: address warnings by @reubeno in #313
  • perf: remove unneeded async from arithmetic eval by @reubeno in #312
  • perf: adjust compile flags for runtime performance by @reubeno in #314
  • perf: reimplement colon command as a "simple builtin" by @reubeno in #315
  • fix(expansion): correct length for 1-element arrays by @reubeno in #316
  • fix: correct issues with ! extglobs and compgen -X by @reubeno in #317
  • chore: prepare release by @reubeno in #318

Full Changelog: brush-shell-v0.2.13...brush-shell-v0.2.14

brush v0.2.13

View on GitHub

What's Changed

Full Changelog: brush-shell-v0.2.12...brush-shell-v0.2.13

brush v0.2.12

View on GitHub

What's Changed

  • build(deps): bump the cargo group with 2 updates by @dependabot in #220
  • feat: implement support for ;;& and ;& in case items by @reubeno in #223
  • fix: allow usually-operator chars in regex parens by @reubeno in #224
  • fix: assorted correctness issues in getopts builtin by @reubeno in #225
  • fix: assorted completion-related issues by @reubeno in #226
  • fix: string replacement with slashes by @reubeno in #231
  • fix: correct pattern removal expansions on arrays by @reubeno in #232
  • fix(completion): fix -- handling in getopts by @reubeno in #235
  • fix: omit dirs from executable searches by @reubeno in #236
  • fix(completion): correct behavior of slice past end of array by @reubeno in #237
  • test: run completion tests using bash-completion 2.14.0 by @reubeno in #238
  • fix: handle PS2 prompts that require prompt-expansion by @reubeno in #239
  • test: add os-targeted integration tests by @reubeno in #241
  • feat: implement |& extension by @39555 in #240
  • feat: implement kill -l by @39555 in #221
  • chore: upgrade crate dependencies by @reubeno in #247
  • build: run lychee to check intra-repo links in action by @reubeno in #248
  • build: run cargo udeps in checks by @reubeno in #246
  • docs: generate usage docs in actions via xtask by @reubeno in #249
  • feat: implement |& for function declarations by @39555 in #244
  • fix: support here documents in command substitutions by @reubeno in #255
  • chore: prepare release by @reubeno in #256

Full Changelog: brush-shell-v0.2.11...brush-shell-v0.2.12

brush v0.2.11

View on GitHub

What's Changed

  • docs: update readme by @reubeno in #182
  • test: enable setting min oracle version on tests by @reubeno in #184
  • feat: experimentally enable reedline as an input backend by @reubeno in #186
  • feat: default to reedline and add syntax highlighting support by @reubeno in #187
  • fix: allow newlines in extended test exprs by @reubeno in #188
  • fix: deduplicate completion candidates by @reubeno in #189
  • build(deps): bump futures from 0.3.30 to 0.3.31 in the cargo group by @dependabot in #190
  • feat: add a panic handler via human-panic by @reubeno in #191
  • feat: several fixes for bash-completion + tests by @reubeno in #192
  • fix: fixes for short-circuit precedence + parameter expr replacement by @reubeno in #193
  • fix: workarounds for edge word parsing cases by @reubeno in #194
  • fix: only show filenames in completions by @reubeno in #195
  • build: leave rustyline disabled by default by @reubeno in #196
  • fix: assorted completion issues with ~ and vars by @reubeno in #199
  • feat: implement cd - by @39555 in #201
  • build(deps): bump the cargo group with 4 updates by @dependabot in #203
  • chore: where possible replace async-trait with native async trait support in 1.75+ by @39555 in #197
  • docs: update readme with new links by @reubeno in #204
  • fix: slight compat improvements to set -x by @reubeno in #205
  • feat: implement command hashing by @reubeno in #206
  • fix: matching newline chars in glob patterns by @reubeno in #207
  • fix: honor IFS in read builtin by @reubeno in #208
  • chore: upgrade reedline to 0.36.0 by @reubeno in #209
  • fix: correct behavior of break in arithmetic for loop by @reubeno in #210
  • fix: address issues with array unset by @reubeno in #211
  • fix: handle expansion in here documents by @reubeno in #212
  • fix: cleanup transient completion variables by @reubeno in #213
  • fix: leave trailing whitespace out of reedline completion suggestions by @reubeno in #214
  • chore: increase max column count for completion menu by @reubeno in #215
  • build: remove rustyline support by @reubeno in #216
  • chore: prepare release by @reubeno in #217
  • docs: update readme by @reubeno in #218

Full Changelog: brush-shell-v0.2.10...brush-shell-v0.2.11

brush v0.2.10

View on GitHub

What's Changed

  • fix: allow source to be used with process substitution by @reubeno in #175
  • build(deps): bump the cargo group with 2 updates by @dependabot in #177
  • test: move to cargo nextest by @reubeno in #176
  • test: correctly report skipped tests for nextest by @reubeno in #178
  • test: convert more test skips to known failures by @reubeno in #179
  • fix: address multiple issues with foreground controls for pipeline commands by @reubeno in #180
  • chore: prepare release by @reubeno in #181

Full Changelog: brush-shell-v0.2.9...brush-shell-v0.2.10

brush v0.2.9

View on GitHub

What's Changed

  • build(deps): bump thiserror from 1.0.63 to 1.0.64 in the cargo group by @dependabot in #167
  • test: add more basic interactive tests by @reubeno in #168
  • build: temporarily disable failing test by @reubeno in #170
  • build: prepare for test reports from multiple platforms by @reubeno in #171
  • build: refactor PR workflow to better support multi-platform build + test by @reubeno in #169
  • fix: Posix compliant argument parsing for -c mode by @39555 in #147
  • test: bring up macos testing by @reubeno in #172
  • feat: launch processes in their own process groups by @reubeno in #166
  • fix: avoid duplicate artifact names by @reubeno in #173
  • chore: prepare release by @reubeno in #174

New Contributors

Full Changelog: brush-shell-v0.2.8...brush-shell-v0.2.9

brush v0.2.8

View on GitHub

What's Changed

  • build(deps): bump tokio from 1.39.3 to 1.40.0 in the cargo group by @dependabot in #156
  • docs: generate man page via xtask by @reubeno in #157
  • build(deps): bump the cargo group with 6 updates by @dependabot in #158
  • chore: extract InteractiveShell as trait + refactor by @reubeno in #159
  • fix: implement ~USER syntax by @reubeno in #160
  • build(deps): bump the cargo group with 2 updates by @dependabot in #161
  • fix: compgen needs to expand target arg by @reubeno in #162
  • fix: do not invoke debug traps during completion funcs by @reubeno in #163
  • perf: short-term optimization for common-case printf by @reubeno in #164
  • chore: prepare release by @reubeno in #165

Full Changelog: brush-shell-v0.2.7...brush-shell-v0.2.8

brush v0.2.7

View on GitHub

What's Changed

  • feat: move MSRV up to 1.75.0 by @reubeno in #139
  • fix: disable displaying tracing target by @reubeno in #140
  • build(deps): bump tokio from 1.39.1 to 1.39.2 in the cargo group by @dependabot in #141
  • build(deps): bump cargo-bins/cargo-binstall from 1.7.4 to 1.8.0 in the github-actions group by @dependabot in #142
  • fix: correct echo -e escape expansion for \x sequences by @reubeno in #143
  • fix: correct multiple issues with process substitution + redirection by @reubeno in #145
  • fix: mitigate build errors setting up cargo-binstall by @reubeno in #146
  • build(deps): bump the cargo group with 3 updates by @dependabot in #148
  • build(deps): bump serde from 1.0.204 to 1.0.206 in the cargo group by @dependabot in #150
  • build(deps): bump the cargo group with 2 updates by @dependabot in #152
  • fix: make history file creation error non fatal by @reubeno in #153
  • build(deps): bump serde from 1.0.208 to 1.0.209 in the cargo group by @dependabot in #154
  • chore: prepare release by @reubeno in #155

Full Changelog: brush-shell-v0.2.6...brush-shell-v0.2.7

brush v0.2.4

View on GitHub

What's Changed

  • fix: exclude tags from git version info by @reubeno in #115
  • feat: get building on windows and wasm-wasip1 targets by @reubeno in #116
  • fix: correct logic to extract PR number in report workflow by @reubeno in #120
  • fix: correct ci report gh cli invocation by @reubeno in #121
  • build(deps): bump cargo-bins/cargo-binstall from 1.7.3 to 1.7.4 in the github-actions group by @dependabot in #119
  • feat: Initial support for non-linux by @lu-zero in #117
  • build(deps): bump the cargo group across 1 directory with 5 updates by @dependabot in #122
  • fix: clippy and check warnings by @reubeno in #123
  • feat: add brushctl builtin, seed with event toggling support by @reubeno in #124
  • fix: correct completion fallback logic when spec matches but 0 results by @reubeno in #125
  • fix: various build warnings on windows build by @reubeno in #126
  • docs: update readme by @reubeno in #127
  • build: ensure CI checks enable all features by @reubeno in #128
  • chore: update comments by @reubeno in #129
  • feat: enable simpler builtins implemented outside brush by @reubeno in #130
  • fix: do not fail fast if history file is unwritable by @reubeno in #131
  • build: prepare next release by @reubeno in #132

New Contributors

Full Changelog: brush-shell-v0.2.3...brush-shell-v0.2.4

brush v0.2.3

View on GitHub

What's Changed

Full Changelog: brush-shell-v0.2.2...brush-shell-v0.2.3

brush v0.2.2

View on GitHub

What's Changed

  • docs: add crate shields to readme by @reubeno in #74
  • feat: implement 'command' builtin by @reubeno in #77
  • fix: compgen -W expansion by @reubeno in #78
  • fix: don't split completions that aren't file paths by @reubeno in #79
  • fix: allow interrupting read builtin, run pipeline cmds in subshell by @reubeno in #81
  • assorted changes, mostly for read builtin + help text by @reubeno in #84
  • Bump cargo-bins/cargo-binstall from 1.6.9 to 1.7.1 in the github-actions group by @dependabot in #82
  • feat: rework here doc files by @reubeno in #85
  • feat: set + validate intentional MSRV (1.72.0) by @reubeno in #86
  • feat: add basic changelog by @reubeno in #87
  • chore(release): bump version to 0.2.0 by @reubeno in #88
  • fix: tweak manifests to work with release flow by @reubeno in #89
  • fix: ensure brush-core builds outside workspace by @reubeno in #90

Full Changelog: brush-shell-v0.1.0...brush-shell-v0.2.2

Open source under the MIT license. Built in the open by the brush community.