Add 2007 to copyright years.
[bpt/emacs.git] / admin / revdiff
CommitLineData
30b50b5c
GM
1#! /usr/bin/perl
2
4e6835db
GM
3# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
4# Free Software Foundation, Inc.
30b50b5c
GM
5#
6# This file is part of GNU Emacs.
7#
8# GNU Emacs is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2, or (at your option)
11# any later version.
12#
13# GNU Emacs is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with GNU Emacs; see the file COPYING. If not, write to the
0d07bc90
LK
20# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21# Boston, MA 02110-1301, USA.
30b50b5c
GM
22
23use File::Basename;
24
177c0ea7 25if (@ARGV < 3)
30b50b5c
GM
26{
27 print <<USAGE;
28revdiff FILE OLD NEW
177c0ea7 29
30b50b5c 30Get a diff of FILE between revisions OLD and NEW. Store the
13bc4e1a
GM
31diff in a file named FILE-OLD-NEW.diff.
32
33If OLD is `-' use FILE's current revision for OLD. If OLD is
34`-<number>', use the Nth revision before the current one for OLD.
35
36If NEW is +<number> or -<number>, build diffs between revisions OLD
37and OLD +/- <number>.
30b50b5c
GM
38
39Examples:
40
41revdiff FILE - -1 get the latest change of FILE
13bc4e1a 42revdiff FILE -1 +1 also gets the latest change of FILE
30b50b5c
GM
43revdiff FILE 1.500 +2 get diffs 1.500-1.501 and 1.501-1.502.
44
45USAGE
46 exit 1;
47}
48
49$file = shift @ARGV;
50$old = shift @ARGV;
51
177c0ea7 52sub diffit
30b50b5c
GM
53{
54 my ($old, $new) = @_;
55 print "cvs diff -r$old -r$new $file >$file-$old-$new.diff\n";
56 system "cvs diff -r$old -r$new $file >$file-$old-$new.diff";
57}
58
59sub current_revision ($)
60{
61 my ($file) = @_;
62 my $dir = dirname ($file);
63 my $base = basename ($file);
64 my $entries = "$dir/CVS/Entries";
65 die "Can't find $entries" unless -f $entries;
66 open (IN, "<$entries") or die "Cannot open $entries";
67 my $rev;
177c0ea7 68 while ($line = <IN>)
30b50b5c 69 {
177c0ea7 70 if ($line =~ m,/$base/([^/]+),)
30b50b5c
GM
71 {
72 $rev = $1;
73 break;
74 }
75 }
76 die "Cannot determine current revision of $file" unless $rev;
77 close (IN);
78 return $rev;
79}
80
81if ($old eq "-")
13bc4e1a
GM
82 {
83 $old = current_revision ($file);
84 }
177c0ea7 85elsif ($old =~ /^-(\d+)$/)
13bc4e1a
GM
86 {
87 my $offset = $1;
88 $old = current_revision ($file);
89 die "Internal error" unless $old =~ /(.*)\.(\d+)$/;
90 my $minor = $2 - $offset;
91 $old = sprintf ("%d.%d", $1, $minor);
92 }
30b50b5c 93
177c0ea7 94while (@ARGV)
30b50b5c
GM
95 {
96 my $new = shift @ARGV;
97 if ($new =~ /^[+]\d+$/)
98 {
99 my $n = $new;
177c0ea7 100 for ($i = 0; $i < $n; ++$i)
30b50b5c 101 {
177c0ea7 102 unless ($old =~ /(.*)\.(\d+)$/)
30b50b5c
GM
103 {
104 die "Internal error";
105 }
106 my $j = $2 + 1;
107 $new = "$1.$j";
108 diffit ($old, $new);
109 $old = $new;
110 }
177c0ea7
JB
111 }
112 elsif ($new =~ /^[-]\d+$/)
30b50b5c
GM
113 {
114 my $n = - $new;
177c0ea7 115 for ($i = 0; $i < $n; ++$i)
30b50b5c 116 {
177c0ea7 117 unless ($old =~ /(.*)\.(\d+)$/)
30b50b5c
GM
118 {
119 die "Internal error";
120 }
121 my $j = $2 - 1;
122 $new = "$1.$j";
123 diffit ($new, $old);
124 $old = $new;
125 }
126 }
177c0ea7 127 else
30b50b5c
GM
128 {
129 diffit ($old, $new);
130 $old = $new;
131 }
132 }
133
134# Local Variables:
135# mode: cperl
136# End:
ab5796a9
MB
137
138# arch-tag: 2798b20d-c7f2-4c78-8378-7bb529c36a09