From 0e8bbfb8ba2b02f8e80850c7f6b444c72fbd7340 Mon Sep 17 00:00:00 2001 From: Seth Vargo Date: Tue, 12 Aug 2025 22:17:04 -0400 Subject: [PATCH] chore: update bash to follow shellcheck recommendations (#6102) --- .github/scripts/pr-triage.sh | 128 +++++++++++++++++++---------------- scripts/create_alias.sh | 29 ++++---- 2 files changed, 84 insertions(+), 73 deletions(-) diff --git a/.github/scripts/pr-triage.sh b/.github/scripts/pr-triage.sh index 6b60432b..985b3ffc 100755 --- a/.github/scripts/pr-triage.sh +++ b/.github/scripts/pr-triage.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -euo pipefail # Initialize a comma-separated string to hold PR numbers that need a comment @@ -6,13 +6,23 @@ PRS_NEEDING_COMMENT="" # Function to process a single PR process_pr() { + if [[ -z "${GITHUB_REPOSITORY:-}" ]]; then + echo "‼️ Missing \$GITHUB_REPOSITORY - this must be run from GitHub Actions" + return 1 + fi + + if [[ -z "${GITHUB_OUTPUT:-}" ]]; then + echo "‼️ Missing \$GITHUB_OUTPUT - this must be run from GitHub Actions" + return 1 + fi + local PR_NUMBER=$1 - echo "🔄 Processing PR #$PR_NUMBER" + echo "🔄 Processing PR #${PR_NUMBER}" # Get PR body with error handling local PR_BODY - if ! PR_BODY=$(gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json body -q .body 2>/dev/null); then - echo " ⚠️ Could not fetch PR #$PR_NUMBER details" + if ! PR_BODY=$(gh pr view "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --json body -q .body 2>/dev/null); then + echo " ⚠️ Could not fetch PR #${PR_NUMBER} details" return 1 fi @@ -20,67 +30,67 @@ process_pr() { local ISSUE_NUMBER="" # Pattern 1: Direct reference like #123 - if [ -z "$ISSUE_NUMBER" ]; then - ISSUE_NUMBER=$(echo "$PR_BODY" | grep -oE '#[0-9]+' | head -1 | sed 's/#//' 2>/dev/null || echo "") + if [[ -z "${ISSUE_NUMBER}" ]]; then + ISSUE_NUMBER=$(echo "${PR_BODY}" | grep -oE '#[0-9]+' | head -1 | sed 's/#//' 2>/dev/null || echo "") fi # Pattern 2: Closes/Fixes/Resolves patterns (case-insensitive) - if [ -z "$ISSUE_NUMBER" ]; then - ISSUE_NUMBER=$(echo "$PR_BODY" | grep -iE '(closes?|fixes?|resolves?) #[0-9]+' | grep -oE '#[0-9]+' | head -1 | sed 's/#//' 2>/dev/null || echo "") + if [[ -z "${ISSUE_NUMBER}" ]]; then + ISSUE_NUMBER=$(echo "${PR_BODY}" | grep -iE '(closes?|fixes?|resolves?) #[0-9]+' | grep -oE '#[0-9]+' | head -1 | sed 's/#//' 2>/dev/null || echo "") fi - if [ -z "$ISSUE_NUMBER" ]; then - echo "⚠️ No linked issue found for PR #$PR_NUMBER, adding status/need-issue label" - if ! gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --add-label "status/need-issue" 2>/dev/null; then + if [[ -z "${ISSUE_NUMBER}" ]]; then + echo "⚠️ No linked issue found for PR #${PR_NUMBER}, adding status/need-issue label" + if ! gh pr edit "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --add-label "status/need-issue" 2>/dev/null; then echo " ⚠️ Failed to add label (may already exist or have permission issues)" fi # Add PR number to the list - if [ -z "$PRS_NEEDING_COMMENT" ]; then - PRS_NEEDING_COMMENT="$PR_NUMBER" + if [[ -z "${PRS_NEEDING_COMMENT}" ]]; then + PRS_NEEDING_COMMENT="${PR_NUMBER}" else - PRS_NEEDING_COMMENT="$PRS_NEEDING_COMMENT,$PR_NUMBER" + PRS_NEEDING_COMMENT="${PRS_NEEDING_COMMENT},${PR_NUMBER}" fi - echo "needs_comment=true" >> $GITHUB_OUTPUT + echo "needs_comment=true" >> "${GITHUB_OUTPUT}" else - echo "🔗 Found linked issue #$ISSUE_NUMBER" + echo "🔗 Found linked issue #${ISSUE_NUMBER}" # Remove status/need-issue label if present - if ! gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --remove-label "status/need-issue" 2>/dev/null; then + if ! gh pr edit "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --remove-label "status/need-issue" 2>/dev/null; then echo " status/need-issue label not present or could not be removed" fi # Get issue labels - echo "📥 Fetching labels from issue #$ISSUE_NUMBER" + echo "📥 Fetching labels from issue #${ISSUE_NUMBER}" local ISSUE_LABELS="" - if ! ISSUE_LABELS=$(gh issue view "$ISSUE_NUMBER" --repo "$GITHUB_REPOSITORY" --json labels -q '.labels[].name' 2>/dev/null | tr '\n' ',' | sed 's/,$//' || echo ""); then - echo " ⚠️ Could not fetch issue #$ISSUE_NUMBER (may not exist or be in different repo)" + if ! ISSUE_LABELS=$(gh issue view "${ISSUE_NUMBER}" --repo "${GITHUB_REPOSITORY}" --json labels -q '.labels[].name' 2>/dev/null | tr '\n' ',' | sed 's/,$//' || echo ""); then + echo " ⚠️ Could not fetch issue #${ISSUE_NUMBER} (may not exist or be in different repo)" ISSUE_LABELS="" fi # Get PR labels - echo "📥 Fetching labels from PR #$PR_NUMBER" + echo "📥 Fetching labels from PR #${PR_NUMBER}" local PR_LABELS="" - if ! PR_LABELS=$(gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json labels -q '.labels[].name' 2>/dev/null | tr '\n' ',' | sed 's/,$//' || echo ""); then + if ! PR_LABELS=$(gh pr view "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --json labels -q '.labels[].name' 2>/dev/null | tr '\n' ',' | sed 's/,$//' || echo ""); then echo " ⚠️ Could not fetch PR labels" PR_LABELS="" fi - echo " Issue labels: $ISSUE_LABELS" - echo " PR labels: $PR_LABELS" + echo " Issue labels: ${ISSUE_LABELS}" + echo " PR labels: ${PR_LABELS}" # Convert comma-separated strings to arrays local ISSUE_LABEL_ARRAY PR_LABEL_ARRAY - IFS=',' read -ra ISSUE_LABEL_ARRAY <<< "$ISSUE_LABELS" - IFS=',' read -ra PR_LABEL_ARRAY <<< "$PR_LABELS" + IFS=',' read -ra ISSUE_LABEL_ARRAY <<< "${ISSUE_LABELS}" + IFS=',' read -ra PR_LABEL_ARRAY <<< "${PR_LABELS}" # Find labels to add (on issue but not on PR) local LABELS_TO_ADD="" for label in "${ISSUE_LABEL_ARRAY[@]}"; do - if [ -n "$label" ] && [[ ! " ${PR_LABEL_ARRAY[*]} " =~ " ${label} " ]]; then - if [ -z "$LABELS_TO_ADD" ]; then - LABELS_TO_ADD="$label" + if [[ -n "${label}" ]] && [[ " ${PR_LABEL_ARRAY[*]} " != *" ${label} "* ]]; then + if [[ -z "${LABELS_TO_ADD}" ]]; then + LABELS_TO_ADD="${label}" else - LABELS_TO_ADD="$LABELS_TO_ADD,$label" + LABELS_TO_ADD="${LABELS_TO_ADD},${label}" fi fi done @@ -88,65 +98,65 @@ process_pr() { # Find labels to remove (on PR but not on issue) local LABELS_TO_REMOVE="" for label in "${PR_LABEL_ARRAY[@]}"; do - if [ -n "$label" ] && [[ ! " ${ISSUE_LABEL_ARRAY[*]} " =~ " ${label} " ]]; then + if [[ -n "${label}" ]] && [[ " ${ISSUE_LABEL_ARRAY[*]} " != *" ${label} "* ]]; then # Don't remove status/need-issue since we already handled it - if [ "$label" != "status/need-issue" ]; then - if [ -z "$LABELS_TO_REMOVE" ]; then - LABELS_TO_REMOVE="$label" + if [[ "${label}" != "status/need-issue" ]]; then + if [[ -z "${LABELS_TO_REMOVE}" ]]; then + LABELS_TO_REMOVE="${label}" else - LABELS_TO_REMOVE="$LABELS_TO_REMOVE,$label" + LABELS_TO_REMOVE="${LABELS_TO_REMOVE},${label}" fi fi fi done # Apply label changes - if [ -n "$LABELS_TO_ADD" ]; then - echo "➕ Adding labels: $LABELS_TO_ADD" - if ! gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --add-label "$LABELS_TO_ADD" 2>/dev/null; then + if [[ -n "${LABELS_TO_ADD}" ]]; then + echo "➕ Adding labels: ${LABELS_TO_ADD}" + if ! gh pr edit "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --add-label "${LABELS_TO_ADD}" 2>/dev/null; then echo " ⚠️ Failed to add some labels" fi fi - if [ -n "$LABELS_TO_REMOVE" ]; then - echo "➖ Removing labels: $LABELS_TO_REMOVE" - if ! gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --remove-label "$LABELS_TO_REMOVE" 2>/dev/null; then + if [[ -n "${LABELS_TO_REMOVE}" ]]; then + echo "➖ Removing labels: ${LABELS_TO_REMOVE}" + if ! gh pr edit "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --remove-label "${LABELS_TO_REMOVE}" 2>/dev/null; then echo " ⚠️ Failed to remove some labels" fi fi - if [ -z "$LABELS_TO_ADD" ] && [ -z "$LABELS_TO_REMOVE" ]; then + if [[ -z "${LABELS_TO_ADD}" ]] && [[ -z "${LABELS_TO_REMOVE}" ]]; then echo "✅ Labels already synchronized" fi - echo "needs_comment=false" >> $GITHUB_OUTPUT + echo "needs_comment=false" >> "${GITHUB_OUTPUT}" fi } # If PR_NUMBER is set, process only that PR -if [ -n "${PR_NUMBER:-}" ]; then - if ! process_pr "$PR_NUMBER"; then - echo "❌ Failed to process PR #$PR_NUMBER" +if [[ -n "${PR_NUMBER:-}" ]]; then + if ! process_pr "${PR_NUMBER}"; then + echo "❌ Failed to process PR #${PR_NUMBER}" exit 1 fi else # Otherwise, get all open PRs and process them # The script logic will determine which ones need issue linking or label sync echo "📥 Getting all open pull requests..." - if ! PR_NUMBERS=$(gh pr list --repo "$GITHUB_REPOSITORY" --state open --limit 1000 --json number -q '.[].number' 2>/dev/null); then + if ! PR_NUMBERS=$(gh pr list --repo "${GITHUB_REPOSITORY}" --state open --limit 1000 --json number -q '.[].number' 2>/dev/null); then echo "❌ Failed to fetch PR list" exit 1 fi - - if [ -z "$PR_NUMBERS" ]; then + + if [[ -z "${PR_NUMBERS}" ]]; then echo "✅ No open PRs found" else # Count the number of PRs - PR_COUNT=$(echo "$PR_NUMBERS" | wc -w | tr -d ' ') - echo "📊 Found $PR_COUNT open PRs to process" - - for pr_number in $PR_NUMBERS; do - if ! process_pr "$pr_number"; then - echo "⚠️ Failed to process PR #$pr_number, continuing with next PR..." + PR_COUNT=$(echo "${PR_NUMBERS}" | wc -w | tr -d ' ') + echo "📊 Found ${PR_COUNT} open PRs to process" + + for pr_number in ${PR_NUMBERS}; do + if ! process_pr "${pr_number}"; then + echo "⚠️ Failed to process PR #${pr_number}, continuing with next PR..." continue fi done @@ -154,10 +164,10 @@ else fi # Ensure output is always set, even if empty -if [ -z "$PRS_NEEDING_COMMENT" ]; then - echo "prs_needing_comment=[]" >> $GITHUB_OUTPUT +if [[ -z "${PRS_NEEDING_COMMENT}" ]]; then + echo "prs_needing_comment=[]" >> "${GITHUB_OUTPUT}" else - echo "prs_needing_comment=[$PRS_NEEDING_COMMENT]" >> $GITHUB_OUTPUT + echo "prs_needing_comment=[${PRS_NEEDING_COMMENT}]" >> "${GITHUB_OUTPUT}" fi -echo "✅ PR triage completed" \ No newline at end of file +echo "✅ PR triage completed" diff --git a/scripts/create_alias.sh b/scripts/create_alias.sh index ccaf3dd4..ecb01bb3 100755 --- a/scripts/create_alias.sh +++ b/scripts/create_alias.sh @@ -1,38 +1,39 @@ -#!/bin/bash +#!/usr/bin/env bash +set -euo pipefail # This script creates an alias for the Gemini CLI # Determine the project directory PROJECT_DIR=$(cd "$(dirname "$0")/.." && pwd) -ALIAS_COMMAND="alias gemini='node $PROJECT_DIR/scripts/start.js'" +ALIAS_COMMAND="alias gemini='node "${PROJECT_DIR}/scripts/start.js"'" # Detect shell and set config file path -if [[ "$SHELL" == *"/bash" ]]; then - CONFIG_FILE="$HOME/.bashrc" -elif [[ "$SHELL" == *"/zsh" ]]; then - CONFIG_FILE="$HOME/.zshrc" +if [[ "${SHELL}" == *"/bash" ]]; then + CONFIG_FILE="${HOME}/.bashrc" +elif [[ "${SHELL}" == *"/zsh" ]]; then + CONFIG_FILE="${HOME}/.zshrc" else echo "Unsupported shell. Only bash and zsh are supported." exit 1 fi -echo "This script will add the following alias to your shell configuration file ($CONFIG_FILE):" -echo " $ALIAS_COMMAND" +echo "This script will add the following alias to your shell configuration file (${CONFIG_FILE}):" +echo " ${ALIAS_COMMAND}" echo "" # Check if the alias already exists -if grep -q "alias gemini=" "$CONFIG_FILE"; then - echo "A 'gemini' alias already exists in $CONFIG_FILE. No changes were made." +if grep -q "alias gemini=" "${CONFIG_FILE}"; then + echo "A 'gemini' alias already exists in ${CONFIG_FILE}. No changes were made." exit 0 fi read -p "Do you want to proceed? (y/n) " -n 1 -r echo "" -if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "$ALIAS_COMMAND" >> "$CONFIG_FILE" +if [[ "${REPLY}" =~ ^[Yy]$ ]]; then + echo "${ALIAS_COMMAND}" >> "${CONFIG_FILE}" echo "" - echo "Alias added to $CONFIG_FILE." - echo "Please run 'source $CONFIG_FILE' or open a new terminal to use the 'gemini' command." + echo "Alias added to ${CONFIG_FILE}." + echo "Please run 'source ${CONFIG_FILE}' or open a new terminal to use the 'gemini' command." else echo "Aborted. No changes were made." fi