Skip to content

Commit 0843425

Browse files
committed
move fzf function to cli
1 parent 4d762dd commit 0843425

2 files changed

Lines changed: 79 additions & 80 deletions

File tree

src/blueprint/cli.py

Lines changed: 78 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
55
import sys
66
import time
77
import logging
8+
import subprocess
9+
from typing import List, Optional
810

911
from blueprint.commit_generator import (
1012
get_git_diff,
1113
generate_commit_messages,
12-
select_message_with_fzf,
1314
create_commit,
1415
)
1516

1617
DEFAULT_OLLAMA_MODEL = "llama3.1"
17-
DEFAULT_JAN_MODEL = "llama3.1-8b-instruct"
18+
DEFAULT_JAN_MODEL = "llama3.2-3b-instruct"
1819

1920

2021
def setup_logging(debug_mode):
@@ -27,6 +28,80 @@ def setup_logging(debug_mode):
2728
)
2829

2930

31+
def select_message_with_fzf(
32+
messages: List[str],
33+
use_vim: bool = False,
34+
use_num: bool = False,
35+
) -> Optional[str]:
36+
"""Use fzf to select a commit message, with option to regenerate.
37+
38+
Args:
39+
messages: List of commit messages to select from
40+
use_vim: Whether to use vim-style navigation
41+
use_num: Whether to display numbers for selection
42+
43+
Returns:
44+
Selected message, "regenerate" to regenerate messages, or None if cancelled
45+
"""
46+
logger = logging.getLogger(__name__)
47+
logger.debug("Displaying fzf selector for commit messages")
48+
49+
try:
50+
messages.append("Regenerate messages")
51+
fzf_args = [
52+
"fzf",
53+
"--height=10",
54+
"--layout=reverse",
55+
"--prompt=Select a commit message (ESC to cancel): ",
56+
"--no-info",
57+
"--margin=1,2",
58+
"--border",
59+
"--color=prompt:#D73BC9,pointer:#D73BC9",
60+
]
61+
62+
if use_vim:
63+
fzf_args.extend(["--bind", "j:down,k:up"])
64+
logger.debug("Using vim-style navigation in fzf")
65+
66+
if use_num:
67+
for i, msg in enumerate(messages):
68+
messages[i] = f"{i+1}. {msg}"
69+
fzf_args.extend(
70+
[
71+
"--bind",
72+
"1:accept-non-empty,2:accept-non-empty,3:accept-non-empty,4:accept-non-empty",
73+
]
74+
)
75+
logger.debug("Using number selection in fzf")
76+
77+
logger.debug(f"Displaying {len(messages)} options in fzf")
78+
result = subprocess.run(
79+
fzf_args,
80+
input="\n".join(messages),
81+
capture_output=True,
82+
text=True,
83+
)
84+
if result.returncode == 130: # User pressed ESC
85+
logger.debug("User cancelled selection with ESC")
86+
return None
87+
selected = result.stdout.strip()
88+
logger.debug(f"User selected: '{selected}'")
89+
90+
if selected == "Regenerate messages" or selected == "4. Regenerate messages":
91+
logger.debug("User chose to regenerate messages")
92+
return "regenerate"
93+
94+
final_selection = (
95+
selected.split(". ", 1)[1] if use_num and selected else selected
96+
)
97+
logger.debug(f"Final selection: '{final_selection}'")
98+
return final_selection
99+
except subprocess.CalledProcessError as e:
100+
logger.error(f"fzf selection failed: {e}")
101+
print("Error: fzf selection failed.")
102+
return None
103+
104+
30105
def main():
31106
"""Main entry point for the CLI application."""
32107
OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", DEFAULT_OLLAMA_MODEL)
@@ -108,7 +183,7 @@ def main():
108183
# Select message or regenerate
109184
while True:
110185
selected_message = select_message_with_fzf(
111-
commit_messages, use_vim=args.vim, use_num=args.num, debug=args.debug
186+
commit_messages, use_vim=args.vim, use_num=args.num
112187
)
113188

114189
if selected_message == "regenerate":

src/blueprint/commit_generator.py

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import subprocess
44
import sys
55
import logging
6-
from typing import List, Optional
6+
from typing import List
77

88
from blueprint.ai_service import AIService
99

@@ -242,82 +242,6 @@ def parse_commit_messages(response: str, debug: bool = False) -> List[str]:
242242
return messages
243243

244244

245-
def select_message_with_fzf(
246-
messages: List[str],
247-
use_vim: bool = False,
248-
use_num: bool = False,
249-
debug: bool = False,
250-
) -> Optional[str]:
251-
"""Use fzf to select a commit message, with option to regenerate.
252-
253-
Args:
254-
messages: List of commit messages to select from
255-
use_vim: Whether to use vim-style navigation
256-
use_num: Whether to display numbers for selection
257-
debug: Whether to enable debug logging
258-
259-
Returns:
260-
Selected message, "regenerate" to regenerate messages, or None if cancelled
261-
"""
262-
logger = logging.getLogger(__name__)
263-
logger.debug("Displaying fzf selector for commit messages")
264-
265-
try:
266-
messages.append("Regenerate messages")
267-
fzf_args = [
268-
"fzf",
269-
"--height=10",
270-
"--layout=reverse",
271-
"--prompt=Select a commit message (ESC to cancel): ",
272-
"--no-info",
273-
"--margin=1,2",
274-
"--border",
275-
"--color=prompt:#D73BC9,pointer:#D73BC9",
276-
]
277-
278-
if use_vim:
279-
fzf_args.extend(["--bind", "j:down,k:up"])
280-
logger.debug("Using vim-style navigation in fzf")
281-
282-
if use_num:
283-
for i, msg in enumerate(messages):
284-
messages[i] = f"{i+1}. {msg}"
285-
fzf_args.extend(
286-
[
287-
"--bind",
288-
"1:accept-non-empty,2:accept-non-empty,3:accept-non-empty,4:accept-non-empty",
289-
]
290-
)
291-
logger.debug("Using number selection in fzf")
292-
293-
logger.debug(f"Displaying {len(messages)} options in fzf")
294-
result = subprocess.run(
295-
fzf_args,
296-
input="\n".join(messages),
297-
capture_output=True,
298-
text=True,
299-
)
300-
if result.returncode == 130: # User pressed ESC
301-
logger.debug("User cancelled selection with ESC")
302-
return None
303-
selected = result.stdout.strip()
304-
logger.debug(f"User selected: '{selected}'")
305-
306-
if selected == "Regenerate messages" or selected == "4. Regenerate messages":
307-
logger.debug("User chose to regenerate messages")
308-
return "regenerate"
309-
310-
final_selection = (
311-
selected.split(". ", 1)[1] if use_num and selected else selected
312-
)
313-
logger.debug(f"Final selection: '{final_selection}'")
314-
return final_selection
315-
except subprocess.CalledProcessError as e:
316-
logger.error(f"fzf selection failed: {e}")
317-
print("Error: fzf selection failed.")
318-
return None
319-
320-
321245
def create_commit(message: str, debug: bool = False) -> bool:
322246
"""Create a git commit with the selected message.
323247

0 commit comments

Comments
 (0)