|
1 | 1 | #!/bin/bash |
2 | | -# extract-changelog.sh - Extract unreleased content from CHANGELOG.md |
| 2 | +# extract-changelog.sh - Extract changelog content from CHANGELOG.md |
| 3 | +# Can extract either unreleased content or content for a specific version |
3 | 4 |
|
4 | 5 | set -euo pipefail |
5 | 6 |
|
6 | 7 | # Colors for output |
7 | 8 | RED='\033[0;31m' |
8 | 9 | GREEN='\033[0;32m' |
9 | 10 | YELLOW='\033[1;33m' |
| 11 | +BLUE='\033[0;34m' |
10 | 12 | NC='\033[0m' # No Color |
11 | 13 |
|
12 | | -OUTPUT_FILE="${1:-/tmp/changelog_content.txt}" |
| 14 | +# Function to show usage |
| 15 | +usage() { |
| 16 | + echo "Usage: $0 [version] [output_file]" |
| 17 | + echo "" |
| 18 | + echo "Extract changelog content from CHANGELOG.md" |
| 19 | + echo "" |
| 20 | + echo "Arguments:" |
| 21 | + echo " version Version to extract (e.g., 0.40.0). If not provided, extracts 'Unreleased' content" |
| 22 | + echo " output_file Output file (default: /tmp/changelog_content.txt or /tmp/release_content.txt)" |
| 23 | + echo "" |
| 24 | + echo "Examples:" |
| 25 | + echo " $0 # Extract unreleased content" |
| 26 | + echo " $0 /tmp/my_file.txt # Extract unreleased content to custom file" |
| 27 | + echo " $0 0.40.0 # Extract content for version 0.40.0" |
| 28 | + echo " $0 0.40.0 /tmp/my_file.txt # Extract version content to custom file" |
| 29 | + exit 1 |
| 30 | +} |
| 31 | + |
| 32 | +# Parse arguments - handle different calling patterns |
| 33 | +VERSION="" |
| 34 | +OUTPUT_FILE="" |
13 | 35 |
|
14 | | -echo -e "${YELLOW}Extracting changelog content...${NC}" |
| 36 | +if [ $# -eq 0 ]; then |
| 37 | + # No arguments - extract unreleased content |
| 38 | + OUTPUT_FILE="/tmp/changelog_content.txt" |
| 39 | +elif [ $# -eq 1 ]; then |
| 40 | + # One argument - could be version or output file |
| 41 | + if [[ "$1" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then |
| 42 | + # It's a version |
| 43 | + VERSION="$1" |
| 44 | + OUTPUT_FILE="/tmp/release_content.txt" |
| 45 | + else |
| 46 | + # It's an output file for unreleased content |
| 47 | + OUTPUT_FILE="$1" |
| 48 | + fi |
| 49 | +elif [ $# -eq 2 ]; then |
| 50 | + # Two arguments - version and output file |
| 51 | + VERSION="$1" |
| 52 | + OUTPUT_FILE="$2" |
| 53 | +else |
| 54 | + echo -e "${RED}Error: Too many arguments${NC}" |
| 55 | + usage |
| 56 | +fi |
15 | 57 |
|
16 | 58 | # Check if CHANGELOG.md exists |
17 | 59 | if [ ! -f "CHANGELOG.md" ]; then |
18 | 60 | echo -e "${RED}Error: CHANGELOG.md not found${NC}" |
19 | 61 | exit 1 |
20 | 62 | fi |
21 | 63 |
|
22 | | -# Get unreleased content |
23 | | -UNRELEASED_CONTENT=$(awk '/^## Unreleased/,/^## \[/ { |
24 | | - if (/^## Unreleased/) next |
25 | | - if (/^## \[/) exit |
26 | | - print |
27 | | -}' CHANGELOG.md | sed '/^$/d') |
| 64 | +if [ -z "$VERSION" ]; then |
| 65 | + # Extract unreleased content |
| 66 | + echo -e "${YELLOW}Extracting unreleased changelog content...${NC}" |
| 67 | + |
| 68 | + CONTENT=$(awk '/^## Unreleased/,/^## \[/ { |
| 69 | + if (/^## Unreleased/) next |
| 70 | + if (/^## \[/) exit |
| 71 | + print |
| 72 | + }' CHANGELOG.md | sed '/^$/d') |
28 | 73 |
|
29 | | -if [ -z "$UNRELEASED_CONTENT" ]; then |
30 | | - echo -e "${RED}Error: No unreleased content found in CHANGELOG.md${NC}" |
31 | | - exit 1 |
| 74 | + if [ -z "$CONTENT" ]; then |
| 75 | + echo -e "${RED}Error: No unreleased content found in CHANGELOG.md${NC}" |
| 76 | + exit 1 |
| 77 | + fi |
| 78 | + |
| 79 | + echo -e "${GREEN}✓ Found unreleased content${NC}" |
| 80 | +else |
| 81 | + # Extract content for specific version |
| 82 | + echo -e "${YELLOW}Extracting changelog content for version ${BLUE}${VERSION}${NC}..." |
| 83 | + |
| 84 | + # Validate version format |
| 85 | + if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then |
| 86 | + echo -e "${RED}Error: Version must be in format X.Y.Z (e.g., 0.40.0)${NC}" |
| 87 | + exit 1 |
| 88 | + fi |
| 89 | + |
| 90 | + CONTENT=$(awk "BEGIN{found=0} /^## \[$VERSION\]/ {found=1; next} found && /^## \[/ {exit} found {print}" CHANGELOG.md | sed '/^$/d') |
| 91 | + |
| 92 | + if [ -z "$CONTENT" ]; then |
| 93 | + echo -e "${RED}Error: No release content found for version $VERSION in CHANGELOG.md${NC}" |
| 94 | + echo -e "${YELLOW}Available versions in CHANGELOG.md:${NC}" |
| 95 | + grep "^## \[" CHANGELOG.md || echo "No versioned entries found" |
| 96 | + exit 1 |
| 97 | + fi |
| 98 | + |
| 99 | + echo -e "${GREEN}✓ Found release content for version ${VERSION}${NC}" |
32 | 100 | fi |
33 | 101 |
|
34 | 102 | # Save to file |
35 | | -echo "$UNRELEASED_CONTENT" > "$OUTPUT_FILE" |
| 103 | +echo "$CONTENT" > "$OUTPUT_FILE" |
36 | 104 |
|
37 | | -echo -e "${GREEN}✓ Changelog content extracted to: $OUTPUT_FILE${NC}" |
38 | | -echo "Content:" |
| 105 | +echo -e "${GREEN}✓ Content saved to: ${OUTPUT_FILE}${NC}" |
| 106 | +echo "" |
| 107 | +echo -e "${YELLOW}Changelog content:${NC}" |
39 | 108 | echo "----------------------------------------" |
40 | 109 | cat "$OUTPUT_FILE" |
41 | 110 | echo "----------------------------------------" |
| 111 | + |
| 112 | +echo "" |
| 113 | +if [ -z "$VERSION" ]; then |
| 114 | + echo -e "${GREEN}✓ Successfully extracted unreleased changelog content${NC}" |
| 115 | +else |
| 116 | + echo -e "${GREEN}✓ Successfully extracted changelog content for version ${VERSION}${NC}" |
| 117 | +fi |
0 commit comments