Diamond on others contracts #254
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: "Code Review by Gemini AI" | |
on: | |
issue_comment: | |
types: | |
- created | |
- updated | |
jobs: | |
review: | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
pull-requests: write | |
issues: read | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Only PR comments | |
if: ${{ !github.event.issue.pull_request || !contains(github.event.comment.body,'!ai') }} | |
run: exit 1 | |
- name: Put a reaction to the comment | |
run: gh api graphql --silent --raw-field query="mutation AddReaction {addReaction(input:{subjectId:\"$NODE_ID\",content:EYES}){reaction{content}subject{id}}}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NODE_ID: ${{ github.event.comment.node_id }} | |
- name: Fetch filtered PR diff (only .ts, .tsx, .sol files) | |
id: pr-diff | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const pr_number = context.payload.issue.number; | |
const pr = await github.rest.pulls.get({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: pr_number | |
}); | |
const { data: diff } = await github.request('GET /repos/{owner}/{repo}/pulls/{pull_number}', { | |
headers: { | |
accept: 'application/vnd.github.v3.diff' | |
}, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: pr_number | |
}); | |
// Initialize variables to store filtered diff and a flag for capturing lines | |
let filteredDiff = ''; | |
let capture = false; | |
// Iterate over each line in the diff | |
diff.split('\n').forEach(line => { | |
// Check if the line is a diff line for the relevant file types | |
if (line.startsWith('diff --git')) { | |
capture = line.endsWith('.ts') || line.endsWith('.tsx') || line.endsWith('.sol'); | |
} | |
// If capturing, append the current line to the filtered diff | |
if (capture) { | |
filteredDiff += line + '\n'; | |
} | |
}); | |
// Get the head commit SHA | |
const headSha = pr.data.head.sha; | |
// Set outputs for the filtered diff and head SHA | |
core.setOutput("diff", filteredDiff); | |
core.setOutput("headSha", headSha); | |
- name: Log filtered diff to file | |
id: log-diff | |
continue-on-error: true | |
run: | | |
echo "${{ steps.pr-diff.outputs.diff }}" | |
- uses: rubensflinco/[email protected] | |
name: "Code Review by Gemini AI" | |
id: review | |
continue-on-error: true | |
with: | |
gemini_api_key: ${{ secrets.GEMINI_API_KEY }} | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
github_repository: ${{ github.repository }} | |
github_pull_request_number: ${{ github.event.issue.number }} | |
git_commit_hash: ${{ steps.pr-diff.outputs.headSha }} | |
model: "gemini-1.5-pro-latest" | |
pull_request_diff: |- | |
${{ steps.pr-diff.outputs.diff }} | |
pull_request_chunk_size: "5000" | |
extra_prompt: |- | |
Make a pull request review in regards of the added and removed code. | |
Start with a summary of the changes and then list detail the review and suggestions. | |
Focus on code quality, security, performance, best practices and potential mistakes. | |
Never ask to provide more code and only review the code you received even if its partial. | |
When a line start with a minus (`-`) it means that the line was removed, when it starts with plus (`+`) it means that the line was added. | |
log_level: "DEBUG" | |
- name: Get Gemini step log | |
if: steps.review.outcome == 'failure' | |
id: get-gemini-log | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
run: | | |
gemini_log=$(gh run view ${{ github.run_id }} --log) | |
echo "gemini_log<<EOF" >> $GITHUB_OUTPUT | |
echo "$gemini_log" >> $GITHUB_OUTPUT | |
echo "EOF" >> $GITHUB_OUTPUT | |
- name: Add comment with log | |
if: steps.review.outcome == 'failure' && steps.get-gemini-log.outcome == 'success' | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const runUrl = `https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}`; | |
const geminiLog = `${{ steps.get-gemini-log.outputs.gemini_log }}`; | |
github.rest.issues.createComment({ | |
issue_number: context.issue.number, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body: `Gemini Code Review encountered an error. [View the run here](${runUrl}).\n\nHere is the step log from the review step:\n\n\`\`\`\n${geminiLog}\n\`\`\`` | |
}); | |
- name: Add thumbs down reaction if something went wrong | |
if: failure() | |
run: gh api graphql --silent --raw-field query="mutation AddReaction {addReaction(input:{subjectId:\"$NODE_ID\",content:THUMBS_DOWN}){reaction{content}subject{id}}}" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NODE_ID: ${{ github.event.comment.node_id }} |