#!/usr/bin/perl -- # # Show svn pl -v for all files at a directory of a 1st argment. # Fri,04 Sep,2009 # Copyright(C)2009 G-HAL (fenix.ne.jp) # use strict; use File::Find; sub a_file_parser { my $filename = $_[0]; if ($filename =~ /^(|.*\/)(\.\.|\.svn)(|\/.*)$/) { return; } my $type_dir = 0; if (-d $filename) { $type_dir = 1; } my @ret = `env LC_ALL=C svn pl -v \"$filename\" 2>&1`; my $result = (0 == $?) ? '' : '?'; { # Convert result strings to $result my $last_line_type = 0; # 0: none, 1: propname, 2: propval, 3: et-al. my $skip_propval = 0; foreach my $i (@ret) { if ($i =~ /^svn: warning: /) { $result = $result .'?'; } elsif ($i =~ /^ ([^ ].*)$/) { my $propname = $1; if ($propname =~ /^svn:(mergeinfo|executable)$/) { $skip_propval = 1; } else { $skip_propval = 0; } if (0 == $last_line_type) { } elsif (1 == $last_line_type) { $result = $result . ','; } elsif (2 == $last_line_type) { $result = $result . ','; } elsif (3 == $last_line_type) { } $result = $result . $propname; $last_line_type = 1; } elsif ($i =~ /^ ([^ ].*)$/) { my $propval = $1; if (! $skip_propval) { if (0 == $last_line_type) { } elsif (1 == $last_line_type) { $result = $result . '='; } elsif (2 == $last_line_type) { $result = $result . '='; } elsif (3 == $last_line_type) { } $result = $result .'"'. $propval .'"'; } $last_line_type = 2; } else { $last_line_type = 3; } } } if ($type_dir) { print '', $result, ' ', $filename, '/', "\n"; } else { print $result, ' ', $filename, "\n"; } return; } # Parse argments my @filelist = (); my $filelist_from_stdin = 0; my $recursiveness = 0; my $abort = 0; foreach my $i (@ARGV) { if ($i =~ /^-(.*)$/) { my $tmp = $1; if ($tmp eq 'R') { $recursiveness = 1; } elsif ($tmp eq '-') { $filelist_from_stdin = 1; } } elsif (-d $i) { push( @filelist, $i ); } elsif (-f $i) { push( @filelist, $i ); } else { print "Unknown argment: '" . $i . "'\n"; $abort = 1; } } if ($abort) { exit -1; } if (@filelist < 1) { @filelist = ('./'); } # Scan file/files and directory/directories if ($filelist_from_stdin) { while () { chomp( $_ ); a_file_parser( $_ ); } } else { foreach my $i (@filelist) { if (-d $i) { if ($recursiveness) { my @sub_filelist = (); sub find_sub_proc { # In here, Current Working Directory was changed into $File::Find::dir if ($_ =~ /^\.svn$/) { $File::Find::prune = 1; return; } push( @sub_filelist, $File::Find::name ); return; } find( \&find_sub_proc, $i ); foreach my $j (@sub_filelist) { a_file_parser( $j ); } } else { if ($i eq '.') { a_file_parser( $i ); } else { $i =~ s/\/$//; opendir DH, $i; while (my $j = readdir DH) { if ($j =~ /^\.$/) { a_file_parser( $i ); } elsif ($j =~ /^\.\.$/) { } else { a_file_parser( $i .'/'. $j ); } } closedir DH; } } } else { a_file_parser( $i ); } } } __END__ # [ End of File ]