#!/bin/bash
# This code is part of GOsa (http://www.gosa-project.org)
# Copyright (C) 2008 GONICUS GmbH
#
# ID: $$Id: make-gosa-package 15693 2010-02-24 11:42:05Z janw $$
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# Define defaults
RELEASE_REASON="GOsa svn snapshot"
BRANCH="trunk"
SECTION="web"
SI_SECTION="utils"
TARGET_RELEASE="etch"
MAKE_PLUGINS=""
MAKE_GOTO=""
GOTO=""
PBUILDER=""
NOT_RELEASED="heimdal dak dfs glpi apache2"
GOTO_NOT_RELEASED="apache-directory-studio goto-cd libresourcepool-net-ldap-perl-1.002 libresourcepool-perl-1.0104 openproj ptc syslinux konch ldm openssh-4.3p2" 
DEBIAN_PKG="remove"
NO_SVN="use"
EXTRACT=`pwd`

usage() {
	cat <<-EOF
	GOsa Debian package build tool. Build snapshots from selected SVN locations or local directories.
	Usage: ${0##*/} [options]
	
	Options:
	  -b|--branch       Branch to export [$BRANCH]
	  -p|--plugins      Comma seperate list of plugins to build. Leave empty to build all.
	  -e|--experimental Build not released plugins (for testers and developers only)
	  -r|--release      Debian release to build for [$TARGET_RELEASE]
	  -c|--changelog    Debian changelog entry [$RELEASE_REASON]
	  -s|--section      Debian section to place GOsa in [$SECTION]
	  -i|--si-section   Debian section to place GOsa-SI in [$SI_SECTION]
	  -d|--debian-pkg   Don't clear up debian packages for plugins (for developers only)
	  -n|--no-svn       Don't extract gosa from svn (when internet connectivity is not present)
	  -x|--extract-dir  Directory where the checkout is for no-svn
	  -g|--build-goto   Build the goto2 packages
	  -l|--use-pbuilder Use pbuilder to build the packages
	  -h|--help         this help

	EOF
	exit 1
}

for cmd in dh-make-gosa debchange dpkg-buildpackage dpkg-source svn; do
  if ! which $cmd >/dev/null; then
  	echo "Error: cannot find '$cmd' command in path!";
  	exit 1
  fi
done

# Import command line parameters
PARMS=`getopt -o e::d::b:r:s:c:i:p:n:x:g::l::,h --long branch:,changelog:,plugins:,section:,si-section:,release:,help -n "${0##*/}" -- "$@"`
eval set -- "$PARMS"

while true; do
        case "$1" in
                -b|--branch)
			BRANCH=$2; shift 2 ;;
                -r|--release)
			TARGET_RELEASE=$2; shift 2 ;;
                -c|--changelog)
			RELEASE_REASON=$2; shift 2 ;;
                -p|--plugins)
			MAKE_PLUGINS=$(echo $2 | tr ',' ' '); shift 2 ;;
		-e|--experimental)
			NOT_RELEASED=""; shift 2;;
                -s|--section)
			SECTION=$2; shift 2 ;;
                -i|--si-section)
			SI_SECTION=$2; shift 2 ;;
                -d|--debian-pkg)
                        DEBIAN_PKG=""; shift 2 ;;
                -n|--no-svn)
                        NO_SVN=""; shift 2;;
                -x|--extract-dir)
                        EXTRACT=$2; shift 2;;
                -g|--build-goto)
                        GOTO="use"; shift 2;;
                -l|--use-pbuilder)
                        PBUILDER="use"; shift 2;;
                -h|--help)
			usage ;;
                --)
			shift; break ;;
                *)
			echo "getopt error" ;;
        esac
done

if [ "$NO_SVN" = "use" ]
then
	echo "Loading svn information for gosa '${BRANCH}'..."
	svn co -N https://oss.gonicus.de/repositories/gosa/${BRANCH} gosa-info/ > /dev/null
	BRANCH_REV=$(LANG=C svn info gosa-info | sed -n -e 's/^Last Changed Rev: \([0-9]*\).*$/\1/p')
	rm -rf gosa-info

	if [ "$GOTO" = "use" ]
	        then
	        echo "Loading svn information for goto '${BRANCH}'..."
	        svn co -N https://oss.gonicus.de/repositories/goto/${BRANCH} goto-info/ > /dev/null
	        GOTO_BRANCH_REV=$(LANG=C svn info goto-info | sed -n -e 's/^Last Changed Rev: \([0-9]*\).*$/\1/p')
	        rm -rf goto-info
	fi
else
        echo "Loading svn information for gosa '${BRANCH}' from local checkout ..."
	BRANCH_REV=$(LANG=C svn info $EXTRACT/gosa-core | sed -n -e 's/^Last Changed Rev: \([0-9]*\).*$/\1/p')

	if [ "$GOTO" = "use" ]
	then
		echo "Loading svn information for goto '${BRANCH}' from local checkout ..."
        	GOTO_BRANCH_REV=$(LANG=C svn info $EXTRACT/goto | sed -n -e 's/^Last Changed Rev: \([0-9]*\).*$/\1/p')
	fi
fi

if [ "$NO_SVN" = "use" ]
then
	# Load current revision from logs
	VERSION=$(svn cat -r "${BRANCH_REV}" https://oss.gonicus.de/repositories/gosa/${BRANCH}/gosa-core/debian/changelog \
		| head -n 1 | sed -n -e 's/.*(\([^-]*\).*/\1/p')
	if [ "$BRANCH" == "trunk" ]; then
		GOSA_VER="${VERSION}+svn${BRANCH_REV}"

	        if [ "$GOTO" = "use" ]
        	then
			GOTO_VER="+svn${GOTO_BRANCH_REV}"
		fi
	else
		GOSA_VER="${VERSION}"

                if [ "$GOTO" = "use" ]
                then
                        GOTO_VER=""
                fi

	fi

else
        # Load current revision from logs
	VERSION=$(cat $EXTRACT/gosa-core/debian/changelog | head -n 1 | sed -n -e 's/.*(\([^-]*\).*/\1/p')

        if [ "$BRANCH" == "trunk" ]; then
                GOSA_VER="${VERSION}+svn${BRANCH_REV}"
        else
                GOSA_VER="${VERSION}"
        fi
	echo $GOSA_VER
fi

GOSA_DIR="gosa-${GOSA_VER}"

ORIG_FILE="gosa_${GOSA_VER}.orig.tar.gz"

if [ "$NO_SVN" = "use" ]
then
	# Export from svn...
	BNAME=$(basename $BRANCH)
	[ -d "gosa-${BNAME}" ] && rm -rf gosa-$BNAME
	echo "Exporting current GOsa (rev: ${BRANCH_REV}) from '${BRANCH}'..."
	svn export -r "${BRANCH_REV}" https://oss.gonicus.de/repositories/gosa/${BRANCH}/gosa-core gosa-${BNAME} > /dev/null
	svn export -r "${BRANCH_REV}" https://oss.gonicus.de/repositories/gosa/${BRANCH}/gosa-si gosa-si-${BNAME} > /dev/null
	svn export -r "${BRANCH_REV}" https://oss.gonicus.de/repositories/gosa/${BRANCH}/gosa-plugins gosa-plugins-${BNAME} > /dev/null

        if [ "$GOTO" = "use" ]
        then
		echo "Exporting current GOto (rev: ${GOTO_BRANCH_REV}) from '${BRANCH}'..."
        	svn export -r "${GOTO_BRANCH_REV}" https://oss.gonicus.de/repositories/goto/${BRANCH}/ goto-${BNAME} > /dev/null
	fi
else
        # Export from local checkout...
        echo "Exporting current GOsa (rev: ${BRANCH_REV}) from localcheckout '${BRANCH}'..."
	BNAME=$(basename $BRANCH)
	cp -r gosa-core gosa-${GOSA_VER}
	mv gosa-si gosa-si-${GOSA_VER}
	mv gosa-plugins gosa-plugins-${BNAME}

        if [ "$GOTO" = "use" ]
        then
		echo "Exporting current GOto (rev: ${GOTO_BRANCH_REV}) from localcheckout '${BRANCH}'..."
        	BNAME=$(basename $BRANCH)
		mv goto goto-${BNAME}
	fi
fi

if [ "$NO_SVN" = "use" ]
then
        VERSION=$(cat "gosa-${BNAME}/debian/changelog" | head -n 1 | sed -n -e 's/.*(\([^-]*\).*/\1/p')
fi

GOSA_DIR="gosa-${GOSA_VER}"
GOSA_SI_DIR="gosa-si-${GOSA_VER}"
GOTO_DIR="goto-${BNAME}"

if [ "$NO_SVN" = "use" ]
then
	if [ "$BNAME" != "$GOSA_VER" ]
	then
		rm -rf "gosa-${GOSA_VER}"
	fi
fi

if [ "$NO_SVN" = "use" ]
then
	if [ "$BNAME" != "$GOSA_VER" ]
	then
		mv "gosa-${BNAME}" "gosa-${GOSA_VER}"
		mv "gosa-si-${BNAME}" "gosa-si-${GOSA_VER}"
	fi
fi

echo "cleaning svn entries from sources"
find ${GOSA_DIR} -type d -name ".svn" -exec rm -rf {} \; >/dev/null 2>&1
find ${GOSA_SI_DIR} -type d -name ".svn" -exec rm -rf {} \; >/dev/null 2>&1
find gosa-plugins-${BNAME} -type d -name ".svn" -exec rm -rf {} \; >/dev/null 2>&1

if [ "$GOTO" = "use" ]
then
	find goto-${BNAME} -type d -name ".svn" -exec rm -rf {} \; >/dev/null 2>&1
fi

echo "Creating original sources 'gosa-${GOSA_VER}'..."
tar -c --exclude "${GOSA_DIR}"/debian -f "gosa_${GOSA_VER}.orig.tar" "${GOSA_DIR}"
tar -c --exclude "${GOSA_SI_DIR}"/debian -f "gosa-si_${GOSA_VER}.orig.tar" "${GOSA_SI_DIR}"

echo "Compressing sources..."
gzip -f -9 "gosa_${GOSA_VER}.orig.tar"
gzip -f -9 "gosa-si_${GOSA_VER}.orig.tar"

export OVERRIDE_VERSION="$GOSA_VER"
if [ -z "$MAKE_PLUGINS" ]; then
	MAKE_PLUGINS=$(ls -1 gosa-plugins-${BNAME}/*/plugin.dsc | sed 's/^.*\/\([^\/]*\)\/plugin.dsc$/\1/')
	for i in $NOT_RELEASED; do
		MAKE_PLUGINS=$(echo -n $MAKE_PLUGINS | sed "s/$i//")
	done
fi

if [ "TARGET_RELEASE" == "etch" ]; then
  NOBREAKS="--no-break"
fi

for plugin in $MAKE_PLUGINS; do

	GOSA_PLUG_DIR="gosa-plugin-$plugin-${GOSA_VER}"

	echo "gosa plugin dir" $GOSA_PLUG_DIR

	mv "gosa-plugins-${BNAME}/$plugin" .

	echo "Debianizing plugin $plugin"
	yes | dh-make-gosa $NOBREAKS --section $SECTION $plugin
	rm -rf "$plugin"

	echo "Packing original sources 'gosa-plugin-$plugin-${GOSA_VER}'..."
	tar -c --exclude "gosa-plugin-${plugin}-${GOSA_VER}/debian" -f "gosa-plugin-${plugin}_${GOSA_VER}.orig.tar" "${GOSA_PLUG_DIR}"

	echo "Compressing sources..."
	gzip -f -9 "gosa-plugin-${plugin}_${GOSA_VER}.orig.tar"
done

rm -rf gosa-plugins-${BNAME}

if [ "$GOTO" = "use" ]
then
        MAKE_GOTO=$(ls -1 goto-${BNAME}/)

        for i in $GOTO_NOT_RELEASED; do
                MAKE_GOTO=$(echo -n $MAKE_GOTO | sed "s/$i//")
        done

        for goto in $MAKE_GOTO; do

                mv "goto-${BNAME}/$goto" .

                echo "Packing original sources '$goto'..."
                GOTO_VERSION=$(cat $goto/debian/changelog | head -n 1 | sed -n -e 's/.*(\([^-]*\).*/\1/p')

                if [ "$GOTO_VER" = "" ]
                then
			tar -c --exclude "$goto/debian" -f "${goto}_${GOTO_VERSION}.orig.tar" $goto
                        echo "Compressing sources..."
                        gzip -f -9 "${goto}_${GOTO_VERSION}.orig.tar"
                else
			tar -c --exclude "$goto/debian" -f "${goto}_${GOTO_VERSION}${GOTO_VER}.orig.tar" $goto

			echo "Compressing svn sources..."
			gzip -f -9 "${goto}_${GOTO_VERSION}${GOTO_VER}.orig.tar"

			echo "Adapting version in $goto"
			(cd "$goto"; echo | debchange -v "${GOTO_VERSION}${GOTO_VER}-1${TARGET_RELEASE}1" -D "$TARGET_RELEASE" "$RELEASE_REASON")
		fi

        done

        rm -rf goto-${BNAME}
fi

echo "Deploying patches..."
for patch in $(find patches -type f | grep -v .svn); do

	if echo $patch | grep -q gosa-plugin; then
		plugin=$(echo $patch | sed 's/^.*gosa-plugin-\([^-]*\).*$/\1/g')
		echo "* gosa-plugin-$plugin patch: $patch"
		[ -d "gosa-plugin-${plugin}-${GOSA_VER}/debian/patches" ] || mkdir -p "gosa-plugin-${plugin}-${GOSA_VER}/debian/patches"
		cp "$patch" gosa-plugin-${plugin}-${GOSA_VER}/debian/patches
	else
		echo "* gosa-core patch: $patch"
		[ -d "${GOSA_DIR}/debian/patches" ] && mkdir -p "${GOSA_DIR}/debian/patches"
		cp "$patch" ${GOSA_DIR}/debian/patches
	fi
done

# Put section in GOsa_DIR
sed -i "s#^Section: web#Section: $SECTION#g" ${GOSA_DIR}/debian/control
sed -i "s#^Section: utils#Section: $SI_SECTION#g" ${GOSA_SI_DIR}/debian/control

for plugin in $MAKE_PLUGINS; do
	GOSA_PLUGIN_DIRS="$GOSA_PLUGIN_DIRS gosa-plugin-$plugin-${GOSA_VER}"
done

if [ "$GOTO" = "use" ]
then
	for goto in $MAKE_GOTO; do
        	GOTO_DIRS="$GOTO_DIRS $goto"
	done
fi

for dir in $GOSA_DIR $GOSA_SI_DIR $GOSA_PLUGIN_DIRS; do
	echo "Adapting version in $dir"
	if [ "$TARGET_RELEASE" == "unstable" ]; then
		(cd "$dir"; echo | debchange -v "${GOSA_VER}" "$RELEASE_REASON" >/dev/null 2>&1)
	else
		(cd "$dir"; echo | debchange -v "${GOSA_VER}-1${TARGET_RELEASE}1" -D "$TARGET_RELEASE" "$RELEASE_REASON" >/dev/null 2>&1)
	fi
	[ -d $dir/debian/patches ] || continue
	echo "Creating patch list for $dir"
	ls -1 $dir/debian/patches | grep -v 00list | sed 's%^.*/%%g' > $dir/debian/patches/00list
done

# Update revision
sed -i "s/^\$svn_revision = .*$/\$svn_revision = '\$Revision: $BRANCH_REV \$';/g" $GOSA_DIR/include/functions.inc

if [ "$1" = "-s" ]
then
	echo "Creating debian sources..."
	for dir in $GOSA_DIR $GOSA_SI_DIR $GOSA_PLUGIN_DIRS; do
		dpkg-source -b "$dir"
	done

        if [ "$GOTO" = "use" ]
        then
	        echo "Creating GOto sources..."
        	for dir in $GOTO_DIRS; do
                	dpkg-source -b "$dir"
        	done
	fi
else
	echo "Creating debian packages..."

	for dir in $GOSA_DIR $GOSA_SI_DIR $GOSA_PLUGIN_DIRS; do
	if [ "$PBUILDER" = "use" ]
	then
		echo "using pbuilder to build gosa gosa-si gosa-plugins"
		(cd "$dir"; pdebuild --debbuildopts -sa; debsign)
	else
		(cd "$dir"; dpkg-buildpackage -k$DEBSIGN_KEYID -rfakeroot -sa)
	fi
	done

        if [ "$GOTO" = "use" ]
        then
	        echo "Creating GOto debian packages..."
        	for dir in $GOTO_DIRS; do
	        if [ "$PBUILDER" = "use" ]
        	then
			echo "using pbuilder to build goto debian packages"
                	(cd "$dir"; pdebuild --debbuildopts -sa; debsign -k$DEBSIGN_KEYID)
		else
                	(cd "$dir"; dpkg-buildpackage -k$DEBSIGN_KEYID -rfakeroot -sa)
		fi
	        done
	fi
fi

echo "Removing gosa snapshot..."
if [ -z "$DEBIAN_PKG" ]
then
	if [ "$NO_SVN" = "use" ]
	then
		for dir in $GOSA_DIR; do
        	rm -rf "$dir"
		done
	fi
else
	for dir in $GOSA_DIR $GOSA_SI_DIR $GOSA_PLUGIN_DIRS; do
	rm -rf "$dir"
	done

        if [ "$GOTO" = "use" ]
        then
	        for dir in $GOTO_DIRs; do
        	rm -rf "$dir"
        	done
	fi
fi


