#!/bin/bash
# Copyright 2015, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

set -ex

# change to root directory
cd "$(dirname "${0}")/../.."

DIRS=(
    'src/python'
)
EXCLUSIONS=(
    'grpcio/grpc_*.py'
    'grpcio_health_checking/grpc_*.py'
    'grpcio_reflection/grpc_*.py'
    'grpcio_tests/grpc_*.py'
)

VIRTUALENV=yapf_virtual_environment

virtualenv $VIRTUALENV
PYTHON=$(realpath "${VIRTUALENV}/bin/python")
$PYTHON -m pip install --upgrade pip
$PYTHON -m pip install --upgrade futures
$PYTHON -m pip install yapf==0.16.0

yapf() {
    local exclusion exclusion_args=()
    for exclusion in "${EXCLUSIONS[@]}"; do
        exclusion_args+=( "--exclude" "$1/${exclusion}" )
    done
    $PYTHON -m yapf -i -r --style=setup.cfg -p "${exclusion_args[@]}" "${1}"
}

if [[ -z "${TEST}" ]]; then
    for dir in "${DIRS[@]}"; do
	yapf "${dir}"
    done
else
    ok=yes
    for dir in "${DIRS[@]}"; do
	tempdir=$(mktemp -d)
	cp -RT "${dir}" "${tempdir}"
	yapf "${tempdir}"
	diff -ru "${dir}" "${tempdir}" || ok=no
	rm -rf "${tempdir}"
    done
    if [[ ${ok} == no ]]; then
	false
    fi
fi
