| 1 | #!/usr/bin/perl -w |
| 2 | |
| 3 | ############################################################################### |
| 4 | # Name: difflast.pl |
| 5 | # Purpose: Shows the difference between the current local version of the file |
| 6 | # and the last cvs revision |
| 7 | # Version: $Id$ |
| 8 | # Author: VZ |
| 9 | # Created: 23.12.99 |
| 10 | # Copyright:(c) Vadim Zeitlin 1999 |
| 11 | ############################################################################### |
| 12 | |
| 13 | use strict; |
| 14 | |
| 15 | my $CVS = "cvs -z3"; # the cvs command |
| 16 | |
| 17 | # the regexp for cvs revision number |
| 18 | my $RE_CVS_REV = "\\d+(?:\\.\\d+)+"; |
| 19 | |
| 20 | sub dec_rev($) |
| 21 | { |
| 22 | my $rev = $_[0]; |
| 23 | |
| 24 | # decrement the revision number to get the previos one |
| 25 | $rev =~ s/(\d+)$/$1 - 1/e; |
| 26 | |
| 27 | return $rev; |
| 28 | } |
| 29 | |
| 30 | sub get_last_rev($) |
| 31 | { |
| 32 | my $file = $_[0]; |
| 33 | |
| 34 | my $basename = $file; |
| 35 | $basename =~ s@^.*/@@; |
| 36 | |
| 37 | # first get the current version: try the Id RCS tag in the file itself |
| 38 | # first, use "cvs status" if this fails |
| 39 | if ( open(INPUT, $file) ) { |
| 40 | while (<INPUT>) { |
| 41 | # notice that we shouldn't have '$' followed by 'Id' or cvs will |
| 42 | # substitute it! |
| 43 | if ( /\$(Id): $basename,v ($RE_CVS_REV)/ ) { |
| 44 | return &dec_rev($2); |
| 45 | } |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | open(INPUT, "$CVS -q status $file |") or return 0; |
| 50 | |
| 51 | while (<INPUT>) { |
| 52 | if ( /Working revision:\s+($RE_CVS_REV)/ ) { |
| 53 | return &dec_rev($1); |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | return 0; |
| 58 | } |
| 59 | |
| 60 | sub process_file($) |
| 61 | { |
| 62 | my $file = $_[0]; |
| 63 | my $revlast = &get_last_rev($file); |
| 64 | |
| 65 | if ( !$revlast ) { |
| 66 | warn "Failed to get the last revision for $file, skipping.\n" |
| 67 | } |
| 68 | elsif ( $revlast =~ '\.0' ) { |
| 69 | warn "No previous revision of the file $file.\n" |
| 70 | } |
| 71 | else { |
| 72 | print `$CVS diff -b -kk -r $revlast $file`; |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | # entry point |
| 77 | |
| 78 | die "Usage: $0 <filenames...>\n" if ( $#ARGV == -1 ); |
| 79 | |
| 80 | foreach my $file (@ARGV) { process_file($file); } |
| 81 | |
| 82 | exit 0; |