Code Review

Submit multiple .java files along with their corresponding .patch files to ChatGPT for review.

Here is the example on how to create .patch file between branches origin/develop and feature/JIRA-12345 for file path/to/file/MyClass.java:

git diff origin/develop feature/JIRA-12345 -- path/to/file/MyClass.java > ../MyClass.patch

import os
import fnmatch
import tiktoken
import textwrap
import streamlit as st
from openai import OpenAI

Initialize OpenAI client

openai_model = "gpt-4o"
openai_temperature = 0.7

client = OpenAI()
encoding = tiktoken.encoding_for_model(openai_model)

Get names of files in current folder.

java_files = [os.path.splitext(file)[0] for file in os.listdir('.') if fnmatch.fnmatch(file, '*.java')]
st.write(java_files)

Collect messages for OpenAI request.

messages = []

messages.append({
  "role": "system",
  "content": """
      You are a helpful assistant that reviews Java code
      and compares it with corresponding patch files.
      For each pair of files, analyze the differences,
      check code quality, suggest improvements, and flag potential bugs.
      Provide feedback for each set."""
})

Extract .java and .patch files from the list and add them to messages.

tokens = 0
num = 0
for java_file in java_files:
        with open(java_file + ".java", 'r', encoding='utf-8') as file:
            java = file.read()
        with open(java_file + ".patch", 'r', encoding='utf-8') as file:
            patch = file.read()
        tokens += len(encoding.encode(java))
        tokens += len(encoding.encode(patch))
        num += 1
        messages.append({
            "role": "user",
        "content": f"### Java File {num} ###\n{java}"
        })
        messages.append({
            "role": "user",
        "content": f"### Patch File {num} ###\n{patch}"
        })
        messages.append({
            "role": "user",
        "content": f"Please review the changes in Patch File {num} for Java File {num}."
        })

st.write(f"Tokens: `{tokens}`")

openai_result = ""

Join the strings with their corresponding numbers

def format_list_with_numbers(string_list):
    formatted_strings = "\n".join(f"{index + 1}. {item}" for index, item in enumerate(string_list))
    return formatted_strings

Write output file

def save_result(out_file):
    with open(out_file, 'w') as file:
        file.write(textwrap.dedent(f"""
            # Code Review

            ## Files

            """))
        file.write(format_list_with_numbers(java_files))
        file.write(textwrap.dedent(f"""

            ## Result

            """))
        file.write(openai_result)

    st.write(f"File saved: `{out_file}`")

Button to send OpenAI request.

if st.button("Call OpenAI"):
    response = client.chat.completions.create(
        model=openai_model,
        messages=messages,
        temperature=openai_temperature,
    )
    choice = response.choices[0]
    openai_result = choice.message.content
    st.write(openai_result)

    save_result("code_review.md")