home *** CD-ROM | disk | FTP | other *** search
/ The UNIX CD Bookshelf / OREILLY_TUCB_UNIX_CD.iso / upt / examples / LINUX / ARCHIVE / RCSGREP.Z / RCSGREP / sbin / rcsegrep next >
Encoding:
Text File  |  1997-05-05  |  3.4 KB  |  126 lines

  1. #! /bin/sh
  2. # $Id: rcsgrep 1.5 1997/04/18 20:35:42 jerry Exp $
  3. ###    rcsgrep, rcsegrep, rcsfgrep - check out files and grep/egrep/fgrep them
  4. ###    Usage: rcsgrep [-s] [-a] [-rn.m] [grep options] regular-expression [files]
  5. ##
  6. ##    USE -s IF YOU DON'T WANT TO SEE THE CHECKOUT INFO FROM RCS.
  7. ##    USE -a TO RUN grep ON ALL REVISIONS OF THE FILE
  8. ##    USE -r TO RUN grep ON SOME PARTICULAR REVISION (DEFAULT: LATEST REVISION)
  9.  
  10. g=`echo g | tr g '\007'`    # CTRL-G FOR sed; NO CONFLICT WITH / IN PATHNAMES
  11. rcsrevs=/usr/local/txtools/bin/rcsrevs    # GETS ALL REVISIONS OF RCS FILE FOR -a
  12.  
  13. # SHELL FUNCTION TO DO THE co AND grep:
  14. doit()
  15. {
  16.     # READ THE FILE FROM co AND LOOK FOR MATCHES.
  17.     # IF THERE'S A -e OPTION, $estr WILL BE DEFINED; OTHERWISE,
  18.     # $regexp WILL BE DEFINED; PUT A SINGLE -e BEFORE THEM UNLESS -f WAS USED:
  19.     case "$fnonly" in
  20.     yes)# IF grep FINDS FILENAME, echo IT (FAKE grep -l).
  21.         # NOTE: grep READS stdin "FROM THE if" (PIPE FEEDING THE if).
  22.         co $silent -p$rev $file |
  23.         # USING grep -s WOULD BE SIMPLER (AND FASTER, PROBABLY).
  24.         # BUT AS SOON AS grep -s FINDS ONE MATCH, IT QUITS.
  25.         # THEN co GETS KILLED WITH A SIGPIPE AND IT PRINTS rcs: cleaning up.
  26.         # SO, USE STANDARD grep AND THROW AWAY MATCHES.
  27.         if $prog $opts $fstr $eopt ${estr:+"$estr"} ${regexp:+"$regexp"} >/dev/null
  28.         then echo "$basefile"
  29.         fi
  30.         ;;
  31.     *)    # HAVE TO DO grep INSIDE LOOP SO grep -n GIVES RIGHT LINE NUMBER
  32.         co $silent -p$rev $file |
  33.         $prog $opts $fstr $eopt ${estr:+"$estr"} ${regexp:+"$regexp"} |
  34.         sed "s${g}^${g}$basefile:${g}"
  35.         ;;
  36.     esac
  37. }
  38.  
  39. case "$0" in
  40. *rcsgrep) prog=/bin/grep ;;
  41. *rcsegrep) prog=/bin/egrep ;;
  42. *rcsfgrep) prog=/bin/fgrep ;;
  43. *) echo "$0: Help!  Don't know how to run myself!" 1>&2; exit 1 ;;
  44. esac
  45.  
  46. # SEPARATE OPTIONS AND FILENAMES:
  47. eopt=-e estr= opts= files= fnonly= regexp= silent= rev= all=
  48. while :
  49. do
  50.     case "$1" in
  51.     "")    case $# in
  52.         0)    break ;;
  53.         *)    echo "`basename $0`: WARNING: ignoring empty argument!?!" 1>&2 ;;
  54.         esac
  55.         ;;
  56.     -a)    all=yes ;;    # CHECK OUT AND grep ALL REVISIONS
  57.     -e)    # NEXT ARGUMENT IS AN EXPRESSION:
  58.         case "$2" in
  59.         "")    echo "`basename $0` quitting: missing expression after '-e'." 1>&2
  60.             exit 1
  61.             ;;
  62.         *)    estr="$2"
  63.             shift
  64.             ;;
  65.         esac
  66.         ;;
  67.     -f)    # NEXT ARGUMENT IS A FILENAME.
  68.         # DON'T LET egrep OR fgrep BOMB OVER AND OVER IF FILE NOT READABLE:
  69.         if [ -r "$2" ]
  70.         then
  71.             fstr="-f $2"
  72.             eopt=
  73.         else
  74.             echo "`basename $0` quitting: can't read file for '-f $2'." 1>&2
  75.             exit
  76.         fi
  77.         shift
  78.         ;;
  79.     -l)    fnonly=yes ;;    # grep -l ONLY PRINTS FILENAME
  80.     -r?*)    rev=`expr "$1" : '-r\(.*\)'` ;;    # RCS REVISION NUMBER
  81.     -r)    echo "`basename $0` quitting: missing revision number after -r." 1>&2
  82.         exit 1
  83.         ;;
  84.     -s*)    silent=-q ;;
  85.     -*)    opts="$opts $1" ;;
  86.     *)    # FIRST NON-OPTION ARGUMENT IS REGULAR EXPRESSION (EXCEPT WITH -e).
  87.         # REST ARE FILES.
  88.         if [ -z "$estr" -a -z "$regexp" ]
  89.         then regexp="$1"
  90.         else
  91.             if [ -r "$1" -o -r "RCS/$1,v" -o -r "RCS/$1" ]
  92.             then files="$files $1"
  93.             else echo "`basename $0`: can't read file '$1'; skipping..." 1>&2
  94.             fi
  95.         fi
  96.     esac
  97.     shift
  98. done
  99.  
  100. case "$all$rev" in
  101. yes?*)
  102.     echo "`basename $0` WARNING: ignoring -a.  Can't use -a with -r." 1>&2
  103.     all=
  104.     ;;
  105. esac
  106.  
  107. # IF NO files SET, USE RCS/*,v:
  108. for file in ${files:-RCS/*,v}
  109. do
  110.     case "$file" in
  111.     RCS/*,v) basefile="`expr $file : 'RCS/\(.*\),v'`" ;;
  112.     *,v) basefile="`expr $file : '\(.*\),v'`" ;;
  113.     *)    basefile="$file" ;;
  114.     esac
  115.  
  116.     case "$all" in
  117.     yes)
  118.         # LOOP THROUGH ALL REVISIONS:
  119.         for rev in `$rcsrevs $file`
  120.         do doit
  121.         done
  122.         ;;
  123.     *) doit ;;
  124.     esac
  125. done
  126.