rocksdb/unreleased_history/release.sh

105 lines
3.2 KiB
Bash
Executable File

#! /usr/bin/env bash
# Copyright (c) Meta Platforms, Inc. and affiliates.
set -e
if [ ! -d unreleased_history ]; then
echo "Can't find unreleased_history/ directory"
exit 1
fi
GIT_PATHS="unreleased_history/ HISTORY.md"
if [ ! "$DRY_RUN" ]; then
# Check for uncommitted changes
UNCOMMITTED="$(git diff -- $GIT_PATHS)"
if [ "$UNCOMMITTED" ]; then
echo 'Uncommitted changes to files to be modified. Please commit first to'
echo 'ensure a clean revert path. You can always `git commit -a --amend`'
echo 'to add more changes to your commit.'
exit 2
fi
fi
# Add first part of existing HISTORY file to new version
awk '{ print } /NOTE/ { exit(0) }' < HISTORY.md > HISTORY.new
# And a blank line separator
echo >> HISTORY.new
# Add new version header
awk '/#define ROCKSDB_MAJOR/ { major = $3 }
/#define ROCKSDB_MINOR/ { minor = $3 }
/#define ROCKSDB_PATCH/ { patch = $3 }
END { printf "## " major "." minor "." patch }' < include/rocksdb/version.h >> HISTORY.new
echo " (`git log -n1 --date=format:"%m/%d/%Y" --format="%ad"`)" >> HISTORY.new
function process_file () {
# use awk to correct
# * extra or missing newlines
# * leading or trailing whitespace
# * missing '* ' on first line
awk '/./ { gsub(/^[ \t]+/, ""); gsub(/[ \t]+$/, "");
if (notfirstline || $1 == "*") print;
else print "* " $0;
notfirstline=1; }' < $1 >> HISTORY.new
echo git rm $1
if [ ! "$DRY_RUN" ]; then
git rm $1
fi
}
PROCESSED_DIRECTORIES=""
function process_dir () {
PROCESSED_DIRECTORIES="$PROCESSED_DIRECTORIES $1"
# ls will sort the files, including the permanent header file
FILES="$(ls unreleased_history/$1/)"
if [ "$FILES" ]; then
echo "### $2" >> HISTORY.new
for FILE in $FILES; do
process_file "unreleased_history/$1/$FILE"
done
echo >> HISTORY.new
echo "Saved entries from $1"
else
echo "Nothing new in $1"
fi
}
# Process dirs and files
process_dir new_features "New Features"
process_dir public_api_changes "Public API Changes"
process_dir behavior_changes "Behavior Changes"
process_dir bug_fixes "Bug Fixes"
process_dir performance_improvements "Performance Improvements"
# Check for unexpected files or dirs at top level. process_dir/process_file
# will deal with contents of these directories
EXPECTED_REGEX="[^/]*[.]sh|README[.]txt|$(echo $PROCESSED_DIRECTORIES | tr ' ' '|')"
platform=`uname`
if [ $platform = 'Darwin' ]; then
UNEXPECTED="$(find -E unreleased_history -mindepth 1 -maxdepth 1 -not -regex "[^/]*/($EXPECTED_REGEX)")"
else
UNEXPECTED="$(find unreleased_history/ -mindepth 1 -maxdepth 1 -regextype egrep -not -regex "[^/]*/($EXPECTED_REGEX)")"
fi
if [ "$UNEXPECTED" ]; then
echo "Unexpected files I don't know how to process:"
echo "$UNEXPECTED"
rm HISTORY.new
exit 3
fi
# Add rest of existing HISTORY file to new version (collapsing newlines)
awk '/./ { if (note) pr=1 }
/NOTE/ { note=1 }
{ if (pr) print }' < HISTORY.md >> HISTORY.new
if [ "$DRY_RUN" ]; then
echo '==========================================='
diff -U3 HISTORY.md HISTORY.new || true
rm HISTORY.new
else
mv HISTORY.new HISTORY.md
echo "Done. Revert command: git checkout HEAD -- $GIT_PATHS"
fi