Skip to content

Commit

Permalink
* lib/shellwords.rb (Shellwords#shellescape): Drop the //n flag
Browse files Browse the repository at this point in the history
  that only causes warnings with no real effect.  [Bug ruby#5637]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
knu committed Jan 1, 2012
1 parent 069f7ec commit d367b1b
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 3 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
@@ -1,3 +1,8 @@
Sun Jan 1 12:23:10 2012 Akinori MUSHA <knu@iDaemons.org>

* lib/shellwords.rb (Shellwords#shellescape): Drop the //n flag
that only causes warnings with no real effect. [Bug #5637]

Sat Dec 31 06:28:37 2011 NARUSE, Yui <naruse@ruby-lang.org>

* thread.c (rb_barrier_waiting): save the number of waiting threads
Expand Down
12 changes: 9 additions & 3 deletions lib/shellwords.rb
Expand Up @@ -75,15 +75,21 @@ class << self
# # ...
# }
#
# It is caller's responsibility to encode the string in the right
# encoding for the shell environment where this string is used.
# Multibyte characters are treated as multibyte characters, not
# bytes.
#
def shellescape(str)
# An empty argument will be skipped, so return empty quotes.
return "''" if str.empty?

str = str.dup

# Process as a single byte sequence because not all shell
# implementations are multibyte aware.
str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/n, "\\\\\\1")
# Treat multibyte characters as is. It is caller's responsibility
# to encode the string in the right encoding for the shell
# environment.
str.gsub!(/([^A-Za-z0-9_\-.,:\/@\n])/, "\\\\\\1")

# A LF cannot be escaped with a backslash because a backslash + LF
# combo is regarded as line continuation and simply ignored.
Expand Down
8 changes: 8 additions & 0 deletions test/test_shellwords.rb
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
require 'test/unit'
require 'shellwords'

Expand Down Expand Up @@ -36,4 +37,11 @@ def test_unmatched_quotes
shellwords(bad_cmd)
end
end

def test_multibyte_characters
# This is not a spec. It describes the current behavior which may
# be changed in future. There would be no multibyte character
# used as shell meta-character that needs to be escaped.
assert_equal "\\\\い", "あい".shellescape
end
end

0 comments on commit d367b1b

Please sign in to comment.