#!/bin/bash
# Copyright 2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# Author: Ulrich Müller <ulm@gentoo.org>

refname=$1
oldrev=$2
newrev=$3

# Filenames must contain only the characters [A-Za-z0-9._+-] and must
# not begin with a dot, a hyphen, or a plus sign.
# https://devmanual.gentoo.org/general-concepts/tree/#what-belongs-in-the-tree%3F
# https://devmanual.gentoo.org/ebuild-writing/file-format/#file-naming-rules
LC_ALL=C
regex='^([A-Za-z0-9_][A-Za-z0-9._+-]*/)*[A-Za-z0-9_][A-Za-z0-9._+-]*$'
exceptions=(
    .gitignore
    metadata/.gitignore
)

git diff -z --name-only --diff-filter=ACR "${oldrev}" "${newrev}" \
    | while read -r -d $'\0' path
do
    if ! [[ ${path} =~ ${regex} ]]; then
        for e in "${exceptions[@]}"; do
            [[ ${path} = "${e}" ]] && continue 2
        done
        echo "Path \"${path}\" violates file naming rules" >&2
        exit 1  # Note: this exits the loop's subshell
    fi
done
