Fix bug with CRLF in new-lines and require-starting-space
Pound-signs followed by a lone CRLF should not raise if require-starting-space is specified. If require-starting-space is true, *and* either: - new-lines: disbale, or - newlines: type: dos is specified, a line with `#\r` or `#\r\n` should not raise a false positive. This commit also uses a Set for O(1) membership testing and uses the correct escape sequence for the nul byte. If we find a CRLF when looking for Unix newlines, yamllint should always raise, regardless of logic with require-starting-space. Closes: Issue #171.
This commit is contained in:
@@ -186,6 +186,27 @@ class CommentsTestCase(RuleTestCase):
|
|||||||
'inline: comment #\n'
|
'inline: comment #\n'
|
||||||
'foo: bar\n', conf)
|
'foo: bar\n', conf)
|
||||||
|
|
||||||
|
def test_empty_comment_crlf_dos_newlines(self):
|
||||||
|
conf = ('comments:\n'
|
||||||
|
' require-starting-space: true\n'
|
||||||
|
' min-spaces-from-content: 2\n'
|
||||||
|
'new-lines:\n'
|
||||||
|
' type: dos\n')
|
||||||
|
self.check('---\r\n'
|
||||||
|
'# This is paragraph 1.\r\n'
|
||||||
|
'#\r\n'
|
||||||
|
'# This is paragraph 2.\r\n', conf)
|
||||||
|
|
||||||
|
def test_empty_comment_crlf_disabled_newlines(self):
|
||||||
|
conf = ('comments:\n'
|
||||||
|
' require-starting-space: true\n'
|
||||||
|
' min-spaces-from-content: 2\n'
|
||||||
|
'new-lines: disable\n')
|
||||||
|
self.check('---\r\n'
|
||||||
|
'# This is paragraph 1.\r\n'
|
||||||
|
'#\r\n'
|
||||||
|
'# This is paragraph 2.\r\n', conf)
|
||||||
|
|
||||||
def test_first_line(self):
|
def test_first_line(self):
|
||||||
conf = ('comments:\n'
|
conf = ('comments:\n'
|
||||||
' require-starting-space: true\n'
|
' require-starting-space: true\n'
|
||||||
|
|||||||
@@ -40,6 +40,16 @@ class NewLinesTestCase(RuleTestCase):
|
|||||||
self.check('---\ntext\n', conf)
|
self.check('---\ntext\n', conf)
|
||||||
self.check('---\r\ntext\r\n', conf, problem=(1, 4))
|
self.check('---\r\ntext\r\n', conf, problem=(1, 4))
|
||||||
|
|
||||||
|
def test_unix_type_required_st_sp(self):
|
||||||
|
# If we find a CRLF when looking for Unix newlines, yamllint
|
||||||
|
# should always raise, regardless of logic with
|
||||||
|
# require-starting-space.
|
||||||
|
conf = ('new-line-at-end-of-file: disable\n'
|
||||||
|
'new-lines: {type: unix}\n'
|
||||||
|
'comments:\n'
|
||||||
|
' require-starting-space: true\n')
|
||||||
|
self.check('---\r\n#\r\n', conf, problem=(1, 4))
|
||||||
|
|
||||||
def test_dos_type(self):
|
def test_dos_type(self):
|
||||||
conf = ('new-line-at-end-of-file: disable\n'
|
conf = ('new-line-at-end-of-file: disable\n'
|
||||||
'new-lines: {type: dos}\n')
|
'new-lines: {type: dos}\n')
|
||||||
|
|||||||
@@ -97,7 +97,9 @@ def check(conf, comment):
|
|||||||
comment.column_no == 1 and
|
comment.column_no == 1 and
|
||||||
re.match(r'^!\S', comment.buffer[text_start:])):
|
re.match(r'^!\S', comment.buffer[text_start:])):
|
||||||
return
|
return
|
||||||
elif comment.buffer[text_start] not in (' ', '\n', '\0'):
|
# We can test for both \r and \r\n just by checking first char
|
||||||
|
# \r itself is a valid newline on some older OS.
|
||||||
|
elif comment.buffer[text_start] not in {' ', '\n', '\r', '\x00'}:
|
||||||
column = comment.column_no + text_start - comment.pointer
|
column = comment.column_no + text_start - comment.pointer
|
||||||
yield LintProblem(comment.line_no,
|
yield LintProblem(comment.line_no,
|
||||||
column,
|
column,
|
||||||
|
|||||||
Reference in New Issue
Block a user