aboutsummaryrefslogtreecommitdiffstats
path: root/admin/revdiff
diff options
context:
space:
mode:
Diffstat (limited to 'admin/revdiff')
-rwxr-xr-xadmin/revdiff122
1 files changed, 122 insertions, 0 deletions
diff --git a/admin/revdiff b/admin/revdiff
new file mode 100755
index 00000000000..bdd6a2210ce
--- /dev/null
+++ b/admin/revdiff
@@ -0,0 +1,122 @@
1#! /usr/bin/perl
2
3# Copyright (C) 2001 Free Software Foundation, Inc.
4#
5# This file is part of GNU Emacs.
6#
7# GNU Emacs is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2, or (at your option)
10# any later version.
11#
12# GNU Emacs is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with GNU Emacs; see the file COPYING. If not, write to the
19# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20# Boston, MA 02111-1307, USA.
21
22use File::Basename;
23
24if (@ARGV < 3)
25{
26 print <<USAGE;
27revdiff FILE OLD NEW
28
29Get a diff of FILE between revisions OLD and NEW. Store the
30diff in a file named FILE-OLD-NEW.diff. If NEW is +<number>
31or -<number>, build diffs between revisions OLD and OLD +/- <number>.
32OLD being `-' means use FILE's current revision.
33
34Examples:
35
36revdiff FILE - -1 get the latest change of FILE
37revdiff FILE 1.500 +2 get diffs 1.500-1.501 and 1.501-1.502.
38
39USAGE
40 exit 1;
41}
42
43$file = shift @ARGV;
44$old = shift @ARGV;
45
46sub diffit
47{
48 my ($old, $new) = @_;
49 print "cvs diff -r$old -r$new $file >$file-$old-$new.diff\n";
50 system "cvs diff -r$old -r$new $file >$file-$old-$new.diff";
51}
52
53sub current_revision ($)
54{
55 my ($file) = @_;
56 my $dir = dirname ($file);
57 my $base = basename ($file);
58 my $entries = "$dir/CVS/Entries";
59 die "Can't find $entries" unless -f $entries;
60 open (IN, "<$entries") or die "Cannot open $entries";
61 my $rev;
62 while ($line = <IN>)
63 {
64 if ($line =~ m,/$base/([^/]+),)
65 {
66 $rev = $1;
67 break;
68 }
69 }
70 die "Cannot determine current revision of $file" unless $rev;
71 close (IN);
72 return $rev;
73}
74
75if ($old eq "-")
76{
77 $old = current_revision ($file);
78}
79
80while (@ARGV)
81 {
82 my $new = shift @ARGV;
83 if ($new =~ /^[+]\d+$/)
84 {
85 my $n = $new;
86 for ($i = 0; $i < $n; ++$i)
87 {
88 unless ($old =~ /(.*)\.(\d+)$/)
89 {
90 die "Internal error";
91 }
92 my $j = $2 + 1;
93 $new = "$1.$j";
94 diffit ($old, $new);
95 $old = $new;
96 }
97 }
98 elsif ($new =~ /^[-]\d+$/)
99 {
100 my $n = - $new;
101 for ($i = 0; $i < $n; ++$i)
102 {
103 unless ($old =~ /(.*)\.(\d+)$/)
104 {
105 die "Internal error";
106 }
107 my $j = $2 - 1;
108 $new = "$1.$j";
109 diffit ($new, $old);
110 $old = $new;
111 }
112 }
113 else
114 {
115 diffit ($old, $new);
116 $old = $new;
117 }
118 }
119
120# Local Variables:
121# mode: cperl
122# End: