#!/bin/sh
#-*-mode:  sh -*-

# Copyright (c) 2007-2015, Aleksey Cheusov <vle@gmx.net>
# 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.
#
# 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
# HOLDER 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 -e

export LC_ALL=C

. pipestatus

############################################################
# user settable variables
: ${CKSUM:=cksum}

############################################################
usage (){
    cat 1>&2 <<EOF
cvs_checksum - analyses CVS files in the specified directories
               and outputs file checksums with a help of cksum(1)

usage:
  cvs_checksum [OPTIONS] [cvsdirs ...]
OPTIONS:
  -h       display this help message
  -l       list CVS files names with their revisions
           instead of their checksum
EOF
}

while getopts hl f; do
    case "$f" in
	h)    usage; exit 0;;
	l)    list_only=1;;
	?)    printf "Run cvs_checksum -h for details\n"; exit 2;;
    esac
done
shift `expr $OPTIND - 1`

if test "$list_only"; then
    for i in "$@"; do
	efn=$i/CVS/Entries
	if test -r "$efn"; then
	    awk -F/ -v d="$i" '$1 == "" {print d "/" $2, $3}' "$efn"

	    subdirs=`awk -F/ -v d="$i" '$1 == "D" && NF > 1 {print d "/" $2}' "$efn" `
	    $0 -l $subdirs
	fi
    done
else
    runpipe0 $0 -l "$@" '|' awk '{print $1}' '|' xargs $CKSUM '|' awk '{print $3, $1, $2}'
fi
