@@ -50,31 +50,94 @@ class TestPatch(base.Base):
for newpatch in TestPatch.newpatches:
payload = newpatch.__str__()
- if not self.upstream_status_regex.search_string(payload):
- self.fail('Added patch file is missing Upstream-Status: <Valid status> in the commit message',
- data=[('Standard format', self.standard_format), ('Valid status', self.valid_status)])
- for line in payload.splitlines():
+ lines = payload.splitlines()
+
+ scissors_index = None
+ for idx, line in enumerate(lines):
+ if line.lstrip('+') == '---':
+ scissors_index = idx
+ break
+
+ header_has_upstream = False
+ body_has_upstream = False
+
+ for idx, line in enumerate(lines):
+ if not self.upstream_status_regex.search_string(line):
+ continue
+ if scissors_index is not None and idx > scissors_index:
+ body_has_upstream = True
+ else:
+ header_has_upstream = True
+
+ if not header_has_upstream:
+ if body_has_upstream:
+ self.fail(
+ 'Upstream-Status is present only after the patch scissors ("---"). '
+ 'It must be placed in the patch header before the scissors line.',
+ data=[
+ ('Standard format', self.standard_format),
+ ('Valid status', self.valid_status),
+ ],
+ )
+ else:
+ self.fail(
+ 'Added patch file is missing Upstream-Status: <Valid status> in the commit message',
+ data=[
+ ('Standard format', self.standard_format),
+ ('Valid status', self.valid_status),
+ ],
+ )
+
+ for idx, line in enumerate(lines):
if self.patchmetadata_regex.match(line):
continue
- if self.upstream_status_regex.search_string(line):
- if parse_upstream_status.inappropriate_status_mark.searchString(line):
- try:
- parse_upstream_status.upstream_status_inappropriate_info.parseString(line.lstrip('+'))
- except pyparsing.ParseException as pe:
- self.fail('Upstream-Status is Inappropriate, but no reason was provided',
- data=[('Current', pe.pstr), ('Standard format', 'Upstream-Status: Inappropriate [reason]')])
- elif parse_upstream_status.submitted_status_mark.searchString(line):
- try:
- parse_upstream_status.upstream_status_submitted_info.parseString(line.lstrip('+'))
- except pyparsing.ParseException as pe:
- self.fail('Upstream-Status is Submitted, but it is not mentioned where',
- data=[('Current', pe.pstr), ('Standard format', 'Upstream-Status: Submitted [where]')])
- else:
- try:
- parse_upstream_status.upstream_status.parseString(line.lstrip('+'))
- except pyparsing.ParseException as pe:
- self.fail('Upstream-Status is in incorrect format',
- data=[('Current', pe.pstr), ('Standard format', self.standard_format), ('Valid status', self.valid_status)])
+ if not self.upstream_status_regex.search_string(line):
+ continue
+ if scissors_index is not None and idx > scissors_index:
+ self.fail(
+ 'Upstream-Status must be placed in the patch header before the scissors line ("---"), '
+ 'but was found afterwards.',
+ data=[
+ ('Current', line.lstrip('+')),
+ ('Standard format', self.standard_format),
+ ('Valid status', self.valid_status),
+ ],
+ )
+
+ if parse_upstream_status.inappropriate_status_mark.searchString(line):
+ try:
+ parse_upstream_status.upstream_status_inappropriate_info.parseString(line.lstrip('+'))
+ except pyparsing.ParseException as pe:
+ self.fail(
+ 'Upstream-Status is Inappropriate, but no reason was provided',
+ data=[
+ ('Current', pe.pstr),
+ ('Standard format', 'Upstream-Status: Inappropriate [reason]'),
+ ],
+ )
+ elif parse_upstream_status.submitted_status_mark.searchString(line):
+ try:
+ parse_upstream_status.upstream_status_submitted_info.parseString(line.lstrip('+'))
+ except pyparsing.ParseException as pe:
+ self.fail(
+ 'Upstream-Status is Submitted, but it is not mentioned where',
+ data=[
+ ('Current', pe.pstr),
+ ('Standard format', 'Upstream-Status: Submitted [where]'),
+ ],
+ )
+ else:
+ try:
+ parse_upstream_status.upstream_status.parseString(line.lstrip('+'))
+ except pyparsing.ParseException as pe:
+ self.fail(
+ 'Upstream-Status is in incorrect format',
+ data=[
+ ('Current', pe.pstr),
+ ('Standard format', self.standard_format),
+ ('Valid status', self.valid_status),
+ ],
+ )
def test_signed_off_by_presence(self):
if not TestPatch.newpatches: