gecko-dev/directory/tools/cvs-tools/cvslb

219 lines
5.5 KiB
Bash
Executable File

#!/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