Add trailer support for commit creation#2116
Add trailer support for commit creation#2116Krishnachaitanyakc wants to merge 1 commit intogitpython-developers:mainfrom
Conversation
Add a `trailers` parameter to `Commit.create_from_tree()` and `IndexFile.commit()` that allows appending trailer key-value pairs (e.g. Signed-off-by, Issue) to the commit message at creation time. Trailers can be passed as either a dict or a list of (key, value) tuples, the latter being useful when duplicate keys are needed. The implementation uses `git interpret-trailers` for proper formatting, consistent with the existing trailer parsing in `Commit.trailers_list`. Closes gitpython-developers#1998
|
@codex review |
There was a problem hiding this comment.
Pull request overview
Adds support for creating commit trailers when programmatically generating commits, aligning commit creation with GitPython’s existing trailer parsing capabilities.
Changes:
- Add a
trailersparameter toCommit.create_from_tree()to append trailers viagit interpret-trailers. - Thread
trailersthroughIndexFile.commit()so index commits can include trailers. - Add tests covering dict-based trailers, list-of-tuples trailers (duplicate keys), and the index commit plumbing.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
git/objects/commit.py |
Adds trailers support in Commit.create_from_tree() by invoking git interpret-trailers. |
git/index/base.py |
Exposes trailers in IndexFile.commit() and forwards it to Commit.create_from_tree(). |
test/test_commit.py |
Adds round-trip tests validating trailer creation and parsing for both APIs. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| as_process=True, | ||
| istream=PIPE, | ||
| ) | ||
| message = proc.communicate(str(message).encode())[0].decode("utf8") |
There was a problem hiding this comment.
When running git interpret-trailers via repo.git.execute(..., as_process=True), non-zero exit codes are not surfaced unless the process is explicitly waited/finalized. After proc.communicate(...), call finalize_process(proc) (or proc.wait()) so failures (e.g., unsupported git version, config errors) raise GitCommandError instead of silently producing an incomplete/empty message.
| message = proc.communicate(str(message).encode())[0].decode("utf8") | |
| stdout_bytes, _ = proc.communicate(str(message).encode()) | |
| finalize_process(proc) | |
| message = stdout_bytes.decode("utf8") |
| trailer_args.append("--trailer") | ||
| trailer_args.append(f"{key}: {val}") | ||
|
|
||
| cmd = ["git", "interpret-trailers"] + trailer_args |
There was a problem hiding this comment.
cmd hard-codes the git executable as the literal string "git". This bypasses GitPython’s configured executable (repo.git.GIT_PYTHON_GIT_EXECUTABLE) and can break environments that override it (custom path/wrapper). Consider building the command using the configured executable (and ideally aligning with the existing trailers_list implementation too).
| cmd = ["git", "interpret-trailers"] + trailer_args | |
| cmd = [repo.git.GIT_PYTHON_GIT_EXECUTABLE, "interpret-trailers"] + trailer_args |
Byron
left a comment
There was a problem hiding this comment.
Thanks a lot, this looks good to me.
The Copilot comments should be addressed and then it can be merged.
Summary
trailersparameter toCommit.create_from_tree()andIndexFile.commit()enabling trailer creation (e.g.Signed-off-by,Issue) when committing programmaticallydictor a list of(key, value)tuples (for duplicate keys like multipleSigned-off-by)git interpret-trailersfor formatting, consistent with existing trailer parsing inCommit.trailers_listCloses #1998
Motivation
GitPython already supports parsing trailers from existing commits, but did not support adding them when creating new commits. The
git commitCLI supports this via--trailer, e.g.:This change brings equivalent functionality to GitPython's Python API.
Usage
Test plan
test_create_from_tree_with_trailers_dict- verifies dict-based trailer creation and round-trip parsingtest_create_from_tree_with_trailers_list- verifies list-of-tuples trailer creation with duplicate keystest_index_commit_with_trailers- verifiesIndexFile.commit()passes trailers through correctly