#!/bin/sh -e
# Separate tarball/patch build system by Adam Heath <doogie@debian.org>
# Modified by Ben Collins <bcollins@debian.org>
# Modified by Brian May <bam@debian.org>

FILE2CAT=/usr/share/dbs/file2cat

######################
# PARSE COMMAND LINE #
######################
usage () {
  echo "dbs-edit-patch, edit/create a dbs patch file" >&2
  echo "   usage: dbs-edit-patch [-t|--tmpdir t] [-s|--sourcedir s] [-p 1] patch" >&2
}

# stolen from /usr/bin/fakeroot, Debian potato version.
GETOPTEST=`getopt --version`
case $GETOPTEST in
getopt*) # GNU getopt
    TEMP=`getopt -n dbs-edit-patch -l help,tmpdir:,sourcedir:,strip: -- +ht:s:p: "$@"`
    ;;
*) # POSIX getopt ?
    TEMP=`getopt ht:s:p: "$@"`
    ;;
esac

if test "$?" != "0"
then
  echo "Terminating..." >&2
  exit 1
fi

TMP_DIR=$TMP
[ -z $tmpdir ] && tmpdir="/tmp"

STRIP=0
SOURCE_DIR=`pwd`
PATCH_DIR=$SOURCE_DIR/debian/patches

eval set -- "$TEMP"
while test "$1" != "--"; do
  case $1 in
    -p|--strip)
      shift;
      STRIP=$1;
      ;;
    -t|--tmpdir)
      shift;
      TMP_DIR=$1;
      ;;
    -s|--sourcedir)
      shift;
      SOURCE_DIR=$1;
      PATCH_DIR=$SOURCE_DIR/debian/patches
      ;;
    -h|--help)
      usage;
      exit 0
      ;;
  esac
  shift
done

shift

if [ $# -lt 1 ]
then
  usage
  exit 
fi

PATCH=$1; shift

# ENSURE PATCH DIRECTORY EXISTS (directory with patches)
if [ ! -d "$PATCH_DIR" ]
then 
  echo "Cannot find patch dir $PATCH_DIR" >&2
  exit 1
fi

# ENSURE TMP DIRECTORY EXISTS (where files to be edited will go)
if [ ! -d "$TMP_DIR" ]
then 
  echo "Cannot find directory $TMP_DIR" >&2
  exit 1
fi

if [ "$STRIP" != 1 -a "$STRIP" != 0 ]
then 
  echo "Invalid value for -p or --strip" >&2
  exit 1
fi

# CREATE DIRECTORY WITH SAME NAME AS PATCH FILE
OUT_DIR=$TMP_DIR/$PATCH
rm -rf $OUT_DIR
mkdir $OUT_DIR

if [ ! -d "$OUT_DIR" ]
then 
  echo "Cannot create directory $OUT_DIR" >&2
  exit 1
fi
  
# EXTRACT SOURCE FILES
for f in `find $SOURCE_DIR -type f -maxdepth 1 -name \*.tgz -o -name \*.tar.gz -o -name \*.tar.bz -o -name \*.tar.bz2 | sort`; do 
    file=`basename $f`
    echo -n "Extracting source $file ... "; 
    if $FILE2CAT $f | tar -C $OUT_DIR -xv > /dev/null; then 
      echo "successful." 
    else 
      echo "failed!"
      exit 1; 
    fi; 
done

case $STRIP in
  1)
    # DETERMINE DIRECTORY NAME (assume only one exists)
    for f in `find $OUT_DIR -type d -maxdepth 1`; do 
      DEST_DIR=$f
    done
    ;;

  0)
    DEST_DIR=$OUT_DIR
    ;;
esac

# APPLY PATCHES UP TO (and not including) $PATCH
done=
for f in `(echo $PATCH; cd $PATCH_DIR; find -type f ! -name 'chk-*') | sed s,'./',,g | sort`; do 
  if [ ! -z "$done" -o "$f" = "$PATCH" ]
  then
      done=1;
  else
    echo -n "Applying patch $f ... ";
    if $FILE2CAT $PATCH_DIR/$f |
	(cd $DEST_DIR;patch -p$STRIP --no-backup-if-mismatch) > /dev/null; then
	echo "successful."
    else
	echo "failed!"; 
	exit 1;
   fi;
 fi;
done; 

# MAKE COPY OF SOURCE
cat >> $OUT_DIR/dbs-update-patch <<EOF
#!/bin/sh
cd $OUT_DIR
find -name "*.bak" | xargs --no-run-if-empty rm
find -name "*~" | xargs --no-run-if-empty rm
EOF

for f in `find $OUT_DIR -type d -mindepth 1 -maxdepth 1`; do 
  file=`basename $f`
  echo -n "Copying $file to $file-old ... "; 
  cp -a $f $f-old
  echo "successful." 

  # CREATE SHELL SCRIPT TO UPDATE PATCH
  cat >> $OUT_DIR/dbs-update-patch <<EOF
diff -ruN $file-old $file > $PATCH_DIR/$PATCH
EOF
done

chmod +x $OUT_DIR/dbs-update-patch

# APPLY LAST PATCH
if [ -f $PATCH_DIR/$PATCH ]
then
  echo -n "Applying patch $PATCH ... ";
  if $FILE2CAT $PATCH_DIR/$PATCH |
	(cd $DEST_DIR;patch -p$STRIP --no-backup-if-mismatch) > /dev/null; then
	echo "successful."
  else
	echo "failed!"; 
	exit 1;
  fi;
else
    echo "Patch does not yet exist; will create a new patch $PATCH";
fi;



