utils: checkstyle.py: Fix trailer parsing for commits with changelogs

Trailers are extracted from commits using the '(trailers:*)' formatting
specifier. git ignores dividers when doing so, as if the --no-divider
options was passed to git-interpret-trailers. This prevents trailers
from being located when the patch contains a local changelog.

There is unfortuantely no 'no-no-divider' option to the trailers format
specifier. Fix the issue by extracting trailers with
git-interpret-trailers, that gives better control of the parsing.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2024-08-05 20:38:34 +03:00
parent 82c5ea24b0
commit 6f1df8d606

View file

@ -216,28 +216,28 @@ class Commit:
self._trailers = [] self._trailers = []
self._parse() self._parse()
def _parse_trailers(self, lines): def _parse_trailers(self):
for index in range(2, len(lines)): proc_show = subprocess.run(['git', 'show', '--format=%b',
line = lines[index] '--no-patch', self.commit],
if not line: stdout=subprocess.PIPE)
break trailers = subprocess.run(['git', 'interpret-trailers', '--parse'],
input=proc_show.stdout,
stdout=subprocess.PIPE).stdout.decode('utf-8')
self._trailers.append(line) self._trailers = trailers.splitlines()
return index
def _parse(self): def _parse(self):
# Get the commit title and list of files. # Get the commit title and list of files.
ret = subprocess.run(['git', 'show', '--format=%an <%ae>%n%s%n%(trailers:only,unfold)', ret = subprocess.run(['git', 'show', '--format=%an <%ae>%n%s',
'--name-status', self.commit], '--name-status', self.commit],
stdout=subprocess.PIPE).stdout.decode('utf-8') stdout=subprocess.PIPE).stdout.decode('utf-8')
lines = ret.splitlines() lines = ret.splitlines()
self._author = lines[0] self._author = lines[0]
self._title = lines[1] self._title = lines[1]
self._files = [CommitFile(f) for f in lines[2:] if f]
index = self._parse_trailers(lines) self._parse_trailers()
self._files = [CommitFile(f) for f in lines[index:] if f]
def files(self, filter='AMR'): def files(self, filter='AMR'):
return [f.filename for f in self._files if f.status in filter] return [f.filename for f in self._files if f.status in filter]
@ -288,7 +288,7 @@ class Amendment(Commit):
def _parse(self): def _parse(self):
# Create a title using HEAD commit and parse the trailers. # Create a title using HEAD commit and parse the trailers.
ret = subprocess.run(['git', 'show', '--format=%an <%ae>%n%H %s%n%(trailers:only,unfold)', ret = subprocess.run(['git', 'show', '--format=%an <%ae>%n%H %s',
'--no-patch'], '--no-patch'],
stdout=subprocess.PIPE).stdout.decode('utf-8') stdout=subprocess.PIPE).stdout.decode('utf-8')
lines = ret.splitlines() lines = ret.splitlines()
@ -296,7 +296,7 @@ class Amendment(Commit):
self._author = lines[0] self._author = lines[0]
self._title = 'Amendment of ' + lines[1] self._title = 'Amendment of ' + lines[1]
self._parse_trailers(lines) self._parse_trailers()
# Extract the list of modified files # Extract the list of modified files
ret = subprocess.run(['git', 'diff', '--staged', '--name-status', 'HEAD~'], ret = subprocess.run(['git', 'diff', '--staged', '--name-status', 'HEAD~'],