#!/bin/bash # scripts/review.sh # # Usage: ./scripts/review.sh [model] set -e if [[ -z "${1}" ]]; then echo "Usage: ${0} [model]" exit 1 fi pr="${1}" model="${2:-gemini-3.1-pro-preview}" REPO="google-gemini/gemini-cli" REVIEW_DIR="${HOME}/git/review/gemini-cli" if [[ ! -d "${REVIEW_DIR}" ]]; then echo "ERROR: Directory ${REVIEW_DIR} does not exist." echo "" echo "Please create a new gemini-cli clone at that directory to use for reviews." echo "Instructions:" echo " mkdir -p ~/git/review" echo " cd ~/git/review" echo " git clone https://github.com/google-gemini/gemini-cli.git" exit 1 fi # 1. Check if the PR exists before doing anything else echo "review: Validating PR ${pr} on ${REPO}..." if ! gh pr view "${pr}" -R "${REPO}" > /dev/null 2>&1; then echo "ERROR: Could not find PR #${pr} in ${REPO}." echo "Are you sure ${pr} is a Pull Request number and not an Issue number?" exit 1 fi echo "review: Opening PR ${pr} in browser..." uname_out="$(uname || true)" if [[ "${uname_out}" == "Darwin" ]]; then open "https://github.com/${REPO}/pull/${pr}" || true else xdg-open "https://github.com/${REPO}/pull/${pr}" || true fi echo "review: Changing directory to ${REVIEW_DIR}" cd "${REVIEW_DIR}" || exit 1 # 2. Fetch latest main to ensure we have a clean starting point echo "review: Fetching latest from origin..." git fetch origin main # 3. Handle worktree creation WORKTREE_PATH="pr_${pr}" if [[ -d "${WORKTREE_PATH}" ]]; then echo "review: Worktree directory ${WORKTREE_PATH} already exists." # Check if it's actually a registered worktree # shellcheck disable=SC2312 if git worktree list | grep -q "${WORKTREE_PATH}"; then echo "review: Reusing existing worktree..." else echo "review: Directory exists but is not a worktree. Cleaning up..." rm -rf "${WORKTREE_PATH}" fi fi if [[ ! -d "${WORKTREE_PATH}" ]]; then echo "review: Adding new worktree at ${WORKTREE_PATH}..." # Create a detached worktree from origin/main git worktree add --detach "${WORKTREE_PATH}" origin/main fi echo "review: Changing directory to ${WORKTREE_PATH}" cd "${WORKTREE_PATH}" || exit 1 # 4. Checkout the PR echo "review: Cleaning worktree and checking out PR ${pr}..." git reset --hard git clean -fd gh pr checkout "${pr}" --branch "review-${pr}" -f -R "${REPO}" # 5. Clean and Build echo "review: Clearing possibly stale node_modules..." rm -rf node_modules rm -rf packages/core/dist/ rm -rf packages/cli/node_modules/ rm -rf packages/core/node_modules/ echo "review: Installing npm dependencies..." npm install echo "--- build ---" temp_dir_base="${TMPDIR:-/tmp}" build_log_file="$(mktemp "${temp_dir_base}/npm_build_log.XXXXXX" || true)" if [[ -z "${build_log_file}" || ! -f "${build_log_file}" ]]; then echo "Attempting to create temporary file in current directory as a fallback." >&2 build_log_file="$(mktemp "./npm_build_log_fallback.XXXXXX" || true)" if [[ -z "${build_log_file}" || ! -f "${build_log_file}" ]]; then echo "ERROR: Critical - Failed to create any temporary build log file. Aborting." >&2 exit 1 fi fi build_status=0 build_command_to_run="FORCE_COLOR=1 CLICOLOR_FORCE=1 npm run build" echo "Running build. Output (with colors) will be shown below and saved to: ${build_log_file}" echo "Build command: ${build_command_to_run}" if [[ "${uname_out}" == "Darwin" ]]; then script -q "${build_log_file}" /bin/sh -c "${build_command_to_run}" || build_status=$? else if script -q -e -c "${build_command_to_run}" "${build_log_file}"; then build_status=0 else build_status=$? fi fi if [[ "${build_status}" -ne 0 ]]; then echo "ERROR: npm build failed with exit status ${build_status}." >&2 echo "Review output above. Full log (with color codes) was in ${build_log_file}." >&2 exit 1 else # shellcheck disable=SC2312 if grep -q -i -E "\berror\b|\bfailed\b|ERR!|FATAL|critical" "${build_log_file}"; then echo "ERROR: npm build completed with exit status 0, but suspicious error patterns were found in the build output." >&2 echo "Review output above. Full log (with color codes) was in ${build_log_file}." >&2 exit 1 fi echo "npm build completed successfully (exit status 0, no critical error patterns found in log)." rm -f "${build_log_file}" fi echo "-- running ---" if ! npm start -- -m "${model}" -i="/review-frontend ${pr}"; then echo "ERROR: npm start failed. Please check its output for details." >&2 exit 1 fi