]>
Commit | Line | Data |
---|---|---|
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; |