Warning, /sdk/kde-dev-scripts/svnlastchange is written in an unsupported language. File is not indexed.

0001 #!/usr/bin/env perl
0002 #
0003 # This file is Copyright (C) 2005 Thiago Macieira <thiago@kde.org>
0004 # 
0005 # This program is free software; you can redistribute it and/or modify
0006 # it under the terms of the GNU General Public License as published by
0007 # the Free Software Foundation; version 2 of the License as published
0008 # by the Free Software Foundation.
0009 #
0010 # This program is distributed in the hope that it will be useful,
0011 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 # GNU General Public License for more details.
0014 #
0015 # You should have received a copy of the GNU General Public License
0016 # along with this program; if not, write to the Free Software Foundation, Inc.,
0017 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0018 
0019 # =====================================================================
0020 # This is a replacement for the old svnlastchange script, with a bit
0021 # more of functionality.
0022 #
0023 # The old one was:
0024 # svn log -r COMMITTED "$*"
0025 # svn diff -r PREV:COMMITTED "$*" || \
0026 #     echo >&2 "Error retrieving diff: the file was probably added in the last revision"
0027 #
0028 # =====================================================================
0029 
0030 # Turn on warnings the best way depending on the Perl version.
0031 BEGIN {
0032   if ( $] >= 5.006_000)
0033     { require warnings; import warnings; }
0034   else
0035     { $^W = 1; }
0036 }
0037 use strict;
0038 
0039 my $want_whitespace = 0;
0040 
0041 sub showdiff($@) #depends on global var $want_whitespace
0042 {
0043     my ($revisions) = shift(@_);
0044     my (@files) = @_;
0045     if ($want_whitespace) {
0046         system('svn', 'diff',
0047                # This is for people who set a diff-cmd to exclude whitespace; when forwardporting we need the indentation to be preserved
0048                '--diff-cmd=diff',
0049                '-r', $revisions, @files);
0050     } else {
0051         # By default, use plain svn diff; whitespace depends on user configuration
0052         system('svn', 'diff', '-r', $revisions, @files);
0053     }
0054 }
0055 
0056 #
0057 # Read the parameters
0058 #
0059 my @files;
0060 my $rev;
0061 my $special = 0;
0062 my $onlyrev = 0;
0063 my $onlylog = 0;
0064 while (@ARGV)
0065   {
0066     my $arg = shift @ARGV;
0067     if ($arg eq '-h')
0068       {
0069         &usage;
0070         exit 0;
0071       }
0072     elsif ($arg =~ /^-r(.*)$/)
0073       {
0074         $rev = $1;
0075         if (length($1) == 0)
0076           {
0077             $rev = shift @ARGV;
0078           }
0079         $special = 1 if ($rev =~ /^-/);
0080       }
0081     elsif ($arg eq '-R')
0082       {
0083         $onlyrev = 1;
0084         $special = 1;
0085         $rev = -1 unless $rev;
0086       }
0087     elsif ($arg eq '-l')
0088       {
0089         $onlylog = 1;
0090       }
0091     elsif ($arg eq '-ws')
0092       {
0093         $want_whitespace = 1;
0094       }
0095     else
0096       {
0097         push(@files, $arg);
0098       }
0099   }
0100 @files = ('.') unless @files;
0101 
0102 if (!$special)
0103   {
0104     my $prev;
0105     if ($rev)
0106       {
0107         $prev = $rev - 1;
0108       }
0109     else
0110       {
0111         $rev = 'COMMITTED';
0112         $prev = 'PREV';
0113       }
0114 
0115     system('svn', 'log', '-r', $rev, @files);
0116     &showdiff("$prev:$rev", @files) unless $onlylog;
0117     exit $?;
0118   }
0119 
0120 #
0121 # Special operation
0122 # Retrieve the full log in order to find the right version
0123 #
0124 foreach my $file (@files)
0125   {
0126     my $pid = open(LOG, '-|');
0127     die "svnlastchange: cannot fork: $!\n" unless (defined $pid);
0128     unless ($pid)
0129       {
0130         open(STDERR, ">&STDOUT")
0131           or die "svnlastchange: cannot dup STDOUT: $!\n";
0132         exec('svn', 'log', $file)
0133           or die "svnlastchange: cannot exec svn: $!\n";
0134       }
0135       
0136     my $is_header = 0;
0137     while (<LOG>)
0138       {
0139         s/[\r\n]+$//;
0140         
0141         if ($is_header && /^r(\d+) \| /)
0142           {
0143             $rev = $rev + 1;
0144             if ($rev == 0)
0145               {
0146                 if ($onlyrev)
0147                   {
0148                     print "$1\n";
0149                   }
0150                 else
0151                   {
0152                     system('svn', 'log', '-r', $1, $file);
0153                     &showdiff( ($1 - 1) . ":$1", $file) unless $onlylog;
0154                   }
0155                 last;
0156               }
0157           }
0158         
0159         if ($_ eq '------------------------------------------------------------------------')
0160           {
0161             $is_header = 1;
0162           }
0163         else
0164           {
0165             $is_header = 0;
0166           }
0167       }
0168     close(LOG);
0169     exit $? if $?;
0170   }
0171 
0172 sub usage
0173 {
0174     print "svnlastchange [-hlR] [-r rev] [filename...]\n";
0175     print "\n";
0176     print "Where:\n";
0177     print "  -h       shows this help screen\n";
0178     print "  -l       shows the commit log only\n";
0179     print "  -R       prints the revision number only (to be used with -r)\n";
0180     print "  -r rev   shows the commit log for revision 'rev'\n";
0181     print "           if rev is negative, the 'rev'nth revision before the current\n";
0182     print "           one is shown\n";
0183     print "\n";
0184     print "Examples:\n";
0185     print "  svnlastchange .               shows the last change to the current directory\n";
0186     print "  svnlastchange -r -2           shows the change before the last\n";
0187     print "  svnlastchange -R -r -1        shows the last change's revision\n";
0188 
0189     exit 0;
0190 }
0191 
0192