|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +# Script to extract Jira issue from PR title and body with priority order: |
| 5 | +# 1. Title |
| 6 | +# 2. ticket:<url> pattern |
| 7 | +# 3. Anywhere in description |
| 8 | + |
| 9 | +# Usage: |
| 10 | +# ./extract-jira-issue.sh <pr_number> |
| 11 | +# or |
| 12 | +# PR_TITLE="..." PR_BODY="..." ./extract-jira-issue.sh |
| 13 | + |
| 14 | +extract_jira_issue() { |
| 15 | + local PR_TITLE="$1" |
| 16 | + local PR_BODY="$2" |
| 17 | + |
| 18 | + echo "PR Title: $PR_TITLE" |
| 19 | + echo "PR Body:" |
| 20 | + echo "$PR_BODY" |
| 21 | + echo "---" |
| 22 | + |
| 23 | + local JIRA_ISSUE="" |
| 24 | + local FOUND_AT="" |
| 25 | + |
| 26 | + # Priority 1: Check title for WPB-* pattern |
| 27 | + echo "Checking PR title for Jira issues..." |
| 28 | + local TITLE_ISSUES |
| 29 | + TITLE_ISSUES=$(echo "$PR_TITLE" | grep -oE '\[?WPB-[0-9]+\]?' | tr -d '[]' | sort -u || true) |
| 30 | + local TITLE_COUNT |
| 31 | + if [ -z "$TITLE_ISSUES" ]; then |
| 32 | + TITLE_COUNT=0 |
| 33 | + else |
| 34 | + TITLE_COUNT=$(echo -n "$TITLE_ISSUES" | grep -c '^') |
| 35 | + fi |
| 36 | + |
| 37 | + if [ "$TITLE_COUNT" -gt 1 ]; then |
| 38 | + echo "ERROR: Multiple Jira issues found in title (ambiguous):" |
| 39 | + echo "$TITLE_ISSUES" |
| 40 | + exit 1 |
| 41 | + elif [ "$TITLE_COUNT" -eq 1 ]; then |
| 42 | + JIRA_ISSUE="$TITLE_ISSUES" |
| 43 | + FOUND_AT="title" |
| 44 | + echo "Found Jira issue in title: $JIRA_ISSUE" |
| 45 | + else |
| 46 | + # Priority 2: Check for ticket:<url> or bare Jira URL pattern with WPB-* (case-insensitive) |
| 47 | + echo "No issue in title, checking for ticket URL patterns..." |
| 48 | + local TICKET_ISSUES |
| 49 | + # Match both: ticket:<url> or https://.../browse/WPB-* or .../WPB-* |
| 50 | + TICKET_ISSUES=$(echo "$PR_BODY" | grep -ioE '(ticket:|https?://[^ ]*/browse/)WPB-[0-9]+' | grep -ioE 'WPB-[0-9]+' | sort -u || true) |
| 51 | + local TICKET_COUNT |
| 52 | + TICKET_COUNT=$(echo -n "$TICKET_ISSUES" | grep -c '^' || echo 0) |
| 53 | + # Handle empty string case |
| 54 | + if [ -z "$TICKET_ISSUES" ]; then |
| 55 | + TICKET_COUNT=0 |
| 56 | + fi |
| 57 | + |
| 58 | + if [ "$TICKET_COUNT" -gt 1 ]; then |
| 59 | + echo "ERROR: Multiple Jira issues found in ticket URLs (ambiguous):" |
| 60 | + echo "$TICKET_ISSUES" |
| 61 | + exit 1 |
| 62 | + elif [ "$TICKET_COUNT" -eq 1 ]; then |
| 63 | + JIRA_ISSUE="$TICKET_ISSUES" |
| 64 | + FOUND_AT="ticket URL" |
| 65 | + echo "Found Jira issue in ticket URL: $JIRA_ISSUE" |
| 66 | + else |
| 67 | + # Priority 3: Check anywhere in description for WPB-* |
| 68 | + echo "No ticket URL found, checking entire description..." |
| 69 | + local DESC_ISSUES |
| 70 | + DESC_ISSUES=$(echo "$PR_BODY" | grep -oE '\[?WPB-[0-9]+\]?' | tr -d '[]' | sort -u || true) |
| 71 | + local DESC_COUNT |
| 72 | + if [ -z "$DESC_ISSUES" ]; then |
| 73 | + DESC_COUNT=0 |
| 74 | + else |
| 75 | + DESC_COUNT=$(echo -n "$DESC_ISSUES" | grep -c '^') |
| 76 | + fi |
| 77 | + |
| 78 | + if [ "$DESC_COUNT" -gt 1 ]; then |
| 79 | + echo "ERROR: Multiple Jira issues found in description (ambiguous):" |
| 80 | + echo "$DESC_ISSUES" |
| 81 | + exit 1 |
| 82 | + elif [ "$DESC_COUNT" -eq 1 ]; then |
| 83 | + JIRA_ISSUE="$DESC_ISSUES" |
| 84 | + FOUND_AT="description" |
| 85 | + echo "Found Jira issue in description: $JIRA_ISSUE" |
| 86 | + fi |
| 87 | + fi |
| 88 | + fi |
| 89 | + |
| 90 | + if [ -z "$JIRA_ISSUE" ]; then |
| 91 | + echo "No Jira issue found" |
| 92 | + return 1 |
| 93 | + else |
| 94 | + echo "=========================================" |
| 95 | + echo "Final Jira issue: $JIRA_ISSUE (found in $FOUND_AT)" |
| 96 | + echo "=========================================" |
| 97 | + # Output in format that can be easily parsed |
| 98 | + echo "JIRA_ISSUE=$JIRA_ISSUE" |
| 99 | + echo "FOUND_AT=$FOUND_AT" |
| 100 | + return 0 |
| 101 | + fi |
| 102 | +} |
| 103 | + |
| 104 | +# Main script logic |
| 105 | +if [ $# -eq 1 ]; then |
| 106 | + # PR number provided, fetch from GitHub |
| 107 | + PR_NUMBER="$1" |
| 108 | + if ! command -v gh &> /dev/null; then |
| 109 | + echo "ERROR: gh CLI is not installed. Please install it or provide PR_TITLE and PR_BODY environment variables." |
| 110 | + exit 1 |
| 111 | + fi |
| 112 | + |
| 113 | + echo "Fetching PR #$PR_NUMBER..." |
| 114 | + PR_DATA=$(gh pr view "$PR_NUMBER" --json title,body) |
| 115 | + PR_TITLE=$(echo "$PR_DATA" | jq -r '.title') |
| 116 | + PR_BODY=$(echo "$PR_DATA" | jq -r '.body // ""') |
| 117 | + |
| 118 | + extract_jira_issue "$PR_TITLE" "$PR_BODY" |
| 119 | +elif [ -n "${PR_TITLE:-}" ] && [ -n "${PR_BODY:-}" ]; then |
| 120 | + # Environment variables provided |
| 121 | + extract_jira_issue "$PR_TITLE" "$PR_BODY" |
| 122 | +else |
| 123 | + echo "Usage:" |
| 124 | + echo " $0 <pr_number> # Fetch PR from GitHub" |
| 125 | + echo " PR_TITLE=\"...\" PR_BODY=\"...\" $0 # Use environment variables" |
| 126 | + echo "" |
| 127 | + echo "Examples:" |
| 128 | + echo " $0 5134" |
| 129 | + echo " PR_TITLE=\"WPB-12345 Fix bug\" PR_BODY=\"Some description\" $0" |
| 130 | + exit 1 |
| 131 | +fi |
0 commit comments