Skip to content

Release Notes

brush v0.2.19

🚀 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-parser-v0.2.17

chore: Release package brush-parser version 0.2.17

brush-interactive-v0.2.19

chore: Release package brush-interactive version 0.2.19

brush-core-v0.3.2

chore: Release package brush-core version 0.3.2

brush v0.2.18

🚀 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 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-parser-v0.2.16

chore: Release package brush-parser version 0.2.16

brush-interactive-v0.2.18

chore: Release package brush-interactive version 0.2.18

brush-core-v0.3.1

chore: Release package brush-core version 0.3.1

brush v0.2.17

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-parser-v0.2.15

chore: Release package brush-parser version 0.2.15