diff options
-rwxr-xr-x | debian/at2quilt | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/debian/at2quilt b/debian/at2quilt new file mode 100755 index 000000000..23ee818d8 --- /dev/null +++ b/debian/at2quilt @@ -0,0 +1,162 @@ +#!/bin/sh + +# at2quilt +# Copyright (c) 2011, Frank Terbeck <ft@bewatermyfriend.org> +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# This script automates the task of creating quilt patches for debian's +# zsh package for generating autotools files, which are otherwise created +# by calling `./Utils/preconfig'. +# +# Here is how this script fits into the packages release workflow: +# Everytime an update to the autotools files is needed (usually after +# an upstream release) this script should be called in an otherwise +# clean git repository. After the script ran, all autotools related +# git patches should be updated, ready for commit. The final commit +# is not done automatically to give the caller the chance of catching +# undesired behaviour. +# +# This script creates these patches: +# - deb_at_configure.diff +# - deb_at_config_h_in.diff +# +# `preconfig' also creates another file `stamp-h.in', which is empty. The +# build process (aka. debian/rules) should just touch(1) that file early. +# +# Note: Call this script *only* from the git repository's base directory. + +QUILT_PATCHES=debian/patches +export QUILT_PATCHES +INDEX=${PWD##*/} +INDEX=${INDEX%/} + +if ! quilt --version > /dev/null 2>&1; then + printf 'Ooops, `quilt(1)'\'' not found. Giving up.\n' + exit 1 +fi + +if [ ! -d "${QUILT_PATCHES}" ]; then + printf 'No such directory: `%s'\''\n' "${QUILT_PATCHES}" + printf 'Quilt patches directory not found. Giving up.\n' + exit 1 +fi + +printf 'Cleaning up...\n' + +# Unapply everything +quilt pop -a + +# Manually apply the patches from the command line, so we can have +# changes to configure.ac etc. +for patch in "$@"; do + patch -p1 < "${patch}" || { + printf 'Aarrgh! Manually applying `%s'\'' failed. Giving up.\n' "${patch}" + exit 1 + } + # Keep reverse order for later. + if [ "x${PATCHES}" = x ]; then + PATCHES=${patch} + else + PATCHES="${patch} ${PATCHES}" + fi +done + +# Clean up old files that may be around. +rm -f configure config.h.in stamp-h.in +rm -Rf autom4te.cache + +# Now let `preconfig' do its magic, so we end up with fresh files. +printf '\nRunning `preconfig'\''\n' +if ! ./Util/preconfig; then + printf '\nOops, `preconfig'\'' signaled an error. Giving up.\n' + exit 1 +fi +rm -Rf autom4te.cache + +create_patch() { + patch="${QUILT_PATCHES}/$1" + file=$2 + series="${QUILT_PATCHES}/series" + + if [ ! -e "${file}" ]; then + printf 'Target file `%s'\'' does not exist. Giving up.\n' "${file}" + return 1 + fi + if [ -e "${series}" ]; then + got_series=1 + cp "${series}" series.old + else + got_series=0 + fi + + cat << __EOF__ > "${patch}" +Patch to generate \`${file}'. + +Created by \`at2quilt' on $(date +"%a, %d %b %Y %H:%M:%S %Z"). + +Note: Never *ever* refresh this patch. Things will break. + +Index: ${INDEX}/${file} +__EOF__ + diff -u /dev/null "${file}" \ + | sed -e "1s,/dev/null,${INDEX}.orig/${file}," \ + -e "2s,^+++ [^[:space:]]*,+++ ${INDEX}/${file}," >> "${patch}" + + if ! grep -q '^'"$1"'$' "${series}"; then + printf '`%s'\'' missing in `%s'\''. Adding.\n' "$1" "${series}" + printf '%s\n' "$1" > "${series}" + if [ "${got_series}" = 1 ]; then + cat series.old >> "${series}" + fi + fi + if [ "${got_series}" = 1 ]; then + rm series.old + fi + return 0 +} + +create_patch deb_0001_at_config_h_in.diff config.h.in || exit 1 +create_patch deb_0000_at_configure.diff configure || exit 1 + +# Clean up manually applied patches again, if any. +if [ "x${PATCHES}" != x ]; then + for patch in ${PATCHES}; do + patch -p1 -R < "${patch}" || { + printf 'Aarrgh! Manually reverting `%s'\'' failed. Giving up.\n' "${patch}" + exit 1 + } + done +fi + +# Try to push the entire current quilt series (this really shouldn't fail). +if ! quilt push -a; then + printf 'Pushing the quilt series failed. Please investigate.\n' + exit 1 +fi + +# Pop everything again. +if ! quilt pop -a; then + printf 'Popping the quilt series failed. Please investigate.\n' + exit 1 +fi + +printf 'Looks like everything went as expected.\n' +printf 'The autotools related patches in `%s'\'' should be up-to-date now.\n' \ + "${QUILT_PATCHES}" +printf 'To test the patches, do this:\n' +printf ' %% quilt push -a\n' +printf ' %% chmod 0755 configure\n' +printf ' %% ./configure\n' +printf '\nDo not forget to commit the updated patches to the git repository.\n' +exit 0 |