Skip to content

Commit ef49250

Browse files
authored
Merge pull request #1 from ttpho/feature/async
Feature async
2 parents 759c0b4 + 95f2fd2 commit ef49250

File tree

2 files changed

+34
-39
lines changed

2 files changed

+34
-39
lines changed

README.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,6 @@ If ollama server is running, run the script using the command
3131
python3 auto_commit.py
3232
```
3333

34-
Create a commit for each file.
35-
36-
```
37-
python3 auto_commit.py single_file
38-
```
39-
4034

4135

4236
### Miscellaneous

auto_commit.py

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import asyncio
12
import subprocess
23
import sys
3-
from ollama import chat
4-
from ollama import ChatResponse
4+
from ollama import AsyncClient
55

66
model = "gemma3:4b"
77
prompt = f"""
@@ -19,9 +19,11 @@
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

111112
if __name__ == "__main__":
112-
main()
113+
asyncio.run(main())

0 commit comments

Comments
 (0)