#!/bin/sh
# uncomment the following line on NT (change the path as needed) and move
# it to the first line of this file.
#!c:/appls/mksnt/mksnt/sh

#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
# 
# The contents of this file are subject to the Mozilla Public License Version 
# 1.1 (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.mozilla.org/MPL/
# 
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
# 
# The Original Code is mozilla.org code.
# 
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1996-2003
# the Initial Developer. All Rights Reserved.
# 
# Contributor(s):
#	Mark Smith <MarkCSmithWork@aol.com>
# 
# Alternatively, the contents of this file may be used under the terms of
# either of the GNU General Public License Version 2 or later (the "GPL"),
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
# 
# ***** END LICENSE BLOCK ***** 

#
# cvslb:  'cvs log' filtered to only show revisions on the current branch
#
# usage: cvslb [-l count] [-b branch] [files...]
#   where count is the maximum number of revisions to display.
#   and branch specifies a branch to focus on (instead of the current one).
#      (use -b TRUNK to see changes made on the trunk).
# options can also be passed in the CVSLBOPTIONS environment variable.
#

PROG=`basename $0`
USAGE="$0 [-v] [ -l count ] [ -b branch ] [ file... ]"
SEP="=============================================================================="
REVLIMIT=0
BRANCH=""
VERBOSE=0


# process arguments
set -- `getopt vb:l: $CVSLBOPTIONS $*`
if [ $? != 0 ]; then
   echo $USAGE
   exit 2
fi

for i in $*; do
    case $i in
       -l) REVLIMIT=$2; shift 2;;
       -b) BRANCH=$2; shift 2;;
       -v) VERBOSE=`expr $VERBOSE + 1`; shift;;
       --) shift; break;;
   esac
done

if [ $# -eq 0 ]; then
    FILES=*
else
    FILES=$*
fi

for FN in $FILES; do
    if [ -d $FN ]; then
	echo "$PROG: Skipping directory $FN..."
    else
	if [ -z "$BRANCH" ]; then
	    LINE=`cvs -n stat $FN | grep 'Sticky Tag:'`
	    RC=$?
	    if [ $RC != 0 ]; then
		echo "$PROG: skipping $FN (cvs stat failed or no sticky tag)..."
		continue
	    fi

	    CURTAG=`echo $LINE | awk '{print $3}'`
	    if [ $CURTAG = "(none)" ]; then
		    CURTAG="";
	    fi
	else
	    if [ $BRANCH = "TRUNK" ]; then
		CURTAG=""
	    else
		CURTAG=$BRANCH
	    fi
	fi

	if [ -z "$CURTAG" ]; then
		DISPLAY_CURTAG="the trunk";
	else
		DISPLAY_CURTAG="$CURTAG";
	fi

	if [ $VERBOSE -gt 0 ]; then
	    echo $FN: current revision: $DISPLAY_CURTAG
	fi

	cvs -n log $FN | awk '
	BEGIN			{
	    echoing = 1;
	    no_more = 0;
	}
	/^symbolic names:/	{
	    looking_for_branch = 1;
	    echoing = 0;
	    next;
	}
	/^description:/	{
	    print;
	    echoing = 1;
	    if ( revlimit > 0 ) {
		printf( "Displaying at most %d revisions from %s:\n", \
			revlimit, display_curtag );
	    } else {
		printf( "Displaying all revisions from %s:\n", display_curtag );
	    }
	    next;
	}
	/^========================================================/ {
	    next;
	}
	/^total revisions:/	{
	    if ( looking_for_branch ) {
		if ( curtag == "" ) {
		    looking_for_branch = 0;
		} else {
		    printf( "This file not on branch %s (?)\n", display_curtag );
		    exit;
		}
	    }
	}
	/^revision [0-9]*\.[0-9]*$/ {
	    found_rev = 0;
	    if ( !no_more && !looking_for_branch && curtag == "" ) {
		if ( revlimit > 0 && --revlimit <= 0 ) {
		    no_more = 1;
		}
		print;
		echoing = 1;
	    } else {
		echoing = 0;
	    }
	    next;
	}
	/^revision [0-9]/	{
	    found_rev = 0;
	    if ( !no_more && !looking_for_branch ) {
		 if ( length( $2 ) > numerictaglen &&		\
			substr( $2, 1, numerictaglen ) == numerictag &&	\
			index( substr( $2, numerictaglen + 1 ), "." ) == 0 ) {
		    found_rev = 1;
		}
	    }
	    if ( found_rev ) {
		if ( revlimit > 0 && --revlimit <= 0 ) {
		    no_more = 1;
		}
		print;
		echoing = 1;
	    } else {
		echoing = 0;
	    }
	    next;
	}
	/	.*: [0-9]/	{
	    tag = substr( $1, 1, length( $1 ) - 1 );
	    if ( looking_for_branch && tag == curtag ) {
		print;
		count = split($2,digits,".");
		numerictag="";
		zero_suppressed = 0;
		for ( i = 1; i <= count; ++i ) {
		    if ( !zero_suppressed && digits[i] == "0" ) {
			zero_suppressed = 1;
		    } else {
			numerictag = numerictag digits[i] ".";
		    }
		}
		numerictaglen = length( numerictag );
		looking_for_branch = 0;
#		printf( "got branch: %s ($2 was %s)\n", numerictag, $2 );
	    } else if ( echoing ) {
		print;
	    }
	    next;
	 }
	/.*/			{
	    if ( echoing ) {
		print;
	    }
	    next;
	}
	' curtag="$CURTAG" display_curtag="$DISPLAY_CURTAG" revlimit="$REVLIMIT"
	echo $SEP
    fi
done

exit 0
