#!/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
"${IMPALA_HOME}/bin/clean-cmake.sh"
