#!/bin/sh

# 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. 

DEFAULT_KEY="akarasulu@apache.org"

while :
do
 clear
 echo "S E L E C T   D E F A U L T   K E Y"
 echo '-----------------------------------'
 echo "1. akarasulu@apache.org"
 echo "2. elecharny@apache.org"
 echo "3. pamarcelot@apache.org"
 echo "4. Exit"
 echo -n 'Please enter option [1 - 4] > '
 read opt
case $opt in
1) echo "Using DEFAULT_KEY=akarasulu@apache.org";
   DEFAULT_KEY='akarasulu@apache.org';
   break;
;;
2) echo "Using DEFAULT_KEY=elecharny@apache.org";
   DEFAULT_KEY='elecharny@apache.org';
   break;
;;
3) echo "Using DEFAULT_KEY=pamarcelot@apache.org";
   DEFAULT_KEY='pamarcelot@apache.org';
   break;
;;
4) echo "Bye $USER";
   exit 1;;
*) echo "$opt is an invaild option. Please select option between 1-4 only";
    echo "Press [enter] key to continue. . .";
    read enterKey;;
esac
done

echo -n "PGP Key Password: "
stty -echo
read PASSWORD
stty echo
echo ""

for FILE in $(find . -not '(' -name "*.md5" -or -name "*.sha1" -or -name "*.asc" ')' -and -type f) ; do
        echo -n "Signing: $FILE ... "

        if [ ! -f $FILE.md5 ]; then
               md5sum "$FILE" | cut "-d " -f1 > "$FILE.md5"
        else
               echo "Skipping $FILE.md5"
        fi

        if [ ! -f $FILE.sha1 ]; then
                sha1sum "$FILE" | cut "-d " -f1 > "$FILE.sha1"
        else
                echo "Skipping $FILE.sha1"
        fi

        if [ ! -f $FILE.asc ]; then
                echo "$PASSWORD" | gpg --default-key "$DEFAULT_KEY" --detach-sign --armor --no-tty --yes --passphrase-fd 0 "$FILE" && echo done.
        else
                echo "Skipping $FILE.asc"
        fi
done

echo -n Updating permission...
chmod g+w -R . && echo done.

