Skip to content

Commit

Permalink
util.shell_quote: don't quote obviously clean chars
Browse files Browse the repository at this point in the history
This is just to make things slightly prettier.

Previously, we would generate command lines looking like

    lua 'main.lua' 'binarytrees.lua' '5' '1' > '/tmp/lua_RnBfqB'

Now we recognize that those those strings don't need quotes

    lua main.lua binarytrees.lua 5 1 > /tmp/lua_RnBfqB
  • Loading branch information
hugomg committed Aug 15, 2024
1 parent 7d898f5 commit 55297c6
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
12 changes: 12 additions & 0 deletions spec/util_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ local util = require "pallene.util"

describe("Pallene utils", function()

it("can quote special shell chars", function()
assert.equals([[' ']], util.shell_quote([[ ]]))
assert.equals([['$']], util.shell_quote([[$]]))
assert.equals([['"']], util.shell_quote([["]]))
assert.equals([['a'\''b']], util.shell_quote([[a'b]]))
end)

it("does not quote clean shell chars", function()
assert.equals("foo/bar.txt", util.shell_quote("foo/bar.txt"))
assert.equals("100", util.shell_quote("100"))
end)

it("returns error when a file doesn't exist", function()
local filename = "does_not_exist.pln"
local ok, err = util.get_file_contents(filename)
Expand Down
7 changes: 6 additions & 1 deletion src/pallene/util.lua
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,13 @@ function util.set_file_contents(file_name, contents)
end

-- Quotes a command-line argument according to POSIX shell syntax.
-- Uses a whitelist of safe chars to avoid quoting too much
function util.shell_quote(str)
return "'" .. string.gsub(str, "'", "'\\''") .. "'"
if string.match(str, "^[%w./_-]+$") then
return str
else
return "'" .. string.gsub(str, "'", "'\\''") .. "'"
end
end

function util.execute(cmd)
Expand Down

0 comments on commit 55297c6

Please sign in to comment.