docs-strip-preview-callouts

  1#!/usr/bin/env bash
  2#
  3# Remove Preview callouts from documentation for stable release.
  4#
  5# Usage:
  6#   script/docs-strip-preview-callouts [--dry-run]
  7#
  8# This script finds and removes all Preview-related callouts from docs:
  9#   > **Preview:** This feature is available in Zed Preview...
 10#   > **Changed in Preview (v0.XXX).** See [release notes]...
 11#
 12# Then creates a PR with the changes.
 13#
 14# Options:
 15#   --dry-run     Show what would be changed without modifying files or creating PR
 16#   --verbose     Show detailed progress
 17#
 18# Run this as part of the stable release workflow.
 19
 20set -euo pipefail
 21
 22DRY_RUN=false
 23VERBOSE=false
 24
 25# Colors
 26RED='\033[0;31m'
 27GREEN='\033[0;32m'
 28YELLOW='\033[0;33m'
 29BLUE='\033[0;34m'
 30NC='\033[0m'
 31
 32log() {
 33    if [[ "$VERBOSE" == "true" ]]; then
 34        echo -e "${BLUE}[strip-preview]${NC} $*" >&2
 35    fi
 36}
 37
 38error() {
 39    echo -e "${RED}Error:${NC} $*" >&2
 40    exit 1
 41}
 42
 43# Parse arguments
 44while [[ $# -gt 0 ]]; do
 45    case $1 in
 46        --dry-run)
 47            DRY_RUN=true
 48            shift
 49            ;;
 50        --verbose)
 51            VERBOSE=true
 52            shift
 53            ;;
 54        -h|--help)
 55            head -18 "$0" | tail -16
 56            exit 0
 57            ;;
 58        *)
 59            error "Unknown option: $1"
 60            ;;
 61    esac
 62done
 63
 64# Get repo root
 65REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
 66cd "$REPO_ROOT"
 67
 68DOCS_DIR="$REPO_ROOT/docs/src"
 69
 70echo "Searching for Preview callouts in $DOCS_DIR..."
 71
 72# Find files with either type of preview callout:
 73# - > **Preview:** ...
 74# - > **Changed in Preview ...
 75files_with_callouts=$(grep -rlE "> \*\*(Preview:|Changed in Preview)" "$DOCS_DIR" 2>/dev/null || true)
 76
 77if [[ -z "$files_with_callouts" ]]; then
 78    echo "No Preview callouts found. Nothing to do."
 79    exit 0
 80fi
 81
 82file_count=$(echo "$files_with_callouts" | wc -l | tr -d ' ')
 83echo "Found $file_count file(s) with Preview callouts:"
 84echo ""
 85
 86for file in $files_with_callouts; do
 87    relative_path="${file#$REPO_ROOT/}"
 88    echo "  $relative_path"
 89    
 90    if [[ "$VERBOSE" == "true" ]]; then
 91        grep -nE "> \*\*(Preview:|Changed in Preview)" "$file" | while read -r line; do
 92            echo "    $line"
 93        done
 94    fi
 95done
 96
 97echo ""
 98
 99if [[ "$DRY_RUN" == "true" ]]; then
100    echo -e "${YELLOW}=== DRY RUN ===${NC}"
101    echo ""
102    echo "Would remove Preview callouts from the files above and create a PR."
103    echo ""
104    echo "Lines to be removed:"
105    echo ""
106    
107    for file in $files_with_callouts; do
108        relative_path="${file#$REPO_ROOT/}"
109        echo "--- $relative_path ---"
110        grep -nE "> \*\*(Preview:|Changed in Preview)" "$file" || true
111        echo ""
112    done
113    
114    echo -e "${YELLOW}=== END DRY RUN ===${NC}"
115    echo ""
116    echo "Run without --dry-run to apply changes and create PR."
117    exit 0
118fi
119
120# Check for clean working state (ignore untracked files)
121if [[ -n "$(git status --porcelain docs/ | grep -v '^??' || true)" ]]; then
122    error "docs/ directory has uncommitted changes. Please commit or stash first."
123fi
124
125# Apply changes
126echo "Removing Preview callouts..."
127
128for file in $files_with_callouts; do
129    log "Processing: $file"
130    
131    tmp_file=$(mktemp)
132    
133    # Remove preview callout lines and their continuations
134    # Handles both:
135    #   > **Preview:** This feature is available...
136    #   > **Changed in Preview (v0.XXX).** See [release notes]...
137    awk '
138    BEGIN { in_callout = 0 }
139    /^> \*\*Preview:\*\*/ { 
140        in_callout = 1
141        next 
142    }
143    /^> \*\*Changed in Preview/ { 
144        in_callout = 1
145        next 
146    }
147    in_callout && /^>/ && !/^> \*\*/ {
148        next
149    }
150    in_callout && /^$/ {
151        in_callout = 0
152        next
153    }
154    {
155        in_callout = 0
156        print
157    }
158    ' "$file" > "$tmp_file"
159    
160    mv "$tmp_file" "$file"
161    echo "  Updated: ${file#$REPO_ROOT/}"
162done
163
164echo ""
165echo -e "${GREEN}Preview callouts removed from $file_count file(s).${NC}"
166
167# Check if there are actual changes (in case callouts were in comments or something)
168if [[ -z "$(git status --porcelain docs/)" ]]; then
169    echo ""
170    echo "No effective changes to commit (callouts may have been in non-rendered content)."
171    exit 0
172fi
173
174# Create branch and PR
175echo ""
176echo "Creating PR..."
177
178BRANCH_NAME="docs/stable-release-$(date +%Y-%m-%d)"
179log "Branch: $BRANCH_NAME"
180
181git checkout -b "$BRANCH_NAME"
182git add docs/src/
183
184# Build file list for commit message
185FILE_LIST=$(echo "$files_with_callouts" | sed "s|$REPO_ROOT/||" | sed 's/^/- /')
186
187git commit -m "docs: Remove Preview callouts for stable release
188
189Features documented with Preview callouts are now in Stable.
190
191Files updated:
192$FILE_LIST"
193
194git push -u origin "$BRANCH_NAME"
195
196gh pr create \
197    --title "docs: Remove Preview callouts for stable release" \
198    --body "This PR removes Preview callouts from documentation for features that are now in Stable.
199
200## Files Updated
201
202$(echo "$files_with_callouts" | sed "s|$REPO_ROOT/|• |")
203
204## What This Does
205
206Removes callouts like:
207\`\`\`markdown
208> **Preview:** This feature is available in Zed Preview. It will be included in the next Stable release.
209\`\`\`
210
211And:
212\`\`\`markdown
213> **Changed in Preview (v0.XXX).** See [release notes](/releases#0.XXX).
214\`\`\`
215
216These features are now in Stable, so the callouts are no longer needed.
217
218Release Notes:
219
220- N/A"
221
222PR_URL=$(gh pr view --json url --jq '.url')
223
224echo ""
225echo -e "${GREEN}Done!${NC}"
226echo ""
227echo "PR created: $PR_URL"
228echo ""
229echo "Next steps:"
230echo "1. Review the PR to ensure callouts were removed correctly"
231echo "2. Merge the PR as part of the stable release"