--- a/williamr/sbs_findstr.pl Mon Jun 29 17:33:23 2009 +0100
+++ b/williamr/sbs_findstr.pl Fri Jul 03 16:00:39 2009 +0100
@@ -15,24 +15,48 @@
# Filter an SBSv2 log to keep only recipes which match a specified RE
use strict;
+use Getopt::Long;
+
+my $sort_recipes = 0;
+GetOptions(
+ "s|sort" => \$sort_recipes, # sort output by <recipe> line
+ );
my $expression = shift @ARGV;
my $line;
my $skipping = 1;
my $current_target = "";
+my @buffer = ();
+my %recipes;
@ARGV = map {glob} @ARGV;
+sub save_buffer
+ {
+ return if (scalar @buffer == 0);
+ if ($sort_recipes)
+ {
+ my $recipe = shift @buffer;
+ $recipes{$recipe} = join("",@buffer);
+ }
+ else
+ {
+ print @buffer;
+ }
+ @buffer = ();
+ }
+
while ($line =<>)
{
if (substr($line,0,9) eq "</recipe>")
{
- print $line if ($skipping == 0);
+ push @buffer, $line if ($skipping == 0);
$skipping = 1; # set this to 0 to get the "between recipes" stuff
next;
}
if (substr($line,0,8) eq "<recipe ")
{
+ save_buffer();
if ($line =~ /$expression/io)
{
$skipping = 0;
@@ -52,5 +76,15 @@
{
substr($line,-3) = "$current_target />\n";
}
- print $line;
+ push @buffer, $line;
+ }
+
+save_buffer();
+
+if ($sort_recipes)
+ {
+ foreach my $recipe (sort keys %recipes)
+ {
+ print $recipe, $recipes{$recipe};
+ }
}
\ No newline at end of file