fileset: replacement
authorMischa POSLAWSKY <perl@shiar.org>
Thu, 19 Nov 2009 17:48:23 +0000 (18:48 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Wed, 2 Dec 2009 15:09:58 +0000 (16:09 +0100)
lib/File/Rewrite.pm
t/10-fileset.t

index bb41513654d7de4fd731fdccdfcb825628df5329..5a30a32989c80df3b8e91dca1ed9596333bef71e 100644 (file)
@@ -10,20 +10,30 @@ our @EXPORT_OK = qw(fileset);
 
 sub fileset {
        my ($filename, $replace, $search) = @_;
-       die if defined $replace;
+       $search = $replace if not defined $search;
        my $tmpname = "$filename.$$.tmp";
        my $changes = 0;
 
        open my $src,  '<', $filename;
        open my $dest, '>', $tmpname;
        while (readline $src) {
+               chomp;
                if ($_ =~ (ref $search ? $search : qr/^\Q$search\E$/)) {
+                       if (defined $replace and $_ eq $replace) {
+                               undef $replace;
+                       }
+                       else {
                                $changes++;
                                next;
+                       }
                }
                print {$dest} $_, $/;
        }
        close $src;
+       if (defined $replace) {
+               $changes++;
+               print {$dest} $replace, $/;
+       }
        close $dest;
 
        if ($changes) {
index ceb9ad57c7578edf24742f3071889884e97fe9b0..c5a5709d8e5ec9f46111d80fdaa4384dbc5e57d3 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 8;
+use Test::More tests => 13;
 use Test::NoWarnings;
 
 use autodie;
@@ -32,7 +32,13 @@ testfileset('no match',      $BASICBODY,    [undef, 'nomatch'], 0);
 testfileset('remove string', $BASICBODY,    [undef, 'remove'],  1);
 testfileset('remove empty',  "$/.$/ $/$/",  [undef, ''],        2);
 testfileset('remove regex',  $BASICBODY,    [undef, qr/^re/],   2);
-testfileset('remove all',    $BASICBODY,    [undef, qr/./],     4);
+testfileset('remove all',    $BASICBODY,    [undef, qr/./],     4, '');
 
-is(remove_tree($target), 6, 'no unexpected files');
+testfileset('add string',     "foo$/",      ['bar'],            1, "foo$/bar$/");
+testfileset('keep string',    "foo$/bar$/", ['foo'],            0, "foo$/bar$/");
+testfileset('replace string', "1$/2$/3$/",  [4, 1],             2, "2$/3$/4$/");
+testfileset('replace all',    $BASICBODY,   ['', qr/^re/],      3, "noremove$/.$/$/");
+testfileset('keep first',     "foo$/bar$/foo$/", ['foo'],       1, "foo$/bar$/");
+
+is(remove_tree($target), 11, 'no unexpected files');