1+ import asyncio
12import subprocess
23import sys
3- from ollama import chat
4- from ollama import ChatResponse
4+ from ollama import AsyncClient
55
66model = "gemma3:4b"
77prompt = f"""
1919 2. Summarize all changes into a single logical commit.
2020 3. Write a concise commit message (max 72 characters) in the conventional commit style
2121"""
22+ client = AsyncClient ()
2223
23- def get_changed_files ():
24- # Git add all
24+
25+ async def get_changed_files ():
26+ # Git add all
2527 subprocess .run (
2628 ["git" , "add" , "." ],
2729 capture_output = True , text = True
@@ -40,7 +42,8 @@ def get_changed_files():
4042 # Union of both sets
4143 return sorted (unstaged | staged )
4244
43- def get_diff_for_file (filename , staged = False ):
45+
46+ async def get_diff_for_file (filename , staged = False ):
4447 cmd = ["git" , "diff" ]
4548 if staged :
4649 cmd .append ("--staged" )
@@ -49,34 +52,38 @@ def get_diff_for_file(filename, staged=False):
4952 result = subprocess .run (cmd , capture_output = True , text = True )
5053 return result .stdout
5154
52- def get_commit_messages (diff , files ):
55+
56+ async def get_commit_messages (diff , files ):
5357 # Use the Ollama chat model to get commit messages
5458 if len (diff ) == 0 or len (files ) == 0 :
5559 return ""
5660 try :
57- response : ChatResponse = chat (model = model , messages = [
58- {
59- 'role' : 'user' ,
60- 'content' : prompt .replace ("[Git Diff]" , diff ).replace ("[Changed Files and Types]" , files ),
61- },
62- ])
61+ messages = [
62+ {
63+ 'role' : 'user' ,
64+ 'content' : prompt .replace ("[Git Diff]" , diff ).replace ("[Changed Files and Types]" , files ),
65+ },
66+ ]
67+ response = await client .chat (model = model , messages = messages )
6368 return response ['message' ]['content' ]
6469 except Exception :
6570 return ""
66-
67- def diff_single_file (file ):
71+
72+
73+ async def diff_single_file (file ):
6874 commit_messages = []
69- unstaged_diff = get_diff_for_file (file , staged = False ).strip ()
70- staged_diff = get_diff_for_file (file , staged = True ).strip ()
71- messages_staged_diff = get_commit_messages (staged_diff , file ).strip ()
72- messages_unstaged_diff = get_commit_messages (unstaged_diff , file ).strip ()
75+ unstaged_diff = ( await get_diff_for_file (file , staged = False ) ).strip ()
76+ staged_diff = ( await get_diff_for_file (file , staged = True ) ).strip ()
77+ messages_staged_diff = ( await get_commit_messages (staged_diff , file ) ).strip ()
78+ messages_unstaged_diff = ( await get_commit_messages (unstaged_diff , file ) ).strip ()
7379 if messages_staged_diff :
7480 commit_messages .append (messages_staged_diff )
7581 if messages_unstaged_diff :
7682 commit_messages .append (messages_unstaged_diff )
7783 return commit_messages
78- ""
79- def git_commit_everything (message ):
84+
85+
86+ async def git_commit_everything (message ):
8087 """
8188 Stages all changes (including new, modified, deleted files), commits with the given message,
8289 and pushes the commit to the current branch on the default remote ('origin').
@@ -87,26 +94,20 @@ def git_commit_everything(message):
8794 subprocess .run (['git' , 'add' , '-A' ], check = True )
8895 # Commit with the provided message
8996 subprocess .run (['git' , 'commit' , '-m' , message ], check = True )
90-
91- def main ():
92- commit_single_file = True if ( len ( sys . argv ) > 1 and sys . argv [ 1 ] == "single_file" ) else False
93- files = get_changed_files ()
97+
98+
99+ async def main ():
100+ files = await get_changed_files ()
94101 if not files :
95102 print ("No changes detected." )
96103 return
97104
98- all_commit_messages = []
99105 for file in files :
100106 print (f"{ file } " )
101- commit_messages = diff_single_file (file )
107+ commit_messages = await diff_single_file (file )
102108 commit_messages_text = "\n " .join (commit_messages )
103109 print (f"{ commit_messages_text } " )
104- if commit_single_file :
105- git_commit_everything (commit_messages_text )
106- else :
107- all_commit_messages .extend (commit_messages )
108- if all_commit_messages and not commit_single_file :
109- git_commit_everything ("\n " .join (all_commit_messages ))
110+ await git_commit_everything (commit_messages_text )
110111
111112if __name__ == "__main__" :
112- main ()
113+ asyncio . run ( main () )
0 commit comments