From: Mischa POSLAWSKY Date: Thu, 19 Nov 2009 17:48:23 +0000 (+0100) Subject: fileset: replacement X-Git-Tag: v1.00~8 X-Git-Url: http://git.shiar.net/perl/file-rewrite.git/commitdiff_plain/6ad6da685e4d484f4937dfd8784195cbf6d3470f fileset: replacement --- diff --git a/lib/File/Rewrite.pm b/lib/File/Rewrite.pm index bb41513..5a30a32 100644 --- a/lib/File/Rewrite.pm +++ b/lib/File/Rewrite.pm @@ -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) { diff --git a/t/10-fileset.t b/t/10-fileset.t index ceb9ad5..c5a5709 100644 --- a/t/10-fileset.t +++ b/t/10-fileset.t @@ -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');