Bug 899875 - Better handle empty arguments in pymake, and also treat whitespaces in bulk. r=ted

This commit is contained in:
Mike Hommey 2013-08-02 10:29:31 +09:00
parent 2e729aa83d
commit 54db32b7a4
2 changed files with 12 additions and 6 deletions

View File

@ -33,7 +33,7 @@ def tokens2re(tokens):
return re.compile('(?:%s|%s)' % (nonescaped, r'(?P<escape>\\\\)')) return re.compile('(?:%s|%s)' % (nonescaped, r'(?P<escape>\\\\)'))
_unquoted_tokens = tokens2re({ _unquoted_tokens = tokens2re({
'whitespace': r'[\t\r\n ]', 'whitespace': r'[\t\r\n ]+',
'quote': r'[\'"]', 'quote': r'[\'"]',
'comment': '#', 'comment': '#',
'special': r'[<>&|`~(){}$;]', 'special': r'[<>&|`~(){}$;]',
@ -59,7 +59,7 @@ class ClineSplitter(list):
""" """
def __init__(self, cline, cwd): def __init__(self, cline, cwd):
self.cwd = cwd self.cwd = cwd
self.arg = '' self.arg = None
self.cline = cline self.cline = cline
self.glob = False self.glob = False
self._parse_unquoted() self._parse_unquoted()
@ -68,6 +68,8 @@ class ClineSplitter(list):
""" """
Push the given string as part of the current argument Push the given string as part of the current argument
""" """
if self.arg is None:
self.arg = ''
self.arg += str self.arg += str
def _next(self): def _next(self):
@ -75,7 +77,7 @@ class ClineSplitter(list):
Finalize current argument, effectively adding it to the list. Finalize current argument, effectively adding it to the list.
Perform globbing if needed. Perform globbing if needed.
""" """
if not self.arg: if self.arg is None:
return return
if self.glob: if self.glob:
if os.path.isabs(self.arg): if os.path.isabs(self.arg):
@ -92,7 +94,7 @@ class ClineSplitter(list):
self.glob = False self.glob = False
else: else:
self.append(self.arg) self.append(self.arg)
self.arg = '' self.arg = None
def _parse_unquoted(self): def _parse_unquoted(self):
""" """
@ -108,7 +110,8 @@ class ClineSplitter(list):
break break
# The beginning of the string, up to the found token, is part of # The beginning of the string, up to the found token, is part of
# the current argument # the current argument
self._push(self.cline[:m.start()]) if m.start():
self._push(self.cline[:m.start()])
self.cline = self.cline[m.end():] self.cline = self.cline[m.end():]
match = dict([(name, value) for name, value in m.groupdict().items() if value]) match = dict([(name, value) for name, value in m.groupdict().items() if value])
@ -142,7 +145,8 @@ class ClineSplitter(list):
self._push(m.group(0)) self._push(m.group(0))
else: else:
raise Exception, "Shouldn't reach here" raise Exception, "Shouldn't reach here"
self._next() if self.arg:
self._next()
def _parse_quoted(self): def _parse_quoted(self):
# Single quoted strings are preserved, except for the final quote # Single quoted strings are preserved, except for the final quote

View File

@ -0,0 +1,2 @@
all:
@ sh -c 'if [ $$# = 3 ] ; then echo TEST-PASS; else echo TEST-FAIL; fi' -- a "" b