#!/bin/sh
#
# convert <arch> <deb>
#
# Convert <deb> to architecture <arch>

set -e

# Commandline checks
if ! [ $# -eq 2 ]; then
  echo "Wrong number of arguments:"
  echo "Usage convert <arch> <deb>"
  exit 1
fi

export ARCH="$1"
DEB="$2"

case "$ARCH" in
  amd64|ia64) ;;
  *) echo "Wrong architecture '$ARCH'. Expecting amd64 or ia64."
     exit 1;;
esac

if ! [ -e "$DEB" ]; then
  echo "$0: '$DEB': No such file or directory."
  exit 1
fi

# Some tools we need
RENAME="/usr/lib/ia32-libs-tools/mangle --arch $ARCH --rename"
if [ -x /usr/bin/dpkg-deb.real ]; then
  DPKG_DEB="/usr/bin/dpkg-deb.real"
else
  DPKG_DEB="/usr/bin/dpkg-deb"
fi

# Mangle dependecies for field $1
mangle_dep() {
  grep-dctrl "" -s"$1" -n DEBIAN/control | tr "," "\n" \
  | while read LINE; do
      echo "$LINE" | tr "|" "\n" \
      | while read PKG2 VER2; do
          echo " $($RENAME "$PKG2") $VER2 "
        done | tr '\n' '|' | sed 's/  / /g' | sed 's/ |$/,/'
    done | tr '\n' ',' | sed 's/ \(.*\),/\1\n/'
}

# Check for Debian or Ubuntu
if [ "$(lsb_release -s -i)" = "Debian" ]; then
  ROOT=emul/ia32-linux/
  ROOTL=emul_ia32-linux_
  SUFFIX=
  SUFFIXL=
else
  ROOT=./
  ROOTL=
  SUFFIX=32
  SUFFIXL=32
fi

# Convert package
##################

PKG="$(basename "$DEB" | cut -d_ -f1)"
PKG32="$($RENAME "$PKG")"

# Unpack old apckage
rm -rf "debian/$PKG32"
mkdir -p "debian/$PKG32"
"$DPKG_DEB" -x "$DEB" "debian/$PKG32"
"$DPKG_DEB" -e "$DEB" "debian/$PKG32/DEBIAN"

cd "debian/$PKG32"

# Mangle version
VER="$(grep-dctrl "" -n -s Version DEBIAN/control)"
NEWVER="$VER~@VERSION@"
SRCVERSION=$(cd ../.. && dpkg-parsechangelog | grep-dctrl "" -s Version -n)
case "$SRCVERSION" in
  (*+b*) NEWVER="${NEWVER}+b${SRCVERSION##*+b}"; SRCVERSION="${SRCVERSION%%+b*}";;
esac
sed -i "s/Version:.*/Version: $NEWVER/" DEBIAN/control

if [ -L "usr/share/doc/$PKG" ]; then
    # Change link name and target
    PKG2="$(readlink "usr/share/doc/$PKG")"
    rm "usr/share/doc/$PKG"
    NEWPKG2="$($RENAME "$PKG2")"
    ln -s "$NEWPKG2" "usr/share/doc/$PKG32"
    mkdir -p "usr/share/doc/$NEWPKG2"
    ( export EDITOR="/bin/true"; \
      export DEBEMAIL="nobody@noreply.org"; \
      export DEBFULLNAME="ia32-libs-tools"; \
      dch -b --preserve --create --changelog "t" --package "$PKG32" --newversion "$NEWVER" --distribution "unstable" "Automatic conversion from i386 by ia32-libs-tools (@VERSION@)")
      grep -v "Initial release" < t > "usr/share/doc/$NEWPKG2/changelog.ia32-libs-tools"
      rm t
else
  # Unpack changelog and add entry
  if [ -e "usr/share/doc/$PKG/changelog.Debian.gz" ]; then
    gunzip "usr/share/doc/$PKG/changelog.Debian.gz"
    CHANGELOG="usr/share/doc/$PKG/changelog.Debian"
  else
    if [ -e "usr/share/doc/$PKG/changelog.Debian" ]; then
      CHANGELOG="usr/share/doc/$PKG/changelog.Debian"
    else
      CHANGELOG="usr/share/doc/$PKG/changelog"
      if [ -e "usr/share/doc/$PKG/changelog.gz" ]; then
        gunzip "usr/share/doc/$PKG/changelog.gz"
      fi
    fi
  fi
  (
    export DEBFULLNAME="Debian ia32-libs Team"
    export DEBEMAIL="pkg-ia32-libs-maintainers@lists.alioth.debian.org"
    dch -b --preserve --multimaint --mainttrailer --newversion "$NEWVER" --changelog "$CHANGELOG" "Automatic conversion from i386 by ia32-libs-tools (@VERSION@)"
  )

  # Move doc dir
  if ! [ "$PKG" = "$PKG32" ]; then
    mv "usr/share/doc/$PKG" "usr/share/doc/$PKG32"
  fi
fi

# Rename package and source and change architecture
sed -i "s/Package: $PKG/Package: $PKG32/" DEBIAN/control
SRC=$(grep-dctrl "" -s Source -n DEBIAN/control | cut -d" " -f1)
if grep -q "^Source:" DEBIAN/control; then
  sed -i "s/Source:.*/Source: ia32-$SRC ($SRCVERSION)/" DEBIAN/control
else
  echo "Source: ia32-$PKG ($SRCVERSION)" >>DEBIAN/control
fi
sed -i "s/Architecture: .*$/Architecture: $ARCH/" DEBIAN/control

# Fix dependencies
for FIELD in Depends Pre-Depends Conflicts Suggests Recommends Replaces Provides;
 do
  sed -i -e "s/^$FIELD: .*$/$FIELD: `mangle_dep $FIELD`/" DEBIAN/control
done

# Things to do only if we rename the package
if ! [ "$PKG" = "$PKG32" ]; then
  # Add depend on 64bit package with exact version to keep both packages in sync
  if [ "$PKG" = "libc6" ] && [ "$ARCH" = "ia64" ]; then
    DEPPKG="libc6.1"
  else
    DEPPKG="$PKG"
  fi
  if grep -q "^Depends:" DEBIAN/control; then
    sed -i "s/Depends: /Depends: $DEPPKG (= $VER), /" DEBIAN/control
  else
    echo "Depends: $DEPPKG (= $VER)" >>DEBIAN/control
  fi

  # Replace older ia32-libs and ia32-libs-gtk
  if grep -q "^Replaces:" DEBIAN/control; then
    sed -i "s/Replaces: /Replaces: ia32-libs (<= 2.4), ia32-libs-gtk (<= 2.2), /" DEBIAN/control
  else
    echo "Replaces: ia32-libs (<= 2.4), ia32-libs-gtk (<= 2.2)" >>DEBIAN/control
  fi

  # Remove empty lines from DEBIAN/control
  grep -v "^$" < DEBIAN/control > DEBIAN/t
  mv DEBIAN/t DEBIAN/control

  # Rename lintian overrides
  if [ -e "usr/share/lintian/overrides/$PKG" ]; then
    mv "usr/share/lintian/overrides/$PKG" "usr/share/lintian/overrides/$PKG32"
  fi

  # Move libraries
  if [ -d lib ]; then
    mkdir -p "$ROOT"
    mv lib "${ROOT}lib${SUFFIX}"
  fi
  if [ -d usr/lib ]; then
    mkdir -p "${ROOT}usr"
    mv usr/lib "${ROOT}usr/lib${SUFFIX}"
  fi

  # Fix shlibs file
  if [ -r DEBIAN/shlibs ]; then
    while read LIB VER DEP; do
      # No udebs for converted packages
      if [ "$LIB" = "udeb:" ]; then continue; fi
      echo "$DEP" | tr "," "\n" \
      | while read PART; do
          echo "$PART" | tr "|" "\n" \
	  | while read PKG2 VER2; do
              echo " $($RENAME "$PKG2") $VER2 "
            done | tr '\n' '|' | sed "s/ |$/,/"
        done | sed "s/\(.*\),$/$LIB $VER\1\n/"
    done < DEBIAN/shlibs > t
    mv t DEBIAN/shlibs
  fi

  # Remove manpages, includes, binaries and locales, the 64bit deb has them
  rm -rf usr/share/man usr/include usr/bin usr/sbin bin sbin
  rm -rf usr/share/locale usr/share/doc-base
fi

# Check for hook
if [ -x "../$PKG.hook" ]; then
  "../$PKG.hook"
fi

if ! [ "$PKG" = "$PKG32" ]; then
  # Sanity check
  if [ -e etc ]; then
    echo >&2 "Warning: conffiles might conflict"
  fi
  if [ -e bin ]; then
    echo >&2 "Warning: package contains binaries in bin"
  fi
  if [ -e sbin ]; then
    echo >&2 "Warning: package contains binaries in sbin"
  fi
  if [ -e usr/bin ]; then
    echo >&2 "Warning: package contains binaries in usr/bin"
  fi
  if [ -e usr/sbin ]; then
    echo >&2 "Warning: package contains binaries in usr/sbin"
  fi
  if [ -e usr/share/man ]; then
    echo >&2 "Warning: manpages might conflict"
  fi
fi
