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: