#!/bin/bash
#
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#
# This script imports new versions of Bouncy Castle (http://bouncycastle.org) into the
# Android source tree.  To run, (1) fetch the appropriate tarball from the Bouncy Castle repository,
# (2) check the checksum, and then (3) run:
#   ./import_bouncycastle.sh bcprov-jdk*-*.tar.gz
#
# IMPORTANT: See README.android for additional details.

# turn on exit on error as well as a warning when it happens
set -e
trap  "echo WARNING: Exiting on non-zero subprocess exit code" ERR;

function die() {
  declare -r message=$1

  echo $message
  exit 1
}

function usage() {
  declare -r message=$1

  if [ ! "$message" = "" ]; then
    echo $message
  fi
  echo "Usage:"
  echo "  ./import_bouncycastle.sh import </path/to/bcprov-jdk*-*.tar.gz>"
  echo "  ./import_bouncycastle.sh regenerate <patch/*.patch>"
  echo "  ./import_bouncycastle.sh generate <patch/*.patch> </path/to/bcprov-jdk*-*.tar.gz>"
  exit 1
}

function main() {
  if [ ! -d patches ]; then
    die "Bouncy Castle patch directory patches/ not found"
  fi

  if [ ! -f bouncycastle.version ]; then
    die "bouncycastle.version not found"
  fi

  source bouncycastle.version
  if [ "$BOUNCYCASTLE_JDK" == "" -o "$BOUNCYCASTLE_VERSION" == "" ]; then
    die "Invalid bouncycastle.version; see README.android for more information"
  fi

  BOUNCYCASTLE_DIR=bcprov-jdk$BOUNCYCASTLE_JDK-$BOUNCYCASTLE_VERSION
  BOUNCYCASTLE_DIR_ORIG=$BOUNCYCASTLE_DIR.orig

  if [ ! -f bouncycastle.config ]; then
    die "bouncycastle.config not found"
  fi

  source bouncycastle.config
  if [ "$UNNEEDED_SOURCES" == "" -o "$NEEDED_SOURCES" == "" ]; then
    die "Invalid bouncycastle.config; see README.android for more information"
  fi

  declare -r command=$1
  shift || usage "No command specified. Try import, regenerate, or generate."
  if [ "$command" = "import" ]; then
    declare -r tar=$1
    shift || usage "No tar file specified."
    import $tar
  elif [ "$command" = "regenerate" ]; then
    declare -r patch=$1
    shift || usage "No patch file specified."
    [ -d $BOUNCYCASTLE_DIR ] || usage "$BOUNCYCASTLE_DIR not found, did you mean to use generate?"
    [ -d $BOUNCYCASTLE_DIR_ORIG ] || usage "$BOUNCYCASTLE_DIR_ORIG not found, did you mean to use generate?"
    regenerate $patch
  elif [ "$command" = "generate" ]; then
    declare -r patch=$1
    shift || usage "No patch file specified."
    declare -r tar=$1
    shift || usage "No tar file specified."
    generate $patch $tar
  else
    usage "Unknown command specified $command. Try import, regenerate, or generate."
  fi
}

function import() {
  declare -r BOUNCYCASTLE_SOURCE=$1

  untar $BOUNCYCASTLE_SOURCE
  applypatches

  cd $BOUNCYCASTLE_DIR

  sed 's/<p>/& <BR>/g' LICENSE.html | html2text -width 102 -nobs -ascii > ../NOTICE
  touch ../MODULE_LICENSE_BSD_LIKE

  cd ..

  rm -r src
  mkdir -p src/main/java/
  for i in $NEEDED_SOURCES; do
    echo "Updating $i"
    mv $BOUNCYCASTLE_DIR/$i src/main/java/
  done

  # if [ $BOUNCYCASTLE_VERSION -ge 145 ]; then
  #   # move test directories from src/main/java to src/test/java
  #   for from in `find src/main/java -name test`; do
  #     to=`dirname $from | sed s,src/main/java/,src/test/java/,`
  #     echo "Moving $from to $to"
  #     mkdir -p $to
  #     mv $from $to
  #   done
  # fi

  # # move stray test files from src/main/java to src/test/java
  # if [ $BOUNCYCASTLE_VERSION -ge 137 ]; then
  #   mkdir -p src/test/java/org/bouncycastle/util/
  #   echo "Moving src/main/java/org/bouncycastle/util tests"
  #   mv src/main/java/org/bouncycastle/util/*Test*.java src/test/java/org/bouncycastle/util/
  # fi

  cleantar
}

function regenerate() {
  declare -r patch=$1

  generatepatch $patch
}

function generate() {
  declare -r patch=$1
  declare -r BOUNCYCASTLE_SOURCE=$2

  untar $BOUNCYCASTLE_SOURCE
  applypatches

  # # restore stray test files from src/test/java back to src/main/java
  # if [ $BOUNCYCASTLE_VERSION -ge 137 ]; then
  #   echo "Restoring src/test/java/org/bouncycastle/util"
  #   mv src/test/java/org/bouncycastle/util/* src/main/java/org/bouncycastle/util/
  # fi

  # # restore test directories from src/test/java back to src/main/java
  # if [ $BOUNCYCASTLE_VERSION -ge 145 ]; then
  #   for from in `find src/test/java -name test`; do
  #     to=`dirname $from | sed s,src/test/java/,src/main/java/,`
  #     echo "Restoring $from to $to"
  #     mkdir -p $to
  #     mv $from $to
  #   done
  # fi

  for i in $NEEDED_SOURCES; do
    echo "Restoring $i"
    rm -r $BOUNCYCASTLE_DIR/$i
    cp -rf src/main/java/$i $BOUNCYCASTLE_DIR/$i
  done

  generatepatch $patch
  cleantar
}

function untar() {
  declare -r BOUNCYCASTLE_SOURCE=$1

  # Remove old source
  cleantar

  # Process new source
  tar -zxf $BOUNCYCASTLE_SOURCE
  mv $BOUNCYCASTLE_DIR $BOUNCYCASTLE_DIR_ORIG
  find $BOUNCYCASTLE_DIR_ORIG -type f -print0 | xargs -0 chmod a-w
  (cd $BOUNCYCASTLE_DIR_ORIG && unzip -q src.zip)
  tar -zxf $BOUNCYCASTLE_SOURCE
  (cd $BOUNCYCASTLE_DIR && unzip -q src.zip)

  # Prune unnecessary sources
  echo "Removing $UNNEEDED_SOURCES"
  (cd $BOUNCYCASTLE_DIR_ORIG && rm -rf $UNNEEDED_SOURCES)
  (cd $BOUNCYCASTLE_DIR      && rm -r  $UNNEEDED_SOURCES)
}

function cleantar() {
  rm -rf $BOUNCYCASTLE_DIR_ORIG
  rm -rf $BOUNCYCASTLE_DIR
}

function applypatches () {
  cd $BOUNCYCASTLE_DIR

  # Apply appropriate patches
  for i in $BOUNCYCASTLE_PATCHES; do
    echo "Applying patch $i"
    patch -p1 < ../patches/$i || die "Could not apply patches/$i. Fix source and run: $0 regenerate patches/$i"

    # make sure no UNNEEDED_SOURCES got into the patch
    problem=0
    for s in $UNNEEDED_SOURCES; do
      if [ -e $s ]; then
        echo Unneeded source $s restored by patch $i
        problem=1
      fi
    done
    if [ $problem = 1 ]; then
      exit 1
    fi
  done

  # Cleanup patch output
  find . -type f -name "*.orig" -print0 | xargs -0 rm -f

  cd ..
}

function generatepatch() {
  declare -r patch=$1

  # Cleanup stray files before generating patch
  find $BOUNCYCASTLE_DIR -type f -name "*.orig" -print0 | xargs -0 rm -f
  find $BOUNCYCASTLE_DIR -type f -name "*~" -print0 | xargs -0 rm -f

  rm -f $patch
  LC_ALL=C TZ=UTC0 diff -Naur $BOUNCYCASTLE_DIR_ORIG $BOUNCYCASTLE_DIR >> $patch && die "ERROR: No diff for patch $path in file $i"
  echo "Generated patch $patch"
}

main $@
