#!/bin/bash

# Author: Martin Jansa <martin.jansa@gmail.com>
#
# Copyright (c) 2013 Martin Jansa <Martin.Jansa@gmail.com>

# Used to detect missing dependencies or automagically
# enabled dependencies which aren't explicitly enabled
# or disabled. Using bash to have PIPESTATUS variable.

# It does 3 builds of <target>
# 1st to populate sstate-cache directory and sysroot
# 2nd to rebuild each recipe with every possible
#     dependency found in sysroot (which stays populated
#     from 1st build
# 3rd to rebuild each recipe only with dependencies defined
#     in DEPENDS
# 4th (optional) repeat build like 3rd to make sure that
#     minimal versions of dependencies defined in DEPENDS
#     is also enough

# Global vars
tmpdir=
targets=
recipes=
buildhistory=
buildtype=
default_targets="world"
default_buildhistory="buildhistory"
default_buildtype="1 2 3 c"

usage () {
  cat << EOF
Welcome to utility to detect missing or autoenabled dependencies.
WARNING: this utility will completely remove your tmpdir (make sure
         you don't have important buildhistory or persistent dir there).
$0 <OPTION>

Options:
  -h, --help
        Display this help and exit.

  --tmpdir=<tmpdir>
        Specify tmpdir, will use the environment variable TMPDIR if it is not specified.
        Something like /OE/oe-core/tmp-eglibc (no / at the end).

  --targets=<targets>
        List of targets separated by space, will use the environment variable TARGETS if it is not specified.
        It will run "bitbake <targets>" to populate sysroots.
        Default value is "world".

  --recipes=<recipes>
        File with list of recipes we want to rebuild with minimal and maximal sysroot.
        Will use the environment variable RECIPES if it is not specified.
        Default value will use all packages ever recorded in buildhistory directory.

  --buildhistory=<buildhistory>
        Path to buildhistory directory, it needs to be enabled in your config,
        because it's used to detect different dependencies and to create list
        of recipes to rebuild when it's not specified.
        Will use the environment variable BUILDHISTORY if it is not specified.
        Default value is "buildhistory"

  --buildtype=<buildtype>
        There are 4 types of build:
          1: build to populate sstate-cache directory and sysroot
          2: build to rebuild each recipe with every possible dep
          3: build to rebuild each recipe with minimal dependencies
          4: build to rebuild each recipe again with minimal dependencies
          c: compare buildhistory directories from build 2 and 3
        Will use the environment variable BUILDTYPE if it is not specified.
        Default value is "1 2 3 c", order is important, type 4 is optional.
EOF
}

# Print error information and exit.
echo_error () {
  echo "ERROR: $1" >&2
  exit 1
}

while [ -n "$1" ]; do
  case $1 in
    --tmpdir=*)
      tmpdir=`echo $1 | sed -e 's#^--tmpdir=##' | xargs readlink -e`
      [ -d "$tmpdir" ] || echo_error "Invalid argument to --tmpdir"
      shift
        ;;
    --targets=*)
      targets=`echo $1 | sed -e 's#^--targets="*\([^"]*\)"*#\1#'`
      shift
        ;;
    --recipes=*)
      recipes=`echo $1 | sed -e 's#^--recipes="*\([^"]*\)"*#\1#'`
      shift
        ;;
    --buildhistory=*)
      buildhistory=`echo $1 | sed -e 's#^--buildhistory="*\([^"]*\)"*#\1#'`
      shift
        ;;
    --buildtype=*)
      buildtype=`echo $1 | sed -e 's#^--buildtype="*\([^"]*\)"*#\1#'`
      shift
        ;;
    --help|-h)
      usage
      exit 0
        ;;
    *)
      echo "Invalid arguments $*"
      echo_error "Try '$0 -h' for more information."
        ;;
  esac
done

# tmpdir directory, use environment variable TMPDIR
# if it was not specified, otherwise, error.
[ -n "$tmpdir" ] || tmpdir=$TMPDIR
[ -n "$tmpdir" ] || echo_error "No tmpdir found!"
[ -d "$tmpdir" ] || echo_error "Invalid tmpdir \"$tmpdir\""
[ -n "$targets" ] || targets=$TARGETS
[ -n "$targets" ] || targets=$default_targets
[ -n "$recipes" ] || recipes=$RECIPES
[ -n "$recipes" -a ! -f "$recipes" ] && echo_error "Invalid file with list of recipes to rebuild"
[ -n "$recipes" ] || echo "All packages ever recorded in buildhistory directory will be rebuilt"
[ -n "$buildhistory" ] || buildhistory=$BUILDHISTORY
[ -n "$buildhistory" ] || buildhistory=$default_buildhistory
[ -d "$buildhistory" ] || echo_error "Invalid buildhistory directory \"$buildhistory\""
[ -n "$buildtype" ] || buildtype=$BUILDTYPE
[ -n "$buildtype" ] || buildtype=$default_buildtype
echo "$buildtype" | grep -v '^[1234c ]*$' && echo_error "Invalid buildtype \"$buildtype\", only some combination of 1, 2, 3, 4, c separated by space is allowed"

OUTPUT_BASE=test-dependencies/`date "+%s"`
declare -i RESULT=0

build_all() {
  echo "===== 1st build to populate sstate-cache directory and sysroot ====="
  OUTPUT1=${OUTPUT_BASE}/${TYPE}_all
  mkdir -p ${OUTPUT1}
  echo "Logs will be stored in ${OUTPUT1} directory"
  bitbake -k $targets 2>&1 | tee -a ${OUTPUT1}/complete.log
  RESULT+=${PIPESTATUS[0]}
  grep "ERROR: Task.*failed" ${OUTPUT1}/complete.log > ${OUTPUT1}/failed-tasks.log
  cat ${OUTPUT1}/failed-tasks.log | sed 's@.*/@@g; s@_.*@@g; s@\.bb, .*@@g; s@\.bb;.*@@g' | sort -u > ${OUTPUT1}/failed-recipes.log
}

build_every_recipe() {
  if [ "${TYPE}" = "2" ] ; then
    echo "===== 2nd build to rebuild each recipe with every possible dep ====="
    OUTPUT_MAX=${OUTPUT_BASE}/${TYPE}_max
    OUTPUTB=${OUTPUT_MAX}
  else
    echo "===== 3rd or 4th build to rebuild each recipe with minimal dependencies ====="
    OUTPUT_MIN=${OUTPUT_BASE}/${TYPE}_min
    OUTPUTB=${OUTPUT_MIN}
  fi

  mkdir -p ${OUTPUTB} ${OUTPUTB}/failed ${OUTPUTB}/ok
  echo "Logs will be stored in ${OUTPUTB} directory"
  if [ -z "$recipes" ]; then
    ls -d $buildhistory/packages/*/* | xargs -n 1 basename | sort -u > ${OUTPUTB}/recipe.list
    recipes=${OUTPUTB}/recipe.list
  fi
  if [ "${TYPE}" != "2" ] ; then
    echo "!!!Removing tmpdir \"$tmpdir\"!!!"
    rm -rf $tmpdir/deploy $tmpdir/pkgdata $tmpdir/sstate-control $tmpdir/stamps $tmpdir/sysroots $tmpdir/work $tmpdir/work-shared 2>/dev/null
  fi
  i=1
  count=`cat $recipes ${OUTPUT1}/failed-recipes.log | sort -u | wc -l`
  for recipe in `cat $recipes ${OUTPUT1}/failed-recipes.log | sort -u`; do
    echo "Building recipe: ${recipe} ($i/$count)"
    declare -i RECIPE_RESULT=0
    bitbake -c cleansstate ${recipe} > ${OUTPUTB}/${recipe}.log 2>&1;
    RECIPE_RESULT+=$?
    bitbake ${recipe} >> ${OUTPUTB}/${recipe}.log 2>&1;
    RECIPE_RESULT+=$?
    if [ "${RECIPE_RESULT}" != "0" ] ; then
      RESULT+=${RECIPE_RESULT}
      mv ${OUTPUTB}/${recipe}.log ${OUTPUTB}/failed/
      grep "ERROR: Task.*failed"  ${OUTPUTB}/failed/${recipe}.log | tee -a ${OUTPUTB}/failed-tasks.log
      grep "ERROR: Task.*failed"  ${OUTPUTB}/failed/${recipe}.log | sed 's@.*/@@g; s@_.*@@g; s@\.bb, .*@@g; s@\.bb;.*@@g' >> ${OUTPUTB}/failed-recipes.log
      # and append also ${recipe} in case the failed task was from some dependency
      echo ${recipe} >> ${OUTPUTB}/failed-recipes.log
    else
      mv ${OUTPUTB}/${recipe}.log ${OUTPUTB}/ok/
    fi
    if [ "${TYPE}" != "2" ] ; then
      rm -rf $tmpdir/deploy $tmpdir/pkgdata $tmpdir/sstate-control $tmpdir/stamps $tmpdir/sysroots $tmpdir/work $tmpdir/work-shared 2>/dev/null
    fi
    i=`expr $i + 1`
  done
  echo "Copying buildhistory/packages to ${OUTPUTB}"
  cp -ra $buildhistory/packages ${OUTPUTB}
  # This will be usefull to see which library is pulling new dependency
  echo "Copying do_package logs to ${OUTPUTB}/do_package/"
  mkdir ${OUTPUTB}/do_package
  find $tmpdir/work/ -name log.do_package 2>/dev/null| while read f; do
    # pn is 3 levels back, but we don't know if there is just one log per pn (only one arch and version)
    # dest=`echo $f | sed 's#^.*/\([^/]*\)/\([^/]*\)/\([^/]*\)/log.do_package#\1#g'`
    dest=`echo $f | sed "s#$tmpdir/work/##g; s#/#_#g"`
    cp $f ${OUTPUTB}/do_package/$dest
  done
}

compare_deps() {
  # you can run just compare task with command like this
  # OUTPUT_BASE=test-dependencies/1373140172 \
  # OUTPUT_MAX=${OUTPUT_BASE}/2_max \
  # OUTPUT_MIN=${OUTPUT_BASE}/3_min \
  # openembedded-core/scripts/test-dependencies.sh --tmpdir=tmp-eglibc --targets=glib-2.0 --recipes=recipe_list --buildtype=c
  echo "===== Compare dependencies recorded in \"${OUTPUT_MAX}\" and \"${OUTPUT_MIN}\" ====="
  [ -n "${OUTPUTC}" ] || OUTPUTC=${OUTPUT_BASE}/comp
  mkdir -p ${OUTPUTC}
  OUTPUT_FILE=${OUTPUTC}/dependency-changes
  echo "Differences will be stored in ${OUTPUT_FILE}, dot is shown for every 100 of checked packages"
  echo > ${OUTPUT_FILE}

  [ -d ${OUTPUT_MAX} ] || echo_error "Directory with output from build 2 \"${OUTPUT_MAX}\" does not exist"
  [ -d ${OUTPUT_MIN} ] || echo_error "Directory with output from build 3 \"${OUTPUT_MIN}\" does not exist"
  [ -d ${OUTPUT_MAX}/packages/ ] || echo_error "Directory with packages from build 2 \"${OUTPUT_MAX}/packages/\" does not exist"
  [ -d ${OUTPUT_MIN}/packages/ ] || echo_error "Directory with packages from build 3 \"${OUTPUT_MIN}/packages/\" does not exist"
  i=0
  find ${OUTPUT_MAX}/packages/ -name latest | sed "s#${OUTPUT_MAX}/##g" | while read pkg; do
    max_pkg=${OUTPUT_MAX}/${pkg}
    min_pkg=${OUTPUT_MIN}/${pkg}
    # pkg=packages/armv5te-oe-linux-gnueabi/libungif/libungif/latest
    recipe=`echo "${pkg}" | sed 's#packages/[^/]*/\([^/]*\)/\([^/]*\)/latest#\1#g'`
    package=`echo "${pkg}" | sed 's#packages/[^/]*/\([^/]*\)/\([^/]*\)/latest#\2#g'`
    if [ ! -f "${min_pkg}" ] ; then
      echo "ERROR: ${recipe}: ${package} package isn't created when building with minimal dependencies?" | tee -a ${OUTPUT_FILE}
      echo ${recipe} >> ${OUTPUTC}/failed-recipes.log
      continue
    fi
    # strip version information in parenthesis
    max_deps=`grep "^RDEPENDS = " ${max_pkg} | sed 's/^RDEPENDS = / /g; s/$/ /g; s/([^(]*)//g'`
    min_deps=`grep "^RDEPENDS = " ${min_pkg} | sed 's/^RDEPENDS = / /g; s/$/ /g; s/([^(]*)//g'`
    if [ "$i" = 100 ] ; then
      echo -n "." # cheap progressbar
      i=0
    fi
    if [ "${max_deps}" = "${min_deps}" ] ; then
      # it's annoying long, but at least it's showing some progress, warnings are grepped at the end
      echo "NOTE: ${recipe}: ${package} rdepends weren't changed" >> ${OUTPUT_FILE}
    else
      missing_deps=
      for dep in ${max_deps}; do
        if ! echo "${min_deps}" | grep -q " ${dep} " ; then
          missing_deps="${missing_deps} ${dep}"
          echo # to get rid of dots on last line
          echo "WARN: ${recipe}: ${package} rdepends on ${dep}, but it isn't a build dependency?" | tee -a ${OUTPUT_FILE}
        fi
      done
      if [ -n "${missing_deps}" ] ; then
        echo ${recipe} >> ${OUTPUTC}/failed-recipes.log
      fi
    fi
    i=`expr $i + 1`
  done
  echo # to get rid of dots on last line
  echo "Found differences: "
  grep "^WARN: " ${OUTPUT_FILE} | tee ${OUTPUT_FILE}.warn.log
  echo "Found errors: "
  grep "^ERROR: " ${OUTPUT_FILE} | tee ${OUTPUT_FILE}.error.log
  RESULT+=`cat ${OUTPUT_FILE}.warn.log | wc -l`
  RESULT+=`cat ${OUTPUT_FILE}.error.log | wc -l`
}

for TYPE in $buildtype; do
  case ${TYPE} in
    1) build_all;;
    2) build_every_recipe;;
    3) build_every_recipe;;
    4) build_every_recipe;;
    c) compare_deps;;
    *) echo_error "Invalid buildtype \"$TYPE\""
  esac
done

cat ${OUTPUT_BASE}/*/failed-recipes.log | sort -u >> ${OUTPUT_BASE}/failed-recipes.log

if [ "${RESULT}" != "0" ] ; then
  echo "ERROR: ${RESULT} issues were found in these recipes: `cat ${OUTPUT_BASE}/failed-recipes.log | xargs`"
fi

echo "INFO: Output written in: ${OUTPUT_BASE}"
exit ${RESULT}
