#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# Removes compiled or generated artifacts. Should be used before switching branches
# between releases. In addition must be used before switching from a toolchain enabled
# branch to a non-toolchain branch due to caching in CMake generated files.

set -euo pipefail
trap 'echo Error in $0 at line $LINENO: $(cd "'$PWD'" && awk "NR == $LINENO" $0)' ERR

# If the project was never build, no Makefile will exist and thus make clean will fail.
# Combine the make command with the bash noop to always return true.
"${MAKE_CMD:-make}" clean || :

# clean the external data source project
pushd ${IMPALA_HOME}/ext-data-source
rm -rf api/generated-sources/*
${IMPALA_HOME}/bin/mvn-quiet.sh clean
popd

# clean fe
# don't use git clean because we need to retain Eclipse conf files
pushd $IMPALA_FE_DIR
rm -rf target
rm -f src/test/resources/{core,hbase,hive}-site.xml
rm -rf generated-sources/*
[ -z "$IMPALA_LOGS_DIR" ] || rm -rf "${IMPALA_LOGS_DIR}"/*
mkdir -p $IMPALA_ALL_LOGS_DIRS
popd

# clean be
pushd "$IMPALA_HOME/be"
# remove everything listed in .gitignore
git rev-parse 2>/dev/null && git clean -Xdfq
popd

# clean shell build artifacts
pushd "$IMPALA_HOME/shell"
# remove everything listed in .gitignore
git rev-parse 2>/dev/null && git clean -Xdfq
popd

# Clean stale .pyc, .pyo files and __pycache__ directories.
pushd "${IMPALA_HOME}"
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
popd

# clean llvm
rm -f "$IMPALA_HOME/llvm-ir/"impala*.ll
rm -f "$IMPALA_HOME/be/generated-sources/impala-ir/"*

# Cleanup Impala-lzo
if [ -e "$IMPALA_LZO" ]; then
  pushd "$IMPALA_LZO"
  git rev-parse 2>/dev/null && git clean -fdx
  popd
fi

# When switching to and from toolchain, make sure to remove all CMake generated files
ROOT_DIR=${IMPALA_HOME%%/}
for loc in "${ROOT_DIR}/ -maxdepth 1" "$ROOT_DIR/be/" "$ROOT_DIR/fe/" "$ROOT_DIR/common/"\
           "$ROOT_DIR/ext-data-source/"; do
  find $loc \( -iname CMakeCache.txt -o -iname CMakeFiles \
       -o -iname CTestTestfile.cmake -o -iname cmake_install.cmake \) -exec rm -Rf {} +
done
