瀏覽代碼

Dpkg::Dist::Files: Add new filter() method

Guillem Jover 11 年之前
父節點
當前提交
a58dd78cb1
共有 2 個文件被更改,包括 46 次插入1 次删除
  1. 14 0
      scripts/Dpkg/Dist/Files.pm
  2. 32 1
      scripts/t/Dpkg_Dist_Files.t

+ 14 - 0
scripts/Dpkg/Dist/Files.pm

@@ -130,6 +130,20 @@ sub del_file {
     delete $self->{files}->{$filename};
 }
 
+sub filter {
+    my ($self, %opts) = @_;
+    my $remove = $opts{remove} // sub { 0 };
+    my $keep = $opts{keep} // sub { 1 };
+
+    foreach my $filename (keys %{$self->{files}}) {
+        my $file = $self->{files}->{$filename};
+
+        if (not &$keep($file) or &$remove($file)) {
+            delete $self->{files}->{$filename};
+        }
+    }
+}
+
 sub output {
     my ($self, $fh) = @_;
     my $str = '';

+ 32 - 1
scripts/t/Dpkg_Dist_Files.t

@@ -16,7 +16,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 17;
+use Test::More tests => 20;
 
 use_ok('Dpkg::Dist::Files');
 
@@ -116,4 +116,35 @@ is($dist->get_file('unknown'), undef, 'Get unknown file');
 is($dist->get_file('pkg-indep_0.0.1-2_all.deb'), undef, 'Get deleted file');
 is($dist->output(), $expected, 'Modified dist object');
 
+$expected = <<'FILES';
+pkg-arch_2.0.0_amd64.deb admin required
+pkg-indep_0.0.1-2_all.deb net standard
+pkg-templ_1.2.3_arch.type section priority
+FILES
+
+$dist->reset();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+$dist->filter(remove => sub { $_[0]->{priority} eq 'optional' });
+is($dist->output(), $expected, 'Filter remove piority optional');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional
+other_0.txt text optional
+FILES
+
+$dist->reset();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+$dist->filter(keep => sub { $_[0]->{priority} eq 'optional' });
+is($dist->output(), $expected, 'Filter keep priority optional');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional
+FILES
+
+$dist->reset();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+$dist->filter(remove => sub { $_[0]->{section} eq 'text' },
+              keep => sub { $_[0]->{priority} eq 'optional' });
+is($dist->output(), $expected, 'Filter remove section text, keep priority optional');
+
 1;