#!/bin/bash
#
# Copyright 2015 The Bazel Authors. All rights reserved.
#
# 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.

# Find all the debian dependencies of a series of debian package,
# using a docker instance as base image. Just run the script to see its
# usage.

function get_transitive_deps() {
  local deps="$*"
  local transitive_deps="$(apt-cache depends -i $deps | grep 'Depends: ' | cut -d ':' -f 2)"
  (echo "$deps"; echo "$transitive_deps") | tr ' ' '\n' | grep -v '^<' | sort -u
}

function list_dependencies() {
  local deps="${1//,/ }"
  local parent_deps="${2-}"
  local transitive="$(get_transitive_deps $deps)"
  while [ "$transitive" != "$deps" ]; do
    deps="$transitive"
    transitive="$(get_transitive_deps $deps)"
  done

  # Strip out already present dependencies
  for dep in $transitive; do
    if ! [[ "$parent_deps" =~ (^| )$dep( |$) ]]; then
      echo -n "$dep "
    fi
  done
}

function get_package_info() {
  apt-cache show $2 | grep '^'$1':' | head -1 | cut -d ':' -f 2 | xargs
}

function generate_workspace_dep() {
  local package=$1
  local sha256=$(get_package_info 'SHA256' $package)
  local file=$(get_package_info 'Filename' $package)
  echo "        [\"${package}\", \"${file}\", \"${sha256}\"],"
}

function generate_list() {
  local rule_name=$1
  local loaded_packages="${2//,/ }"
  shift 1
  echo "    '${rule_name}': ["
  for i in "$@"; do
    generate_workspace_dep $i
  done
  cat <<EOF
    ],
EOF
}


if (( $# < 2 )); then
  echo "Usage: $0 [docker:image] rule_name package1,...,packageN [rule2:parent_rule package1,...,packageN]*" >&2
  echo "If docker:image is specified then image is interpreted as the name of" >&2
  echo "a docker image to run this script within. If it is not specified, then" >&2
  echo "this script runs the debian package search on this machine it is invoked." >&2
  echo "Additional image based on the generated image can be generatex by using the rule2:parent_rule syntax." >&2
  exit 1
fi

if [[ "$1" =~ ^docker:(.*)$ ]]; then
  # Run inside docker
  shift 1
  script_dir="$(cd $(dirname ${BASH_SOURCE[0]}) && pwd -P)"
  docker run --rm -v "${script_dir}":/opt "${BASH_REMATCH[1]}" /bin/bash "/opt/$(basename "${BASH_SOURCE[0]}")" "$@"
  exit $?
fi

apt-get update &>/dev/null
echo "# Generated by $0 $*"
echo
echo "DEBS = {"
while (( $# > 1 )); do
  rule_name=${1%%:*}
  parent_rule=${1##*:}
  deps="$2"
  shift 2
  parent_deps=""
  if [[ -n "$parent_rule" ]]; then
    parent="DEPS_${parent_rule//-/_}"
    parent_deps="${!parent}"
  fi
  deps=$(list_dependencies "$deps" "$parent_deps")
  echo "    # Dependencies for ${rule_name}."
  eval "DEPS_${rule_name//-/_}='$deps $parent_deps'"
  generate_list $rule_name $deps
done
echo "}"
