[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [OSSTEST PATCH 2/4] cs-adjust-flight: Lift notspec_exfn out of for_things
We are going to want to reuse this, so abstract it away. As a side effect we now support negated exact matches. No other functional change, except to debug output. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- cs-adjust-flight | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/cs-adjust-flight b/cs-adjust-flight index 02fd2cf..33ff9df 100755 --- a/cs-adjust-flight +++ b/cs-adjust-flight @@ -90,6 +90,28 @@ sub spec_re ($) { return undef; } +sub notspec_exfn ($$) { + my ($what, $spec) = @_; + # returns ($fn, $exact) + # where $exact is undef, or a thing that can be tested with eq + # and $fn->($candidate) will be boolish + my $not = ($spec =~ s/^\!//) ? 'NOT' : ''; + my $re = spec_re($spec); + debug("$what $not \`$spec' RE ", + (defined($re) ? "/$re/" : "<undef>"), "\n"); + if (defined $re) { + debug("$what REMATCHER\n"); + return (sub { $_[0] =~ qr{$re} xor $not }, + undef); + } elsif ($not) { + return (sub { $_[0] ne $spec }, + undef); + } else { + return (sub { $_[0] eq $spec }, + $spec); + } +} + sub debug { print STDERR @_ if $debug; } sub verbose (@) { $verbose_buffer .= $_ foreach @_; } @@ -109,20 +131,16 @@ sub for_things ($$$$$$$) { my $things_q = $things_q{$table} ||= $dbh_tests->prepare ("SELECT * FROM $table WHERE $basecond"); - my $not = ($spec =~ s/^\!//) ? 'NOT' : ''; - my $re = spec_re($spec); - debug("FOR_THINGS $table.$keycol $not \`$spec' RE ", - (defined($re) ? "/$re/" : "<undef>"), "\n"); - if (!defined $re) { - die "cannot negate <foo-name>" if $not; - $thing_q->execute(@$basecondvals, $spec); + my ($specfn,$exact) = notspec_exfn("FOR_THINGS $table.$keycol",$spec); + if (defined $exact) { + $thing_q->execute(@$basecondvals, $exact); my $row = $thing_q->fetchrow_hashref(); if ($row) { debug("FOR_THINGS $table.$keycol \`$spec' EXACT\n"); - $fn->($spec,$row); + $fn->($exact,$row); } elsif ($ifnone) { debug("FOR_THINGS $table.$keycol \`$spec' MISSING REPORT\n"); - $ifnone->($spec); + $ifnone->($exact); } else { debug("FOR_THINGS $table.$keycol \`$spec' MISSING IGNORED\n"); } @@ -130,8 +148,8 @@ sub for_things ($$$$$$$) { $things_q->execute(@$basecondvals); while (my $row = $things_q->fetchrow_hashref()) { my $thing = $row->{$keycol}; - next unless $thing =~ m/$re/ xor $not; - debug("FOR_THINGS $table.$keycol $not \`$spec' FOUND $row->{$keycol}\n"); + next unless $specfn->($thing); + debug("FOR_THINGS $table.$keycol \`$spec' FOUND $row->{$keycol}\n"); $fn->($thing, $row); } } -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |