#!/bin/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.
#

# Redirect output to stderr.
exec 1>&2
test $SKIP_UNCRUSTIFY && exit 0

if [[ "$(uncrustify --version | cut -d' ' -f2)" != 0.60 ]]; then
  echo "Please install version 0.60 of uncrustify."
  exit 1
fi

RET=0
files=$(bin/uncrustify.sh --filter $(git diff --cached --name-only))
MSGS=
for file in $files; do
    if ! bin/uncrustify.sh --check-file $file; then
        MSGS="$MSGS
    bin/uncrustify.sh \"$file\" && git add \"$file\""
        RET=1
    fi
done

if [[ $RET = 1 ]]; then
    echo "Commit aborted because style fix-ups are required."
    echo "Please run:$MSGS"
    echo "Alternatively, run \"$PWD/bin/uncrustify.sh --staged\" and then re-stage affected files."
fi

exit $RET

