File Coverage

blib/lib/File/Rename.pm
Criterion Covered Total %
statement 70 81 86.4
branch 32 38 84.2
condition 5 9 55.5
subroutine 8 8 100.0
pod 3 3 100.0
total 118 139 84.8


line stmt bran cond sub pod time code
1             package File::Rename;
2            
3 23     23   579572 use strict;
  23         133  
  23         784  
4 23     23   118 use warnings;
  23         41  
  23         25803  
5            
6             require Exporter;
7             our @ISA = qw(Exporter);
8             our @EXPORT_OK = qw( rename );
9            
10             our $VERSION = '2.00_3';
11            
12             sub import {
13 20     20   102 my $pack = shift;
14 20         58 my($args, $config) = &_config; # sees @_
15 20         1943 $pack->export_to_level(1, $pack, @$args);
16 20         8448 require File::Rename::Options;
17 20         162 File::Rename::Options->import(@$config);
18             }
19            
20             sub rename_files {
21 45     45 1 50335 my $code = shift;
22 45         82 my $options = shift;
23 45         156 _default(\$options);
24            
25 45         86 my $sub = $code;
26 45 100       170 if ( $options->{unicode_strings} ) {
27 3         1466 require File::Rename::Unicode;
28             $sub = File::Rename::Unicode::code($code,
29 3         363 $options->{encoding});
30             }
31 45         92 my $errors;
32 45         137 for (@_) {
33 60         127 my $was = $_;
34 60 100       156 if ( $options->{filename_only} ) {
35 9         51 require File::Spec;
36 9         123 my($vol, $dir, $file) = File::Spec->splitpath($_);
37 9         36 $sub->() for ($file);
38 9         117 $_ = File::Spec->catpath($vol, $dir, $file);
39             }
40             else {
41 51         856 $sub->();
42             }
43            
44 60 100 100     2747 if( $was eq $_ ){ } # ignore quietly
    100          
    100          
    100          
45             elsif( -e $_ and not $options->{over_write} ) {
46 2 50 33     22 if (/\s/ or $was =~ /\s/ ) {
47 0         0 warn "'$was' not renamed: '$_' already exists\n";
48             }
49             else {
50 2         28 warn "$was not renamed: $_ already exists\n";
51             }
52 2         19 $errors ++;
53             }
54             elsif( $options->{no_action} ) {
55 2         16 print "rename($was, $_)\n";
56             }
57             elsif( CORE::rename($was,$_)) {
58 34 100       260 print "$was renamed as $_\n" if $options->{verbose};
59             }
60 1         22 else { warn "Can't rename $was $_: $!\n"; $errors ++; }
  1         8  
61             }
62 45         439 return !$errors;
63             }
64            
65             sub rename_list {
66 6     6 1 45228 my($code, $options, $fh, $file) = @_;
67 6         81 _default(\$options);
68             print "Reading filenames from ",
69             ( defined $file ? $file
70             : defined *{$fh}{SCALAR} and
71             defined ${*{$fh}{SCALAR}} ? ${*{$fh}{SCALAR}}
72             : "file handle ($fh)"
73             ),
74 6 100 33     68 "\n" if $options->{verbose};
75 6         46 my @file;
76             {
77 6 100       29 local $/ = "\0" if $options->{input_null};
  6         51  
78 6         242 chop(@file = <$fh>);
79             }
80 6         110 rename_files $code, $options, @file;
81             }
82            
83             sub rename {
84 23     23 1 7786 my($argv, $code, $verbose) = @_;
85 23 100       101 if( ref $code ) {
86 19 50       96 if( 'HASH' eq ref $code ) {
87 19 50       66 if(defined $verbose ) {
88 0         0 require Carp;
89 0         0 Carp::carp(<
90             File::Rename::rename: third argument ($verbose) ignored
91             CARP
92             }
93 19         72 $verbose = $code;
94 19         53 $code = delete $verbose->{_code};
95 19 50       62 unless ( $code ) {
96 0         0 require Carp;
97 0         0 Carp::carp(<
98             File::Rename::rename: no _code in $verbose
99             CARP
100             }
101            
102             }
103             }
104 23 50       70 unless( ref $code ) {
105 23 50       3480 if( my $eval = eval <
106             sub {
107             $code
108             }
109             CODE
110             {
111 23         79 $code = $eval;
112             }
113             else {
114 0         0 my $error = $@;
115 0         0 $error =~ s/\b(at\s+)\(eval\s+\d+\)\s/$1/g;
116 0         0 $error =~ s/(\s+line\s+)(\d+)\b/$1 . ($2-1)/eg;
  0         0  
117 0         0 $error =~ s/\.?\s*\z/, in:\n$code\n/;
118 0         0 die $error;
119             }
120             }
121 23 100       104 if( @$argv ) { rename_files $code, $verbose, @$argv }
  20         91  
122 3         98 else { rename_list $code, $verbose, \*STDIN, 'STDIN' }
123             }
124            
125             sub _default {
126 51     51   93 my $ref = shift;
127 51 100       192 return if ref $$ref;
128 12         20 my $verbose = $$ref;
129 12         64 $$ref = { verbose => $verbose }
130             }
131            
132             sub _config {
133             # copied from GetOpt::Long::import
134 20     20   39 my @syms = (); # symbols to import
135 20         37 my @config = (); # configuration
136 20         41 my $dest = \@syms; # symbols first
137 20         51 for ( @_ ) {
138 15 100       48 if ( $_ eq ':config' ) {
139 7         14 $dest = \@config; # config next
140 7         15 next;
141             }
142 8         22 push(@$dest, $_); # push
143             }
144 20         70 return (\@syms, \@config);
145             }
146            
147             1;
148            
149             __END__