view contrib/packaging/builddeb @ 40107:212a52d8e9d8

packaging: "make deb" no longer fails Release 4.7 rationalized the layout of the build scripts. Unfortunately, while "make docker-ubuntu-*" and "make docker-debian-*" worked as expected, "make deb" was broken. Before this change "make deb" was failing with the following error: You are not inside a Mercurial repository! Or, after the latest changes: You are inside <fullpath>, which is not the root of a Mercurial repository Moreover, when "make deb" failed, the cleanup routine deleted the wrong directory (contrib/packaging/debian instead of <reporoot>/debian) resulting in a corrupted working copy that needed to be hg revert-ed. After this change the docker targets continue to work, and the deb one is able to finish.
author muxator <a.mux@inwind.it>
date Tue, 09 Oct 2018 22:29:10 +0200
parents 930bce0741de
children 734407c4568a
line wrap: on
line source

#!/bin/sh -e
#
# Build a Mercurial debian package from the current repo
#
# Tested on Jessie (stable as of original script authoring.)

. $(dirname $0)/packagelib.sh

ROOTDIR=$(cd $(dirname $0)/../.. > /dev/null; pwd)

BUILD=1
CLEANUP=1
DISTID=`(lsb_release -is 2> /dev/null | tr '[:upper:]' '[:lower:]') || echo debian`
CODENAME=`lsb_release -cs 2> /dev/null || echo unknown`
DEBFLAGS=-b

cleanup() {
    if [ "$CLEANUP" ]; then
        rm -r "$ROOTDIR/debian";
    fi
}

while [ "$1" ]; do
    case "$1" in
    --distid )
        shift
        DISTID="$1"
        shift
        ;;
    --codename )
        shift
        CODENAME="$1"
        shift
        ;;
    --cleanup )
        shift
        BUILD=
        ;;
    --build )
        shift
        CLEANUP=
        ;;
    --source-only )
        shift
        DEBFLAGS=-S
        ;;
    * )
        echo "Invalid parameter $1!" 1>&2
        exit 1
        ;;
    esac
done

cd "$ROOTDIR"

trap 'cleanup' EXIT

set -u

if [ ! -d .hg ]; then
    printf "You are inside %s, which is not the root of a Mercurial repository\n" $(pwd) 1>&2
    exit 1
fi

gethgversion
debver="$version"
if [ -n "$type" ] ; then
    debver="$debver~$type"
fi
if [ -n "$distance" ] ; then
    debver="$debver+$distance-$CODENAME-$node"
elif [ "$DEBFLAGS" = "-S" ] ; then
    # for building a ppa (--source-only) for a release (distance == 0), we need
    # to version the distroseries so that we can upload to launchpad
    debver="$debver~${CODENAME}1"
fi

control=debian/control
changelog=debian/changelog

if [ "$BUILD" ]; then
    if [ -d debian ] ; then
        printf "Error! debian control directory already exists at %s/debian\n" $(pwd)
        exit 1
    fi

    cp -r "$ROOTDIR"/contrib/packaging/debian debian

    sed -i.tmp "s/__VERSION__/$debver/" $changelog
    sed -i.tmp "s/__DATE__/$(date --rfc-2822)/" $changelog
    sed -i.tmp "s/__CODENAME__/$CODENAME/" $changelog
    rm $changelog.tmp

    # remove the node from the version string
    SRCFILE="mercurial_$(echo $debver | sed "s,-$node,,").orig.tar.gz"
    "$ROOTDIR/hg" archive $SRCFILE
    mv $SRCFILE ..
    debuild -us -uc -i -I $DEBFLAGS
    if [ $? != 0 ]; then
        echo 'debuild failed!'
        exit 1
    fi

fi
if [ "$CLEANUP" ] ; then
    echo
    OUTPUTDIR=${OUTPUTDIR:=packages/$DISTID-$CODENAME}
    mkdir -p "$OUTPUTDIR"
    find ../mercurial*.deb ../mercurial_*.build ../mercurial_*.changes \
          ../mercurial*.dsc ../mercurial*.gz \
          -type f -newer $control -print0 2>/dev/null | \
      xargs -Inarf -0 mv narf "$OUTPUTDIR"
    echo "Built packages for $debver:"
    find "$PWD"/"$OUTPUTDIR" -type f -newer $control -name '*.deb'
fi