#!/bin/bash -p
#set -x
# Cloak a pip install as a Slackware build script

# Copyright 2017,2022 Duncan Roe, Melbourne, Australia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PIP=${PIP:-pip3}
if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi
TMP=${TMP:-/tmp/SBo}
OUTPUT=${OUTPUT:-/tmp}
PKGTYPE=${PKGTYPE:-tgz}
PKGPFX=${PKGPFX:-""}
CWD=$(pwd)

[ -z "$1" ] || { PACKAGE=$1; shift; }
[ "$PACKAGE" = -h -o "$PACKAGE" = --help ] && HELP=true || HELP=false
ARCHIVES=${ARCHIVES:-"*.tar.?z* *.zip *.tar"}
if [ -z "$PACKAGE" ]
then
  [ $(ls $ARCHIVES 2>/dev/null | wc -l) -gt 0 ] ||
    { echo 'No packages to install!'; exit 1; }
fi
PACKAGE=${PACKAGE:-$(ls -t $ARCHIVES 2>/dev/null | head -n1)}

! $HELP ||
{
  PRG=$(basename $0)
  echo
  echo "$PRG version 0.8"
  echo "Generate a Slackware package from a pip-installable package"
  echo "  usage: <OPTIONS> $PRG [package...]"
  echo "         With no argument, generate from most recently modified package"
  echo "         in CWD"
  echo "  The resulting package is located under $OUTPUT"
  echo "  possible OPTIONS are:"
  echo "    BUILD=<value>   (currently: $BUILD)"
  echo "    TAG=<value>     (currently: $TAG)"
  echo "    OUTPUT=<value>  (currently: $OUTPUT)"
  echo "    ARCH=<value>    (currently: $ARCH)"
  echo "    PIP=<value>     (currently: $PIP)"
  echo "    PKGTYPE=<value> (currently: $PKGTYPE)"
  echo "    PKGPFX=<value>  (currently: $PKGPFX)"

  exit
}

while true
do
  # If PACKAGE was not originally specified as an absolute path,
  # now make it into one
  [ $(echo $PACKAGE | cut -c1) = / ] || PACKAGE=$CWD/$PACKAGE

  [ $(echo $PACKAGE | rev | cut -f1 -d.) = piz ] && USE_ZIP=true ||
    USE_ZIP=false
  PRGNAM=$(echo $PACKAGE | rev | cut -f1 -d/ | cut -f2- -d- | rev)
  if $USE_ZIP; then
    VERSION=$(unzip -l $PACKAGE | head -n 4 | tail -n 1 | awk '{print $4}' |
      cut -f1 -d/ | rev | cut -f1 -d- | rev)
  else
    VERSION=$(tar tf $PACKAGE | head -n1 | rev | cut -f1 -d- | rev |
      cut -f1 -d/)
  fi
  PKGNAM=$PKGPFX$PRGNAM

  PKG=$TMP/package-$PKGNAM

  set -e

  rm -rf $PKG
  mkdir -p $TMP $PKG $OUTPUT
  $PIP install --root $PKG --no-deps --ignore-installed  \
    --no-warn-script-location $PACKAGE

  # From now on, we want simple name of pip
  PIP=$(basename $PIP)

  # pip doesn't install documentation, so we have to
  cd $TMP
  rm -rf $PRGNAM-$VERSION
  if $USE_ZIP; then
    unzip $PACKAGE
  else
    tar xvf $PACKAGE
  fi
  cd $PRGNAM-$VERSION
  chown -R root:root .
  find -L . \
   \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
    -o -perm 511 \) -exec chmod 755 {} \; -o \
   \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
    -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;

  mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
  cp -a setup.py $PKG/usr/doc/$PKGNAM-$VERSION
  for i in CHANGES* LICENSE* README* PKG-INFO* *.txt *.info; do
    mv $i $PKG/usr/doc/$PKGNAM-$VERSION 2>/dev/null || true
  done
  for i in examples documentation doc docs; do
    [ ! -d $i ] || mv $i $PKG/usr/doc/$PKGNAM-$VERSION
  done

  mkdir -p $PKG/install
  cat > $PKG/install/slack-desc <<////
$PKGNAM: $PKGNAM (installed by $PIP)
$PKGNAM:
$PKGNAM: See /usr/doc/$PKGNAM-$VERSION/*
$PKGNAM: for more information
$PKGNAM:
$PKGNAM:
$PKGNAM:
$PRGNAM:
$PRGNAM:
$PRGNAM:
$PRGNAM:
////

  cd $PKG
  /sbin/makepkg -l y -c n $OUTPUT/$PKGNAM-$VERSION-$ARCH-${BUILD}_$PIP$TAG.$PKGTYPE

  [ $# -ne 0 ] || exit 0
  PACKAGE=$1
  shift
  cd $CWD
  set +e
done
