#!/bin/sh set -euo pipefail bold="\033[1m" reset="\033[0m" unreleased_for() { DIR=$1 CARGO_MANIFEST=$DIR/Cargo.toml # determine changelog file name if [ -f "$DIR/CHANGES.md" ]; then CHANGELOG_FILE=$DIR/CHANGES.md elif [ -f "$DIR/CHANGELOG.md" ]; then CHANGELOG_FILE=$DIR/CHANGELOG.md else echo "No changelog file found" exit 1 fi # get current version PACKAGE_NAME="$(sed -nE 's/^name ?= ?"([^"]+)"$/\1/ p' "$CARGO_MANIFEST" | head -n 1)" CURRENT_VERSION="$(sed -nE 's/^version ?= ?"([^"]+)"$/\1/ p' "$CARGO_MANIFEST")" CHANGE_CHUNK_FILE="$(mktemp)" # get changelog chunk and save to temp file cat "$CHANGELOG_FILE" | # skip up to unreleased heading sed '1,/Unreleased/ d' | # take up to previous version heading sed "/$CURRENT_VERSION/ q" | # drop last line sed '$d' \ >"$CHANGE_CHUNK_FILE" # if word count of changelog chunk is 0 then exit if [ "$(wc -w "$CHANGE_CHUNK_FILE" | awk '{ print $1 }')" = "0" ]; then return 0; fi echo "${bold}# ${PACKAGE_NAME}${reset} since ${bold}v$CURRENT_VERSION${reset}" cat "$CHANGE_CHUNK_FILE" } files=$(fd --threads=1 --min-depth=2 --absolute-path 'CHANGE\w+.md') for f in $files; do unreleased_for $(dirname $f) || true done