File Coverage

blib/lib/File/PerlMove.pm
Criterion Covered Total %
statement 53 60 88.3
branch 23 34 67.6
condition 9 17 52.9
subroutine 7 7 100.0
pod 0 2 0.0
total 92 120 76.6


line stmt bran cond sub pod time code
1             #!/usr/bin/perl -w
2              
3             package File::PerlMove;
4              
5             # Author : Johan Vromans
6             # Created On : Tue Sep 15 15:59:04 1992
7             # Last Modified By: Johan Vromans
8             # Last Modified On: Mon Apr 24 10:04:57 2017
9             # Update Count : 177
10             # Status : Unknown, Use with caution!
11              
12             ################ Common stuff ################
13              
14             our $VERSION = "1.01";
15              
16 4     4   53626 use strict;
  4         9  
  4         100  
17 4     4   18 use warnings;
  4         9  
  4         95  
18 4     4   18 use Carp;
  4         15  
  4         246  
19 4     4   25 use File::Basename;
  4         7  
  4         244  
20 4     4   21 use File::Path;
  4         11  
  4         1803  
21              
22             sub move {
23 10     10 0 11016 my $transform = shift;
24 10         22 my $filelist = shift;
25 10   100     44 my $options = shift || {};
26 10         20 my $result = 0;
27              
28 10 50 33     65 croak("Usage: ", __PACKAGE__, "::move(" .
29             "operation, [ file names ], { options })")
30             unless defined $transform && defined $filelist;
31              
32             # For those who misunderstood the docs.
33 10   33     62 $options->{showonly} ||= delete $options->{'dry-run'};
34 10   66     50 $options->{createdirs} ||= delete $options->{'create-dirs'};
35              
36             # Create transformer.
37 10 100       42 $transform = build_sub($transform)
38             unless ref($transform) eq 'CODE';
39              
40             # Process arguments.
41 10 50       34 @$filelist = reverse(@$filelist) if $options->{reverse};
42 10         30 foreach ( @$filelist ) {
43             # Save the name.
44 10         18 my $old = $_;
45             # Perform the transformation.
46 10         188 $transform->();
47             # Get the new name.
48 10         33 my $new = $_;
49              
50             # Anything changed?
51 10 50       37 unless ( $old eq $new ) {
52              
53             # Create directories.
54 10 100       31 if ( $options->{createdirs} ) {
55 1         51 my $dir = dirname($new);
56 1 50       10 unless ( -d $dir ) {
57 1 50       4 if ( $options->{showonly} ) {
58 0         0 warn("[Would create: $dir]\n");
59             }
60             else {
61 1         98 mkpath($dir, $options->{verbose}, 0777);
62             }
63             }
64             }
65              
66             # Dry run.
67 10 50 33     50 if ( $options->{verbose} || $options->{showonly} ) {
68 0         0 warn("$old => $new\n");
69 0 0       0 next if $options->{showonly};
70             }
71              
72             # Check for overwriting target.
73 10 100 66     197 if ( ! $options->{overwrite} && -e $new ) {
74 2         28 warn("$new: exists\n");
75 2         21 next;
76             }
77              
78             # Perform.
79 8         20 my $res = -1;
80 8 100       31 if ( $options->{symlink} ) {
    100          
81 1         39 $res = symlink($old, $new);
82             }
83             elsif ( $options->{link} ) {
84 1         26 $res = link($old, $new);
85             }
86             else {
87 6         148 $res = rename($old, $new);
88             }
89 8 100       31 if ( $res == 1 ) {
90 7         22 $result++;
91             }
92             else {
93             # Force error numbers (for locale independency).
94             warn($options->{errno}
95 1 50       16 ? "$old: ".(0+$!)."\n"
96             : "$old: $!\n");
97             }
98             }
99             }
100              
101 10         115 $result;
102             }
103              
104             sub build_sub {
105 9     9 0 21 my $cmd = shift;
106             # Special treatment for some.
107 9 100       57 if ( $cmd =~ /^(uc|lc|ucfirst)$/ ) {
    50          
108 2         6 $cmd = '$_ = ' . $cmd;
109             }
110             elsif ( $cmd =~ /^:(.+):(.+):$/ ) {
111 0         0 require Encode;
112 0         0 $cmd = 'Encode::from_to($_,"'.$1.'","'.$2.'")';
113             }
114              
115             # Build subroutine.
116 9         672 my $op = eval "sub { $cmd }";
117 9 50       38 if ( $@ ) {
118 0         0 $@ =~ s/ at \(eval.*/./;
119 0         0 croak($@);
120             }
121              
122 9         23 return $op;
123             }
124              
125             1;
126              
127             __END__