From 85097aa14350729c759547cc84d6a0b14bb6a097 Mon Sep 17 00:00:00 2001 From: santhreal <64453045+santhreal@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:20:53 -0700 Subject: [PATCH] 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. --- nanobot/command/builtin.py | 2 +- nanobot/utils/gitstore.py | 7 ++++++- tests/agent/test_git_store.py | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/nanobot/command/builtin.py b/nanobot/command/builtin.py index ee8630d1..db788080 100644 --- a/nanobot/command/builtin.py +++ b/nanobot/command/builtin.py @@ -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 ` before restoring it.", diff --git a/nanobot/utils/gitstore.py b/nanobot/utils/gitstore.py index 1ccf3d0c..4d40e2cd 100644 --- a/nanobot/utils/gitstore.py +++ b/nanobot/utils/gitstore.py @@ -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)" diff --git a/tests/agent/test_git_store.py b/tests/agent/test_git_store.py index 09b16b60..fa893d66 100644 --- a/tests/agent/test_git_store.py +++ b/tests/agent/test_git_store.py @@ -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):