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.
pull/264/head
Brad Solomon 5 years ago committed by GitHub
parent 278a79f093
commit 512fe17047
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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,

Loading…
Cancel
Save