-sub walk_bugs {
- my ($dirs,$p,$what,$verbose,$sub,$n) = @_;
- my @dirs = @{$dirs};
- my $tot_dirs = @dirs;
- my $done_dirs = 0;
- my $avg_subfiles = 0;
- my $completed_files = 0;
- $n //= 1;
- while (my $dir = shift @dirs) {
- printf "Doing dir %s ...\n", $dir if $verbose;
-
- opendir(DIR, "$dir/.") or die "opendir $dir: $!";
- my @subdirs = readdir(DIR);
- closedir(DIR);
-
- my @list = map { m/^(\d+)\.$what$/?($1):() } @subdirs;
- $tot_dirs -= @dirs;
- push @dirs, map { m/^(\d+)$/ && -d "$dir/$1"?("$dir/$1"):() } @subdirs;
- $tot_dirs += @dirs;
- if ($avg_subfiles == 0) {
- $avg_subfiles = @list;
- }
-
- $p->target($avg_subfiles*($tot_dirs-$done_dirs)+$completed_files+@list) if $p;
- $avg_subfiles = ($avg_subfiles * $done_dirs + @list) / ($done_dirs+1);
- $done_dirs += 1;
-
- my $it = natatime $n,@list;
- while (my @bugs = $it->()) {
- $sub->(@bugs);
- $completed_files += scalar @bugs;
- $p->update($completed_files) if $p;
- print "Up to $completed_files bugs...\n"
- if ($completed_files % 100 == 0 && $verbose);
- }
- }
- $p->remove() if $p;
-}
-