1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
#!/bin/bash
usage() {
echo "Usage: release.sh [-d] VERSION"
echo ""
echo "The script does all necessary steps to create a new release."
echo ""
echo " -d: no documentation update"
echo " -f: disable all sanity checks and just do the release"
echo " -l: do not update library dependency"
echo ""
echo "Note: The version number needs to be exactly"
echo " '^v[\d]+.[\d]+(.[\d\]+(-rc[0-9]+)?$'"
echo ""
echo "example:"
echo " release.sh v2.1-rc0 # v2.1 release candidate 0"
echo " release.sh v2.1 # v2.1 release"
}
build_doc=true
update_lib_dep=true
force=false
while getopts "dfl" o; do
case "${o}" in
d)
build_doc=false
;;
f)
force=true
;;
l)
update_lib_dep=false
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
VERSION=${1:-}
if [ -z "$VERSION" ] ; then
usage
exit 1
fi
cleanup() {
if [ -z "${OLD_HEAD}" ] ; then
exit
fi
git tag -d "Release $VERSION" "$VERSION"
git reset --hard "${OLD_HEAD}"
}
register_cleanup() {
OLD_HEAD="$(git rev-parse HEAD)"
}
unregister_cleanup() {
OLD_HEAD=""
}
trap cleanup EXIT
register_cleanup
# expected version regex
re='^v([0-9]+\.[0-9]+(\.[0-9]+)?)(-rc[0-9]+)?$'
# use the version string provided from the command line
if [[ "$VERSION" =~ ${re} ]]; then
echo "valid version $VERSION string"
# remove the leading 'v'
ver="${VERSION#v}"
else
echo "invalid version string $VERSION"
exit 1
fi
cd "$(git rev-parse --show-toplevel)" || exit 1
if [ "$update_lib_dep" = true ] && [[ -f subprojects/libnvme.wrap ]]; then
git -C subprojects/libnvme fetch --all
# extract the version string from libnvme by using the ref
# defined in libnvme.wrap.
libnvme_ref=$(sed -n "s/revision = \([0-9a-z]\+\)/\1/p" subprojects/libnvme.wrap)
libnvme_VERSION=$(git -C subprojects/libnvme describe "${libnvme_ref}")
if [[ "${libnvme_VERSION}" =~ ${re} ]]; then
echo "libnvme: valid version ${libnvme_VERSION} string"
# remove the leading 'v'
libnvme_ver="${libnvme_VERSION#v}"
else
echo "libnvme: invalid version string ${libnvme_VERSION}"
exit 1
fi
fi
if [ "$force" = false ] ; then
if [[ -n $(git status -s) ]]; then
echo "tree is dirty."
if [[ "${dry_run}" = false ]]; then
exit 1
fi
fi
if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ] ; then
echo "currently not on master branch. abort."
exit 1
fi
fi
# update all docs
doc_dir=""
if [ -d "Documentation" ]; then
doc_dir="Documentation"
elif [ -d "doc" ]; then
doc_dir="doc"
else
echo "documentation directory not found"
exit 1
fi
if [ "$build_doc" = true ]; then
# update documentation
./scripts/update-docs.sh
git add $doc_dir
git commit -s -m "doc: Regenerate all docs for $VERSION"
fi
# update meson.build
sed -i -e "0,/[ \t]version: /s/\([ \t]version: \).*/\1\'$ver\',/" meson.build
if [[ -n "$libnvme_VERSION" ]] && [[ -f subprojects/libnvme.wrap ]]; then
sed -i -e "s/\(dependency('libnvme', version: '>=\)\([\.1-9]\+\)/\1$libnvme_ver/" meson.build
fi
git add meson.build
git commit -s -m "Release $VERSION"
git tag -s -m "Release $VERSION" "$VERSION"
git push --dry-run origin "$VERSION"^{}:master tag "$VERSION"
read -p "All good? Ready to push changes to remote? [Yy]" -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
git push origin "$VERSION"^{}:master tag "$VERSION"
unregister_cleanup
fi
|