Skip to content

Commit

Permalink
Fix parsing environment= with empty quoted strings
Browse files Browse the repository at this point in the history
Pull #329 changed shlex to posix mode to fix quotes inside
quotes (#328).  A side effect of this change is that it
broke parsing empty quotes (#873).  This seems to be due
to a bug in shlex (http://bugs.python.org/issue21999).
Since no release version of Supervisor has shipped with
shlex in posix mode to support quotes inside quotes, we're
reverting it to fix support for empty quotes which has
shipped for many Supervisor versions.  Two unit tests
introduced in #329 pass without posix mode, so those tests
have been retained.  A unit test was also added for #873
in the previous commit.

Reopens #328
Partially reverts #329
Fixes #873
Closes #880
  • Loading branch information
mnaberez committed Jan 17, 2017
1 parent 8be5bc1 commit fa7e3f5
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 10 deletions.
3 changes: 0 additions & 3 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@

- The ``supervisor`` package is no longer a namespace package.

- Parsing ``environment=`` has been improved to allow escaped quotes
inside quotes and quoted empty values. Patch by Stefan Friesel.

- Added new ``stdout_syslog`` and ``stderr_syslog`` options to the config
file. These are boolean options that indicate whether process output will
be sent to syslog. Supervisor can now log to both files and syslog at the
Expand Down
4 changes: 2 additions & 2 deletions supervisor/datatypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def dict_of_key_value_pairs(arg):
""" parse KEY=val,KEY2=val2 into {'KEY':'val', 'KEY2':'val2'}
Quotes can be used to allow commas in the value
"""
lexer = shlex.shlex(str(arg), posix=True)
lexer = shlex.shlex(str(arg))
lexer.wordchars += '/.+-():'

tokens = list(lexer)
Expand All @@ -81,7 +81,7 @@ def dict_of_key_value_pairs(arg):
if len(k_eq_v) != 3 or k_eq_v[1] != '=':
raise ValueError(
"Unexpected end of key/value pairs in value '%s'" % arg)
D[k_eq_v[0]] = k_eq_v[2]
D[k_eq_v[0]] = k_eq_v[2].strip('\'"')
i += 4
return D

Expand Down
5 changes: 0 additions & 5 deletions supervisor/tests/test_datatypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,6 @@ def test_handles_newlines_inside_quotes(self):
expected = {'foo': 'a\nb\nc'}
self.assertEqual(actual, expected)

def test_handles_quotes_inside_quotes(self):
actual = datatypes.dict_of_key_value_pairs('foo="\'\\""')
expected = {'foo': '\'"'}
self.assertEqual(actual, expected)

def test_handles_empty_inside_quotes(self):
actual = datatypes.dict_of_key_value_pairs('foo=""')
expected = {'foo': ''}
Expand Down

0 comments on commit fa7e3f5

Please sign in to comment.