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) {
use strict;
use warnings;
-use Test::More tests => 8;
+use Test::More tests => 13;
use Test::NoWarnings;
use autodie;
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');