package Iotta::Feeder::Recurse; use strict; require Iotta::Elem; our @ISA = ("Iotta::Elem"); sub run { my $self = shift; my $meta = shift; $self->recurse ($self->root, $meta); } sub recurse { my ($dir, @dirs, $self); $self = shift; $dir = shift; $self -> level ($self -> level + 1); my $filt = $self->filter; my $ign = $self->ignore; opendir (DIR, $dir); @dirs = readdir (DIR); closedir DIR; for (@dirs) { if (! /^\.$|^\.\.$/) { #print STDERR "iotta::ctrl::mfile::recurse: $_\n"; if ( -f "$dir/$_" && "$dir/$_" =~ $filt ) { $self->file_proc ("$dir/$_") if ("$dir/$_" !~ $ign); } elsif ( -d "$dir/$_" && ! /^\./) { $self->recurse ("$dir/$_") unless ("$dir/$_" eq "./".$self->{outdir}); } } } $self -> level ($self -> level - 1); } sub file_proc { my $self = shift; my $f = shift; my %meta = %{$self->meta}; my $i = 0; print STDERR "input=$f\n"; $meta{input} = $f; $meta{root_dir} = $self->root; $meta{top} = '.'; while ($i < $self -> level) { $meta{top} .= "/.."; $i ++; } $self->next->run(\%meta, 0) if ($self->next); } sub setup { my $self = shift; my $o = shift; $self->filter ($$o{filter}); $self->root ($$o{root}); $self->ignore ($$o{ignore}); $self->ignore ("^\$") unless ($self->ignore); } sub initialize { my $self = shift; $self->SUPER::initialize (@_); $self->{root}=""; $self->{filter}=""; $self->{ignore}=""; $self->{meta}={}; $self->{level} = -1; } 1;