From 0bab77bf962aac37934e0c6b6adce309501fc578 Mon Sep 17 00:00:00 2001
From: Travis Cross <tc@traviscross.com>
Date: Mon, 28 May 2012 12:11:41 +0000
Subject: [PATCH] debian: refactor and improve build utilities

---
 debian/util.sh | 278 ++++++++++++++++++++++++++-----------------------
 1 file changed, 148 insertions(+), 130 deletions(-)

diff --git a/debian/util.sh b/debian/util.sh
index 133457b983..326e8f6156 100755
--- a/debian/util.sh
+++ b/debian/util.sh
@@ -6,6 +6,9 @@ set -e
 
 ddir="."
 [ -n "${0%/*}" ] && ddir="${0%/*}"
+cd $ddir/../
+
+#### lib
 
 err () {
   echo "$0 error: $1" >&2
@@ -31,6 +34,35 @@ xread () {
   return $ret
 }
 
+mk_dver () { echo "$1" | sed -e 's/-/~/g'; }
+mk_uver () { echo "$1" | sed -e 's/-.*$//' -e 's/~/-/'; }
+dsc_source () { dpkg-parsechangelog | grep '^Source:' | awk '{print $2}'; }
+dsc_ver () { dpkg-parsechangelog | grep '^Version:' | awk '{print $2}'; }
+up_ver () { mk_uver "$(dsc_ver)"; }
+dsc_base () { echo "$(dsc_source)_$(dsc_ver)"; }
+up_base () { echo "$(dsc_source)-$(up_ver)"; }
+
+find_distro () {
+  case "$1" in
+    experimental) echo "sid";;
+    unstable) echo "sid";;
+    testing) echo "wheezy";;
+    stable) echo "squeeze";;
+    *) echo "$1";;
+  esac
+}
+
+find_suite () {
+  case "$1" in
+    sid) echo "unstable";;
+    wheezy) echo "testing";;
+    squeeze) echo "stable";;
+    *) echo "$1";;
+  esac
+}
+
+#### debian/rules helpers
+
 create_dbg_pkgs () {
   for x in $ddir/*; do
     test ! -d $x && continue
@@ -56,166 +88,152 @@ cwget () {
 }
 
 getlib () {
-  local sd="$1" url="$2" f="${2##*/}"
-  (cd $sd/libs \
-    && cwget "$url" \
-    && tar -xv --no-same-owner --no-same-permissions -f "$f" \
-    && rm -f "$f" \
-    && mkdir -p $f)
+  local url="$1" f="${1##*/}"
+  cwget "$url"
+  tar -xv --no-same-owner --no-same-permissions -f "$f"
+  rm -f "$f" && mkdir -p $f && touch $f/.download-stamp
 }
 
 getlibs () {
-  local sd="$1"
   # get pinned libraries
-  getlib $sd http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz
-  getlib $sd http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2
-  getlib $sd http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz
-  getlib $sd http://download.zeromq.org/zeromq-2.1.9.tar.gz \
-    || getlib $sd http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz
-  getlib $sd http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz
+  getlib http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v1.8-latest.tgz
+  getlib http://files.freeswitch.org/downloads/libs/json-c-0.9.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/libmemcached-0.32.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/soundtouch-1.6.0.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/flite-1.5.4-current.tar.bz2
+  getlib http://files.freeswitch.org/downloads/libs/sphinxbase-0.7.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/pocketsphinx-0.7.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/communicator_semi_6000_20080321.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/celt-0.10.0.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/opus-0.9.0.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/openldap-2.4.19.tar.gz
+  getlib http://download.zeromq.org/zeromq-2.1.9.tar.gz \
+    || getlib http://download.zeromq.org/historic/zeromq-2.1.9.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/freeradius-client-1.1.6.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/lame-3.98.4.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/libshout-2.2.2.tar.gz
+  getlib http://files.freeswitch.org/downloads/libs/mpg123-1.13.2.tar.gz
   # cleanup mongo
   (
-    cd $sd/libs/mongo-cxx-driver-v1.8
+    cd mongo-cxx-driver-v1.8
     rm -rf config.log .sconf_temp *Test *Example
     find . -name "*.o" -exec rm -f {} \;
   )
 }
 
-get_current_version () {
-  cat $ddir/changelog \
-    | grep -e '^freeswitch ' \
-    | awk '{print $2}' \
-    | sed -e 's/[()]//g' -e 's/-.*//'
-}
-
-_create_orig () {
-  . $ddir/../scripts/ci/common.sh
-  eval $(parse_version "$(get_current_version)")
-  local destdir="$1" xz_level="$2" n=freeswitch
-  local d=${n}-${dver} f=${n}_${dver}
-  local sd=${ddir}/sdeb/$d
-  [ -n "$destdir" ] || destdir=$ddir/../../
-  mkdir -p $sd
-  tar -c -C $ddir/../ \
-    --exclude=.git \
-    --exclude=debian \
-    --exclude=freeswitch.xcodeproj \
-    --exclude=fscomm \
-    --exclude=htdocs \
-    --exclude=w32 \
-    --exclude=web \
-    -vf - . | tar -x -C $sd -vf -
-  (cd $sd && set_fs_ver "$gver" "$gmajor" "$gminor" "$gmicro" "$grev")
-  getlibs $sd
-  tar -c -C $ddir/sdeb -vf $ddir/sdeb/$f.orig.tar $d
-  xz -${xz_level}v $ddir/sdeb/$f.orig.tar
-  mv $ddir/sdeb/$f.orig.tar.xz $destdir
-  rm -rf $ddir/sdeb
+check_repo_clean () {
+  git diff-index --quiet --cached HEAD \
+    || err "uncommitted changes present"
+  git diff-files --quiet \
+    || err "unclean working tree"
+  git diff-index --quiet HEAD \
+    || err "unclean repository"
+  ! git ls-files --other --error-unmatch . >/dev/null 2>&1 \
+    || err "untracked files or build products present"
 }
 
 create_orig () {
-  local xz_level="6"
-  while getopts 'dz:' o; do
+  local OPTIND OPTARG
+  local uver="" bundle_deps=false zl=9e
+  while getopts 'bnv:z:' o "$@"; do
     case "$o" in
-      d) set -vx;;
-      z) xz_level="$OPTARG";;
+      b) bundle_deps=true;;
+      n) uver="nightly";;
+      v) uver="$OPTARG";;
+      z) zl="$OPTARG";;
     esac
   done
   shift $(($OPTIND-1))
-  _create_orig "$1" "$xz_level"
+  [ -z "$uver" ] || [ "$uver" = "nightly" ] \
+    && uver="$(cat build/next-release.txt)-n$(date +%Y%m%dT%H%M%SZ)"
+  local treeish="$1" dver="$(mk_dver "$uver")"
+  local orig="../freeswitch_$dver.orig.tar.xz"
+  [ -n "$treeish" ] || treeish="HEAD"
+  check_repo_clean
+  git reset --hard "$treeish"
+  mv .gitattributes .gitattributes.orig
+  grep .gitattributes.orig \
+    -e '\bdebian-ignore\b' \
+    -e '\bdfsg-nonfree\b' \
+    | while xread l; do
+    echo "$l export-ignore" >> .gitattributes
+  done
+  if $bundle_deps; then
+    (cd libs && getlibs)
+    git add -f libs
+  fi
+  ./build/set-fs-version.sh "$uver" && git add configure.in
+  git commit --allow-empty -m "nightly v$uver"
+  git archive -v \
+    --worktree-attributes \
+    --format=tar \
+    --prefix=freeswitch-$uver/ \
+    HEAD \
+    | xz -c -${zl}v > $orig
+  mv .gitattributes.orig .gitattributes
+  git reset --hard HEAD^ && git clean -fdx
+  echo $orig
 }
 
 create_dsc () {
-  . $ddir/../scripts/ci/common.sh
-  local xz_level="6"
-  while getopts 'dz:' o; do
-    case "$o" in
-      d) set -vx;;
-      z) xz_level="$OPTARG";;
-    esac
-  done
-  shift $(($OPTIND-1))
-  eval $(parse_version "$(get_current_version)")
-  local destdir="$1" n=freeswitch
-  local d=${n}-${dver} f=${n}_${dver}
-  [ -n "$destdir" ] || destdir=$ddir/../../
-  [ -f $destdir/$f.orig.tar.xz ] \
-    || _create_orig "$1" "${xz_level}"
-  (
-    ddir=$(pwd)/$ddir
-    cd $destdir
-    mkdir -p $f
-    cp -a $ddir $f
-    dpkg-source -b -i.* -Zxz -z9 $f
-  )
-}
-
-build_nightly_for () {
-  set -e
-  local branch="$1"
-  local distro="$2" suite=""
-  case $distro in
-    experimental) distro="sid" suite="experimental";;
-    sid) suite="unstable";;
-    wheezy) suite="testing" ;;
-    squeeze) suite="stable" ;;
-  esac
-  [ -x "$(which cowbuilder)" ] \
-    || err "Error: package cowbuilder isn't installed"
+  local distro="$(find_distro $1)" orig="$2"
+  local suite="$(find_suite $distro)"
+  local orig_ver="$(echo "$orig" | sed -e 's/^.*_//' -e 's/\.orig\.tar.*$//')"
+  local dver="${orig_ver}-1~${distro}+1"
   [ -x "$(which dch)" ] \
-    || err "Error: package devscripts isn't installed"
-  [ -x "$(which git-buildpackage)" ] \
-    || err "Error: package git-buildpackage isn't installed"
-  ulimit -n 200000 || true
-  if ! [ -d /var/cache/pbuilder/base-$distro.cow ]; then
-    announce "Creating base $distro image..."
-    cowbuilder --create \
-      --distribution $distro \
-      --basepath /var/cache/pbuilder/base-$distro.cow
-  fi
-  announce "Updating base $distro image..."
-  cowbuilder --update \
-    --distribution $distro \
-    --basepath /var/cache/pbuilder/base-$distro.cow
-  local ver="$(cat build/next-release.txt | sed -e 's/-/~/g')~n$(date +%Y%m%dT%H%M%SZ)-1~${distro}+1"
-  echo "Building v$ver for $distro based on $branch"
-  cd $ddir/../
-  announce "Building v$ver..."
-  git clean -fdx
-  git reset --hard $branch
-  ./build/set-fs-version.sh "$ver"
-  git add configure.in && git commit --allow-empty -m "nightly v$ver"
+    || err "package devscripts isn't installed"
   (cd debian && ./bootstrap.sh -c $distro)
-  dch -b -m -v "$ver" --force-distribution -D "$suite" "Nightly build."
-  git-buildpackage -us -uc \
-    --git-verbose \
-    --git-pbuilder --git-dist=$distro \
-    --git-compression=xz --git-compression-level=9ev
-  git reset --hard HEAD^
+  dch -b -m -v "$dver" --force-distribution -D "$suite" "Nightly build."
+  git add debian/changelog && git commit -m "nightly v$orig_ver"
+  dpkg-source -i.* -Zxz -z9 -b .
+  dpkg-genchanges -S > ../$(dsc_base)_source.changes
+  local dsc="../$(dsc_base).dsc"
+  git reset --hard HEAD^ && git clean -fdx
+  echo $dsc
 }
 
-build_nightly () {
-  local branch="$1"; shift
-  for distro in "$@"; do
-    build_nightly_for "$branch" "$distro"
-  done
+build_debs () {
+  local distro="$(find_distro $1)" dsc="$2" arch="$3"
+  if [ -z "$distro" ] || [ "$distro" = "auto" ]; then
+    if ! (echo "$dsc" | grep -e '-[0-9]*~[a-z]*+[0-9]*'); then
+      err "no distro specified or found"
+    fi
+    local x="$(echo $dsc | sed -e 's/^[^-]*-[0-9]*~//' -e 's/+[^+]*$//')"
+    distro="$(find_distro $x)"
+  fi
+  [ -n "$arch" ] || arch="$(dpkg-architecture | grep '^DEB_BUILD_ARCH=' | cut -d'=' -f2)"
+  [ -x "$(which cowbuilder)" ] \
+    || err "package cowbuilder isn't installed"
+  local cow_img=/var/cache/pbuilder/base-$distro-$arch.cow
+  cow () {
+    cowbuilder "$@" \
+      --distribution $distro \
+      --architecture $arch \
+      --basepath $cow_img
+  }
+  if ! [ -d $cow_img ]; then
+    announce "Creating base $distro-$arch image..."
+    cow --create
+  fi
+  announce "Updating base $distro-$arch image..."
+  cow --update
+  announce "Building $distro-$arch DEBs from $dsc..."
+  cow --build $dsc
+  echo ${dsc}_${arch}.changes
 }
 
+while getopts 'd' o "$@"; do
+  case "$o" in
+    d) set -vx;;
+  esac
+done
+shift $(($OPTIND-1))
+
 cmd="$1"
 shift
 case "$cmd" in
-  build-nightly) build_nightly "$@" ;;
+  archive-orig) archive_orig "$@" ;;
+  build-debs) build_debs "$@" ;;
   create-dbg-pkgs) create_dbg_pkgs ;;
   create-dsc) create_dsc "$@" ;;
   create-orig) create_orig "$@" ;;