#
#		 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.
#
#!/usr/bin/env bash
LC_ALL=C
shopt -s nocasematch

MESSAGE_FILE=$1
MESSAGE="$(cat $MESSAGE_FILE)"
LOCAL_BRANCH="$(git rev-parse --abbrev-ref HEAD)"

if [[ $LOCAL_BRANCH != "master" ]] || [[ "$MESSAGE" =~ (sling\-|minor:) ]]; then
    echo "[POLICY] Your message is formatted correctly"
else 
    echo "[POLICY] Your message is not formatted correctly, please include Minor: or an issue number"
    exit 1
fi

exit 0