mISDN/stddiff

207 lines
4.1 KiB
Bash
Executable File

#!/bin/sh
KERNELDIR=/lib/modules/$(uname -r)/build
KERNFIRST=false
PREPARSER="./preparser"
DODIFF=dodiff
UNIQUE=false
dodiff() {
if $KERNFIRST ; then
diff -u $EXTRAOPT $2 $1
else
diff -u $EXTRAOPT $1 $2
fi
}
dodiffuni() {
echo -n "Processing $1 ... "
TMPNAME=/tmp/`basename $1`.$$
$PREPARSER -c $CTRLNAME $1 $TMPNAME
RES=$?
if [ "$RES" -eq "0" ] ; then
echo diff original
dodiff $1 $2
rm $TMPNAME
return 0
fi
if [ "$RES" -eq "2" ] ; then
echo diff modified
dodiff $TMPNAME $2
rm $TMPNAME
return 0
fi
echo "problem with $PREPARSER retcode $RES"
exit 1
}
#
# Print usage and exit
#
usage() {
cat<<EOM
stddiff is used for generating diffs of the cvs-tree
versus the kernel-tree.
stddiff [-r] [-h] [-k DIR] [-u] [-c FILE] [-w] [files ...]
Options:
-h This Text.
-r Reverse direction (kernel versus cvs).
-k DIR Kerneltree is in DIR instead of /usr/src/linux
-u Make a diff for a unique kernel-tree
(preprocessing with $PREPARSER)
-c FILE Use FILE as control file for $PREPARSER (only with -u)
-w Ignore white space when comparing lines
Without any files given, within the whole tree, the "right"
files are diffed. When any files are given in the commandline,
only those are diffed.
EOM
exit
}
#
# Check, if argument is a linux kernel dir
#
checkkernel() {
if [ -f $1/Makefile ] ; then
# if [ "`grep ^vmlinux: $1/Makefile | grep vmlinux`" != "" ] ; then
return 0
# fi
fi
echo "The given argument does not look like a kernel dir"
exit 1
}
#
# Determine a control file name
#
calc_ctrl_file() {
eval `sed -n 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' $KERNELDIR/Makefile`
echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL"
if [ -z "$CTRLNAME" ] ; then
CTRLNAME=v$VERSION.$PATCHLEVEL.$SUBLEVEL.ctrl
if [ -f $CTRLNAME ] ; then
return 0
fi
CTRLNAME=v$VERSION.$PATCHLEVEL.ctrl
if [ -f $CTRLNAME ] ; then
return 0
fi
CTRLNAME=default.ctrl
fi
if [ -f $CTRLNAME ] ; then
return 0
fi
echo "No control file found"
exit 1
}
#
# Determine a version depend file name
#
calc_version_file() {
VERSION_NAME=$1.v$VERSION.$PATCHLEVEL.$SUBLEVEL
if [ -f $VERSION_NAME ] ; then
return 0
fi
VERSION_NAME=$1.v$VERSION.$PATCHLEVEL
if [ -f $VERSION_NAME ] ; then
return 0
fi
VERSION_NAME=""
return 1
}
while getopts :rhk:uc:w a ; do
case $a in
\?) case $OPTARG in
k) echo "-k requires Kernel directory parameter"
;;
*) echo "Unknown option: -$OPTARG"
echo "Try stddiff -h"
;;
esac
exit 1
;;
k) checkkernel $OPTARG
KERNELDIR=$OPTARG
;;
c) CTRLNAME=$OPTARG
;;
u) UNIQUE=true
;;
r) KERNFIRST=true
;;
w) EXTRAOPT=-w
;;
h) usage
;;
esac
done
shift `expr $OPTIND - 1`
if [ -z "$VERSION" -o -z "$PATCHLEVEL" ] ; then
if ! [ -f $KERNELDIR/Makefile ] ; then
echo "VERSION/PATCHLEVEL not set and no Makefile to read from"
exit 1
fi
eval `sed -n 's/^\([A-Z]*\) = \([0-9]*\)$/\1=\2/p' $KERNELDIR/Makefile`
fi
echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL"
if $UNIQUE ; then
DODIFF=dodiffuni
calc_ctrl_file
fi
echo -n "Using $DODIFF $EXTRAOPT"
if $UNIQUE ; then
echo " with controlfile $CTRLNAME"
else
echo
fi
if [ $# != 0 ]; then
for i in $* ; do
$DODIFF $i $KERNELDIR/$i
done
else
for i in drivers/isdn/hardware/mISDN/*.[ch] ; do
$DODIFF $i $KERNELDIR/$i
done
for i in include/linux/*.h ; do
if [ "$i" = "include/linux/isdn_compat.h" -a \
"$UNIQUE" = "true" ] ; then
echo "$i skipped"
else
$DODIFF $i $KERNELDIR/$i
fi
done
for i in drivers/isdn/hardware/Makefile \
drivers/isdn/hardware/Kconfig \
drivers/isdn/hardware/mISDN/Makefile \
drivers/isdn/hardware/mISDN/Rules.make \
drivers/isdn/hardware/mISDN/Kconfig ; do
calc_version_file $i
if [ -n "$VERSION_NAME" ] ; then
dodiff $VERSION_NAME $KERNELDIR/$i
else
if [ -f $i ] ; then
echo "use version independ $i for version v$VERSION.$PATCHLEVEL.$SUBLEVEL"
$DODIFF $i $KERNELDIR/$i
else
echo "no $i for version v$VERSION.$PATCHLEVEL.$SUBLEVEL found -- skipped"
fi
fi
done
fi