Mercurial > emacs
diff admin/revdiff @ 38850:f87dbbd87498
*** empty log message ***
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Thu, 16 Aug 2001 15:23:50 +0000 |
parents | |
children | 570be39418f4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/admin/revdiff Thu Aug 16 15:23:50 2001 +0000 @@ -0,0 +1,122 @@ +#! /usr/bin/perl + +# Copyright (C) 2001 Free Software Foundation, Inc. +# +# This file is part of GNU Emacs. +# +# GNU Emacs is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# GNU Emacs is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +use File::Basename; + +if (@ARGV < 3) +{ + print <<USAGE; +revdiff FILE OLD NEW + +Get a diff of FILE between revisions OLD and NEW. Store the +diff in a file named FILE-OLD-NEW.diff. If NEW is +<number> +or -<number>, build diffs between revisions OLD and OLD +/- <number>. +OLD being `-' means use FILE's current revision. + +Examples: + +revdiff FILE - -1 get the latest change of FILE +revdiff FILE 1.500 +2 get diffs 1.500-1.501 and 1.501-1.502. + +USAGE + exit 1; +} + +$file = shift @ARGV; +$old = shift @ARGV; + +sub diffit +{ + my ($old, $new) = @_; + print "cvs diff -r$old -r$new $file >$file-$old-$new.diff\n"; + system "cvs diff -r$old -r$new $file >$file-$old-$new.diff"; +} + +sub current_revision ($) +{ + my ($file) = @_; + my $dir = dirname ($file); + my $base = basename ($file); + my $entries = "$dir/CVS/Entries"; + die "Can't find $entries" unless -f $entries; + open (IN, "<$entries") or die "Cannot open $entries"; + my $rev; + while ($line = <IN>) + { + if ($line =~ m,/$base/([^/]+),) + { + $rev = $1; + break; + } + } + die "Cannot determine current revision of $file" unless $rev; + close (IN); + return $rev; +} + +if ($old eq "-") +{ + $old = current_revision ($file); +} + +while (@ARGV) + { + my $new = shift @ARGV; + if ($new =~ /^[+]\d+$/) + { + my $n = $new; + for ($i = 0; $i < $n; ++$i) + { + unless ($old =~ /(.*)\.(\d+)$/) + { + die "Internal error"; + } + my $j = $2 + 1; + $new = "$1.$j"; + diffit ($old, $new); + $old = $new; + } + } + elsif ($new =~ /^[-]\d+$/) + { + my $n = - $new; + for ($i = 0; $i < $n; ++$i) + { + unless ($old =~ /(.*)\.(\d+)$/) + { + die "Internal error"; + } + my $j = $2 - 1; + $new = "$1.$j"; + diffit ($new, $old); + $old = $new; + } + } + else + { + diffit ($old, $new); + $old = $new; + } + } + +# Local Variables: +# mode: cperl +# End: