fix(utils): handle empty commit messages in CommitInfo.format

Empty git commit messages made splitlines()[0] raise IndexError in format() and /dream-restore list rendering.
This commit is contained in:
santhreal 2026-07-17 21:20:53 -07:00 committed by Xubin Ren
parent 6de5a0c5ca
commit 85097aa143
3 changed files with 15 additions and 2 deletions

View File

@ -650,7 +650,7 @@ def _format_dream_restore_list(commits: list) -> str:
"",
]
for c in commits:
lines.append(f"- `{c.sha}` {c.timestamp} - {c.message.splitlines()[0]}")
lines.append(f"- `{c.sha}` {c.timestamp} - {c.subject()}")
lines.extend([
"",
"Preview a version with `/dream-log <sha>` before restoring it.",

View File

@ -22,9 +22,14 @@ class CommitInfo:
message: str
timestamp: str # Formatted datetime
def subject(self) -> str:
"""First line of the commit message, or a placeholder if empty."""
lines = self.message.splitlines()
return lines[0] if lines else "(no message)"
def format(self, diff: str = "") -> str:
"""Format this commit for display, optionally with a diff."""
header = f"## {self.message.splitlines()[0]}\n`{self.sha}` — {self.timestamp}\n"
header = f"## {self.subject()}\n`{self.sha}` — {self.timestamp}\n"
if diff:
return f"{header}\n```diff\n{diff}\n```"
return f"{header}\n(no file changes)"

View File

@ -227,6 +227,14 @@ class TestCommitInfoFormat:
result = c.format()
assert "(no file changes)" in result
def test_format_empty_message(self):
from nanobot.utils.gitstore import CommitInfo
c = CommitInfo(sha="abcd1234", message="", timestamp="2026-04-02 12:00")
result = c.format()
assert "(no message)" in result
assert "`abcd1234`" in result
assert c.subject() == "(no message)"
class TestRevert:
def test_returns_none_when_not_initialized(self, git):