Skip to content

Commit 49b3cb4

Browse files
committed
Allow GH action to post review as comment
1 parent cc9133f commit 49b3cb4

4 files changed

Lines changed: 39 additions & 26 deletions

File tree

.github/workflows/code-review.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010

1111
permissions:
1212
contents: read
13-
pull-requests: read
13+
pull-requests: write
1414

1515
steps:
1616
- name: Checkout code

reviewbot/main.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22
import requests
3-
from reviewbot.utils import get_diff
3+
from reviewbot.utils import get_diff, post_pr_comment, get_pr_number
44

55
def review_with_groq(diff):
66
api_key = os.environ.get("GROQ_API_KEY")
@@ -12,23 +12,21 @@ def review_with_groq(diff):
1212
"model": "meta-llama/llama-4-scout-17b-16e-instruct",
1313
"messages": [
1414
{"role": "system", "content": "You are a senior software engineer doing code reviews."},
15-
{"role": "user", "content": f"Please review this code diff:\n\n{diff}"}
15+
{"role": "user", "content": f"Please review this code diff, list improvements in bullet points:\n\n{diff}"}
1616
],
1717
"temperature": 0.3,
1818
}
1919

2020
response = requests.post("https://api.groq.com/openai/v1/chat/completions", headers=headers, json=payload)
2121

22-
# 👇 Print the response for debugging
2322
print("Raw Groq response:", response.status_code, response.text)
24-
2523
response.raise_for_status()
2624
return response.json()["choices"][0]["message"]["content"]
2725

2826
def main():
2927
diff = get_diff()
3028
review = review_with_groq(diff)
31-
print("::notice file=test_module/hello.py,line=1::" + review.replace("\n", " "))
29+
post_pr_comment(review)
3230

3331
if __name__ == "__main__":
3432
main()

reviewbot/utils.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import os
22
import requests
3+
import json
34

4-
def get_diff():
5-
repo = os.environ.get("GITHUB_REPOSITORY") # e.g. "owner/repo"
6-
ref = os.environ.get("GITHUB_REF") # e.g. "refs/pull/123/merge"
5+
def get_pr_number():
6+
event_path = os.getenv("GITHUB_EVENT_PATH")
7+
if not event_path:
8+
raise Exception("GITHUB_EVENT_PATH not set")
79

8-
if not repo or not ref:
9-
raise Exception("Missing GitHub repository or ref environment variables.")
10+
with open(event_path, 'r') as f:
11+
event = json.load(f)
12+
13+
return event["pull_request"]["number"]
1014

11-
# Extract PR number safely:
12-
parts = ref.split("/")
13-
if len(parts) >= 3 and parts[-3] == "pull":
14-
pr_number = parts[-2]
15-
else:
16-
raise Exception(f"Unexpected GITHUB_REF format: {ref}")
15+
def get_diff():
16+
repo = os.environ.get("GITHUB_REPOSITORY") # e.g. "owner/repo"
17+
pr_number = get_pr_number()
1718

1819
token = os.environ.get("GITHUB_TOKEN")
1920
if not token:
@@ -38,8 +39,26 @@ def get_diff():
3839
for f in files:
3940
patch = f.get("patch")
4041
if patch:
41-
diffs.append(patch)
42+
diffs.append(f"File: {f['filename']}\n{patch}")
4243

4344
page += 1
4445

45-
return "\n".join(diffs)
46+
return "\n\n".join(diffs)
47+
48+
def post_pr_comment(body: str):
49+
repo = os.getenv("GITHUB_REPOSITORY")
50+
token = os.getenv("GITHUB_TOKEN")
51+
pr_number = get_pr_number()
52+
53+
url = f"https://api.github.com/repos/{repo}/issues/{pr_number}/comments"
54+
headers = {
55+
"Authorization": f"Bearer {token}",
56+
"Accept": "application/vnd.github+json"
57+
}
58+
payload = {
59+
"body": body
60+
}
61+
62+
response = requests.post(url, headers=headers, json=payload)
63+
print("GitHub API response:", response.status_code, response.text)
64+
response.raise_for_status()

test_module/hello.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
# Hello.py: A sample python script used for testing reviews
22

3-
def twoSum(array, targetSum):
4-
for i in range(0, len(array)):
5-
for j in range(i+1, len(array)):
6-
if array[i] + array[j] == targetSum:
7-
return ([array[i], array[j]])
8-
return []
3+
def helloWorld():
4+
print("Hello World")
95

10-
twoSum([2,7,11,15], 9)
6+
helloWorld()

0 commit comments

Comments
 (0)