#!/bin/sh
# $FreeBSD$
#
# Usage: cd /usr/src/contrib/jemalloc
# ./FREEBSD-upgrade <command> [args]
#
# At least the following ports are required when importing jemalloc:
# - devel/autoconf
# - devel/git
# - devel/gmake
# - textproc/docbook-xsl
# - textproc/libxslt
#
# The normal workflow for importing a new release is:
#
# cd /usr/src/contrib/jemalloc
#
# Merge local changes that were made since the previous import:
#
# ./FREEBSD-upgrade merge-changes
# ./FREEBSD-upgrade rediff
#
# Extract latest jemalloc release.
#
# ./FREEBSD-upgrade extract
#
# Fix patch conflicts as necessary, then regenerate diffs to update line
# offsets:
#
# ./FREEBSD-upgrade rediff
# ./FREEBSD-upgrade extract
#
# Do multiple buildworld/installworld rounds. If problems arise and patches
# are needed, edit the code in ${work} as necessary, then:
#
# ./FREEBSD-upgrade rediff
# ./FREEBSD-upgrade extract
#
# The rediff/extract order is important because rediff saves the local
# changes, then extract blows away the work tree and re-creates it with the
# diffs applied.
#
# Finally, to clean up:
#
# ./FREEBSD-upgrade clean
set -e
if [ ! -x "FREEBSD-upgrade" ] ; then
echo "Run from within src/contrib/jemalloc/" >&2
exit 1
fi
src=`pwd`
workname="jemalloc.git"
work="${src}/../${workname}" # merge-changes expects ${workname} in "..".
changes="${src}/FREEBSD-changes"
do_extract() {
local rev=$1
# Clone.
rm -rf ${work}
git clone https://github.com/jemalloc/jemalloc.git ${work}
(
cd ${work}
if [ "x${rev}" != "x" ] ; then
# Use optional rev argument to check out a revision other than HEAD on
# master.
git checkout ${rev}
fi
# Apply diffs before generating files.
patch -p1 < "${src}/FREEBSD-diffs"
find . -name '*.orig' -delete
# Generate various files.
./autogen.sh --enable-cc-silence --enable-xmalloc --enable-utrace \
--with-xslroot=/usr/local/share/xsl/docbook --with-private-namespace=__ \
--with-lg-page-sizes=12,13,14,16
gmake dist
)
}
do_diff() {
(
cd ${work}
find . -name '*.orig' -delete
find . -name '*.rej' -delete
git add -A
git diff --cached
) > FREEBSD-diffs
}
command=$1
shift
case "${command}" in
merge-changes) # Merge local changes that were made since the previous import.
rev=`cat VERSION |tr 'g' ' ' |awk '{print $2}'`
# Extract code corresponding to most recent import.
do_extract ${rev}
# Compute local differences to the upstream+patches and apply them.
(
cd ..
diff -ru -X ${src}/FREEBSD-Xlist ${workname} jemalloc > ${changes} || true
)
(
cd ${work}
patch -p1 < ${changes}
find . -name '*.orig' -delete
)
# Update diff.
do_diff
;;
extract) # Extract upstream sources, apply patches, copy to contrib/jemalloc.
rev=$1
do_extract ${rev}
# Delete existing files so that cruft doesn't silently remain.
rm -rf ChangeLog COPYING VERSION doc include src
# Copy files over.
tar cf - -C ${work} -X FREEBSD-Xlist . |tar xvf -
;;
rediff) # Regenerate diffs based on working tree.
do_diff
;;
clean) # Remove working tree and temporary files.
rm -rf ${work} ${changes}
;;
*)
echo "Unsupported command: \"${command}\"" >&2
exit 1
;;
esac