Skip to content

Add trailer property #1350

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jan 7, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add trailer as commit property
With the command `git interpret-trailers` git provides a way to interact
with trailer lines in the commit messages that look similar to RFC 822
e-mail headers (see: https://git-scm.com/docs/git-interpret-trailers).
The new property returns those parsed trailer lines from the message as
dictionary.
  • Loading branch information
Peter Kempter authored and Ket3r committed Sep 29, 2021
commit acdc05eb2e4c0344237b6e8cea9d2c27dca261ed
41 changes: 40 additions & 1 deletion git/objects/commit.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# This module is part of GitPython and is released under
# the BSD License: http://www.opensource.org/licenses/bsd-license.php
import datetime
import re
from subprocess import Popen
from gitdb import IStream
from git.util import (
Expand Down Expand Up @@ -39,7 +40,7 @@

# typing ------------------------------------------------------------------

from typing import Any, IO, Iterator, List, Sequence, Tuple, Union, TYPE_CHECKING, cast
from typing import Any, IO, Iterator, List, Sequence, Tuple, Union, TYPE_CHECKING, cast, Dict

from git.types import PathLike, Literal

Expand Down Expand Up @@ -315,6 +316,44 @@ def stats(self) -> Stats:
text = self.repo.git.diff(self.parents[0].hexsha, self.hexsha, '--', numstat=True)
return Stats._list_from_string(self.repo, text)

@property
def trailers(self) -> Dict:
"""Get the trailers of the message as dictionary

Git messages can contain trailer information that are similar to RFC 822
e-mail headers (see: https://git-scm.com/docs/git-interpret-trailers).

The trailer is thereby the last paragraph (seperated by a empty line
from the subject/body). This trailer paragraph must contain a ``:`` as
seperator for key and value in every line.

Valid message with trailer:

.. code-block::

Subject line

some body information

another information

key1: value1
key2: value2

:return: Dictionary containing whitespace stripped trailer information
"""
d: Dict[str, str] = {}
match = re.search(r".+^\s*$\n([\w\n\s:]+?)\s*\Z", str(self.message), re.MULTILINE | re.DOTALL)
if match is None:
return d
last_paragraph = match.group(1)
if not all(':' in line for line in last_paragraph.split('\n')):
return d
for line in last_paragraph.split('\n'):
key, value = line.split(':', 1)
d[key.strip()] = value.strip()
return d

@ classmethod
def _iter_from_process_or_stream(cls, repo: 'Repo', proc_or_stream: Union[Popen, IO]) -> Iterator['Commit']:
"""Parse out commit information into a list of Commit objects
Expand Down