@@ -68,6 +68,57 @@ update_version() {
6868 sed -i ' ' " s/currentVersion = \" .*\" /currentVersion = \" $version \" /" " $VERSION_FILE "
6969}
7070
71+ generate_changelog_content () {
72+ local last_tag=$( git describe --tags --abbrev=0 2> /dev/null || echo " " )
73+ local range=" "
74+
75+ if [ -n " $last_tag " ]; then
76+ range=" $last_tag ..HEAD"
77+ else
78+ range=" HEAD"
79+ fi
80+
81+ local added=" " changed=" " fixed=" " removed=" "
82+
83+ while IFS= read -r line; do
84+ local type=$( echo " $line " | sed -n ' s/^\([a-z]*\):.*/\1/p' )
85+ local msg=$( echo " $line " | sed ' s/^[a-z]*: //' )
86+
87+ case " $type " in
88+ feat)
89+ added=" $added \n- $msg "
90+ ;;
91+ fix)
92+ fixed=" $fixed \n- $msg "
93+ ;;
94+ refactor|perf|style)
95+ changed=" $changed \n- $msg "
96+ ;;
97+ * )
98+ if [[ " $line " != chore:* && " $line " != docs:* && " $line " != test:* ]]; then
99+ changed=" $changed \n- $line "
100+ fi
101+ ;;
102+ esac
103+ done < <( git log --pretty=format:" %s" $range 2> /dev/null)
104+
105+ local content=" "
106+ if [ -n " $added " ]; then
107+ content=" $content \n### Added$added \n"
108+ fi
109+ if [ -n " $changed " ]; then
110+ content=" $content \n### Changed$changed \n"
111+ fi
112+ if [ -n " $fixed " ]; then
113+ content=" $content \n### Fixed$fixed \n"
114+ fi
115+ if [ -n " $removed " ]; then
116+ content=" $content \n### Removed$removed \n"
117+ fi
118+
119+ echo -e " $content "
120+ }
121+
71122update_changelog () {
72123 local version=" $1 "
73124 local date=$( date +%Y-%m-%d)
@@ -77,27 +128,43 @@ update_changelog() {
77128 return 0
78129 fi
79130
80- echo " ==> Updating CHANGELOG for $version "
131+ echo " ==> Generating CHANGELOG for $version "
132+
133+ local changelog_content=$( generate_changelog_content)
134+
135+ if [ -z " $changelog_content " ] || [ " $changelog_content " = $' \n ' ]; then
136+ echo " Warning: No commits found for changelog, using placeholder"
137+ changelog_content=" \n### Changed\n- Version bump\n"
138+ fi
81139
82140 local temp_file=$( mktemp)
83- local in_unreleased=0
84- local unreleased_content=" "
141+ local header_done=0
85142
86143 while IFS= read -r line; do
144+ echo " $line " >> " $temp_file "
87145 if [[ " $line " == " ## [Unreleased]" ]]; then
88- in_unreleased=1
89- echo " $line " >> " $temp_file "
90146 echo " " >> " $temp_file "
91147 echo " ## [$version ] - $date " >> " $temp_file "
92- elif [[ " $line " =~ ^# #\ \[.*\] && "$in_unreleased" -eq 1 ]]; then
93- in_unreleased= 0
94- echo " $line " >> " $temp_file "
95- else
96- echo " $line " >> " $temp_file "
148+ echo -e " $changelog_content " >> " $temp_file "
149+ header_done=1
97150 fi
98151 done < " $CHANGELOG_FILE "
99152
100- mv " $temp_file " " $CHANGELOG_FILE "
153+ if [ " $header_done " -eq 0 ]; then
154+ echo " Warning: No [Unreleased] section found, prepending to file"
155+ local new_temp=$( mktemp)
156+ head -n 6 " $CHANGELOG_FILE " > " $new_temp "
157+ echo " " >> " $new_temp "
158+ echo " ## [Unreleased]" >> " $new_temp "
159+ echo " " >> " $new_temp "
160+ echo " ## [$version ] - $date " >> " $new_temp "
161+ echo -e " $changelog_content " >> " $new_temp "
162+ tail -n +7 " $CHANGELOG_FILE " >> " $new_temp "
163+ mv " $new_temp " " $CHANGELOG_FILE "
164+ rm -f " $temp_file "
165+ else
166+ mv " $temp_file " " $CHANGELOG_FILE "
167+ fi
101168}
102169
103170prepare_release () {
0 commit comments