| 1 | #!/usr/bin/perl | 
|---|
| 2 | require"timelocal.pl"; | 
|---|
| 3 |  | 
|---|
| 4 | # | 
|---|
| 5 | # usage scancvslog.pl logfile starttime tag | 
|---|
| 6 | # | 
|---|
| 7 | # this will extract all entries from the specified cvs log file | 
|---|
| 8 | # that have a date later than or equal to starttime and a tag | 
|---|
| 9 | # value of tag. If starttime is not specified, all entries are | 
|---|
| 10 | # extracted. If tag is not specified then entries for all | 
|---|
| 11 | # branches are extracted. starttime must be specified as | 
|---|
| 12 | # "monthname day, year" | 
|---|
| 13 | # | 
|---|
| 14 | # Example to extract all entries for SAMBA_2_2 branch from the | 
|---|
| 15 | # log file named cvs.log | 
|---|
| 16 | # | 
|---|
| 17 | # scancvslog.pl cvs.log "" SAMBA_2_2 | 
|---|
| 18 | # | 
|---|
| 19 | # | 
|---|
| 20 | # To extract all log entries after Jan 10, 1999 (Note month name | 
|---|
| 21 | # must be spelled out completely). | 
|---|
| 22 | # | 
|---|
| 23 | # scancvslog.pl cvs.log "January 10, 1999" | 
|---|
| 24 | # | 
|---|
| 25 |  | 
|---|
| 26 | open(INFILE,@ARGV[0]) || die "Unable to open @ARGV[0]\n"; | 
|---|
| 27 |  | 
|---|
| 28 | %Monthnum = ( | 
|---|
| 29 | "January",      0, | 
|---|
| 30 | "February",     1, | 
|---|
| 31 | "March",        2, | 
|---|
| 32 | "April",        3, | 
|---|
| 33 | "May",          4, | 
|---|
| 34 | "June",         5, | 
|---|
| 35 | "July",         6, | 
|---|
| 36 | "August",       7, | 
|---|
| 37 | "September",    8, | 
|---|
| 38 | "October",      9, | 
|---|
| 39 | "November",     10, | 
|---|
| 40 | "December",     11, | 
|---|
| 41 | "Jan",          0, | 
|---|
| 42 | "Feb",          1, | 
|---|
| 43 | "Mar",          2, | 
|---|
| 44 | "Apr",          3, | 
|---|
| 45 | "May",          4, | 
|---|
| 46 | "Jun",          5, | 
|---|
| 47 | "Jul",          6, | 
|---|
| 48 | "Aug",          7, | 
|---|
| 49 | "Sep",          8, | 
|---|
| 50 | "Oct",          9, | 
|---|
| 51 | "Nov",          10, | 
|---|
| 52 | "Dec",          11 | 
|---|
| 53 | ); | 
|---|
| 54 |  | 
|---|
| 55 | $Starttime = (@ARGV[1]) ? &make_time(@ARGV[1]) : 0; | 
|---|
| 56 | $Tagvalue = @ARGV[2]; | 
|---|
| 57 |  | 
|---|
| 58 | while (&get_entry) { | 
|---|
| 59 | $_=$Entry[0]; | 
|---|
| 60 | # get rid of extra white space | 
|---|
| 61 | s/\s+/ /g; | 
|---|
| 62 | # get rid of any time string in date | 
|---|
| 63 | s/ \d\d:\d\d:\d\d/,/; | 
|---|
| 64 | s/^Date:\s*\w*\s*(\w*)\s*(\w*),\s*(\w*).*/$1 $2 $3/; | 
|---|
| 65 | $Testtime = &make_time($_); | 
|---|
| 66 | $Testtag = &get_tag; | 
|---|
| 67 | if (($Testtime >= $Starttime) && ($Tagvalue eq $Testtag)) { | 
|---|
| 68 | print join("\n",@Entry),"\n"; | 
|---|
| 69 | } | 
|---|
| 70 | } | 
|---|
| 71 | close(INFILE); | 
|---|
| 72 |  | 
|---|
| 73 | sub make_time { | 
|---|
| 74 | $_ = @_[0]; | 
|---|
| 75 | s/,//; | 
|---|
| 76 | ($month, $day, $year) = split(" ",$_); | 
|---|
| 77 | if (($year < 1900)||($day < 1)||($day > 31)||not length($Monthnum{$month})) { | 
|---|
| 78 | print "Bad date format @_[0]\n"; | 
|---|
| 79 | print "Date needs to be specified as \"Monthname day, year\"\n"; | 
|---|
| 80 | print "eg: \"January 10, 1999\"\n"; | 
|---|
| 81 | exit 1; | 
|---|
| 82 | } | 
|---|
| 83 | $year = ($year == 19100) ? 2000 : $year; | 
|---|
| 84 | $month = $Monthnum{$month}; | 
|---|
| 85 | $Mytime=&timelocal((0,0,0,$day,$month,$year)); | 
|---|
| 86 | } | 
|---|
| 87 |  | 
|---|
| 88 | sub get_tag { | 
|---|
| 89 | @Mytag = grep (/Tag:/,@Entry); | 
|---|
| 90 | $_ = @Mytag[0]; | 
|---|
| 91 | s/^.*Tag:\s*(\w*).*/$1/; | 
|---|
| 92 | return $_; | 
|---|
| 93 | } | 
|---|
| 94 |  | 
|---|
| 95 | sub get_entry { | 
|---|
| 96 | @Entry=(); | 
|---|
| 97 | if (not eof(INFILE)) { | 
|---|
| 98 | while (not eof(INFILE)) { | 
|---|
| 99 | $_ = <INFILE>; | 
|---|
| 100 | chomp $_; | 
|---|
| 101 | next if (not ($_)); | 
|---|
| 102 | if (/^\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/) { | 
|---|
| 103 | next if ($#Entry == -1); | 
|---|
| 104 | push(Entry,$_); | 
|---|
| 105 | return @Entry; | 
|---|
| 106 | } else { | 
|---|
| 107 | push(Entry,$_); | 
|---|
| 108 | } | 
|---|
| 109 | } | 
|---|
| 110 | } | 
|---|
| 111 | return @Entry; | 
|---|
| 112 | } | 
|---|