From 05c2cb0b2b1bdf0138a35006805f573051b0a4bb Mon Sep 17 00:00:00 2001 From: Aryan <30572125+hotcholula@users.noreply.github.com> Date: Sun, 11 Oct 2026 18:46:21 -0400 Subject: [PATCH] fix(ruby): preserve special characters in rfind filenames (#14173) --- plugins/ruby/README.md | 2 +- plugins/ruby/ruby.plugin.zsh | 2 +- plugins/ruby/tests/rfind.test.zsh | 32 +++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 plugins/ruby/tests/rfind.test.zsh diff --git a/plugins/ruby/README.md b/plugins/ruby/README.md index de613aa83..cdd0fef86 100644 --- a/plugins/ruby/README.md +++ b/plugins/ruby/README.md @@ -14,7 +14,7 @@ plugins=(... ruby) | ------- | -------------------------------------- | ---------------------------------------------------- | | rb | `ruby` | The Ruby command | | sgem | `sudo gem` | Run sudo gem on the system ruby, not the active ruby | -| rfind | `find . -name "*.rb" \| xargs grep -n` | Find ruby file | +| rfind | `find . -name "*.rb" -print0 \| xargs -0 grep -n` | Find ruby file | | rrun | `ruby -e` | Execute some code: E.g: `rrun "puts 'Hello world!'"` | | rserver | `ruby -run -e httpd . -p 8080` | Start HTTP Webrick serving local directory/files | | gein | `gem install` | Install a gem into the local repository | diff --git a/plugins/ruby/ruby.plugin.zsh b/plugins/ruby/ruby.plugin.zsh index e09b22c75..160852b46 100644 --- a/plugins/ruby/ruby.plugin.zsh +++ b/plugins/ruby/ruby.plugin.zsh @@ -2,7 +2,7 @@ alias sgem='sudo gem' # Find ruby file -alias rfind='find . -name "*.rb" | xargs grep -n' +alias rfind='find . -name "*.rb" -print0 | xargs -0 grep -n' # Shorthand Ruby alias rb="ruby" diff --git a/plugins/ruby/tests/rfind.test.zsh b/plugins/ruby/tests/rfind.test.zsh new file mode 100644 index 000000000..6b3d06de8 --- /dev/null +++ b/plugins/ruby/tests/rfind.test.zsh @@ -0,0 +1,32 @@ +#!/usr/bin/env zsh + +emulate -LR zsh + +source "${1:-${0:A:h:h}/ruby.plugin.zsh}" + +test_dir=$(mktemp -d) || exit 1 +trap 'command rm -rf -- "$test_dir"' EXIT + +typeset -i failures=0 tests=0 +typeset filename output + +for filename in plain.rb 'file with spaces.rb' "single'quote.rb" 'double"quote.rb' $'line\nbreak.rb' 'unicode-ą.rb'; do + print -r -- 'needle' >| "$test_dir/$filename" + output=$(cd "$test_dir" && rfind needle 2> "$test_dir/stderr") + actual_status=$? + (( tests++ )) + + if [[ $actual_status == 0 && $output == '1:needle' && ! -s "$test_dir/stderr" ]]; then + print -r -- "PASS: ${(qqq)filename}" + else + print -u2 -r -- "FAIL: ${(qqq)filename} (status $actual_status)" + print -u2 -r -- " stdout: ${(qqq)output}" + print -u2 -r -- " stderr: $(<"$test_dir/stderr")" + (( failures++ )) + fi + + command rm -- "$test_dir/$filename" +done + +print -r -- "$tests tests, $failures failures" +(( failures == 0 ))