check-files: detect merge artifacts

Detect Git merge artifacts. These are lines starting with "<<<<<<",
"|||||||" or ">>>>>>>" followed by a space, or containing just
"=======". For "=======", exempt Markdown files, because this can be
used to underline a title, as a compromise between false negatives and
false positives.
This commit is contained in:
Gilles Peskine 2018-11-23 21:11:52 +01:00
parent 043980585c
commit c117d5928c

View file

@ -135,6 +135,27 @@ class TabIssueTracker(IssueTracker):
return b"\t" in line return b"\t" in line
class MergeArtifactIssueTracker(IssueTracker):
def __init__(self):
super().__init__()
self.heading = "Merge artifact:"
def issue_with_line(self, filepath, line):
# Detect leftover git conflict markers.
if line.startswith(b'<<<<<<< ') or line.startswith(b'>>>>>>> '):
return True
if line.startswith(b'||||||| '): # from merge.conflictStyle=diff3
return True
if line.rstrip(b'\r\n') == b'=======' and \
not filepath.endswith('.md'):
return True
return False
def check_file_line(self, filepath, line, line_number):
if self.issue_with_line(filepath, line):
self.record_issue(filepath, line_number)
class TodoIssueTracker(IssueTracker): class TodoIssueTracker(IssueTracker):
def __init__(self): def __init__(self):
@ -170,6 +191,7 @@ class IntegrityChecker(object):
LineEndingIssueTracker(), LineEndingIssueTracker(),
TrailingWhitespaceIssueTracker(), TrailingWhitespaceIssueTracker(),
TabIssueTracker(), TabIssueTracker(),
MergeArtifactIssueTracker(),
TodoIssueTracker(), TodoIssueTracker(),
] ]