CGI-Bus

 view release on metacpan or  search on metacpan

lib/CGI/Bus/fut.pm  view on Meta::CPAN

    $opt ="-${opt}p";
    $opt =~ tr/ri/Rf/;
    $s->parent->oscmd('cp', $opt, @_)
 }
 else {
    my $rsp =($opt =~/d/i ? 'D' : $opt =~/f/i ? 'F' : '');
    $opt =~s/(r)/SE/i; $opt =~s/(i)/C/i; $opt =~s/[fd]//ig; $opt =~s/(.{1})/\/$1/gi;
    my @cmd =('xcopy',"/H/R/K/Q$opt","\"$src\"","\"$dst\"");
    push @cmd, sub{print($rsp)} if $rsp && ($ENV{OS} && $ENV{OS}=~/windows_nt/i ? !-e $dst : !-d $dst);
    $s->parent->oscmd(@cmd)
 }
}



sub delete {
 my $s   =shift;
 my $opt =$_[0] =~/^\-/ || $_[0] eq '' ? shift : '';
 my $ret =1;
 $s->pushmsg("delete " .join(', ', @_));
 foreach my $par (@_) {
   foreach my $elem ($s->glob($par)) {
     if (-d $elem) {                 # '-r' - recurse subdirectories
        if ($opt =~/r/i && !$s->delete($opt,"$elem/*")) {
              $ret =0
        }
        elsif (!rmdir($elem)) {
              $ret =0;
              $opt =~/i/i || die("delete('$elem'): $!\n");
        }
     }
     elsif (-f $elem && !unlink($elem)) {
           $ret =0;
           $opt =~/i/i || die("delete('$elem'): $!\n");
     }
   }
 }
 $ret
}



sub find {
 my $s   =shift;
 my $opt =($_[0] =~/^\-/i ? shift : '');
 my ($sub, $i, $ret) =(0,0,0);
 local $_            if $opt !~/-\$/i;
 $opt =$opt ."-\$"   if $opt !~/-\$/i;
 foreach my $dir (@_) {
   $i++;
   if    ((!$sub || ref($dir)) && ref($_[$#_]) && $i <=$#_) {
         foreach my $elem (@_[$i..$#_]){if(ref($elem)){$sub =$elem; last}};
         next if ref($dir)
   }
   elsif (ref($dir)) {
         $sub =$dir; next
   }
   my $fs;
   foreach my $elem ($s->glob($dir)) {
     $_ =$elem;
     my @stat =stat($elem);
     my @nme  =(/^(.*)[\/\\]([^\/\\]+)$/ ? ($1,$2) : ('',''));
     if    (@stat ==0 && ($opt =~/[^!]*i/i || ($^O eq 'MSWin32' && $elem =~/[\?]/i))) {next} # bug in stat!
     elsif (@stat ==0) {die("stat('$elem'): $!\n"); undef($_); return(0)}
     elsif ($stat[2] & 0120000 && $opt =~/!.*s/i) {next} # symlink
     elsif (!defined($fs)) {$fs =$stat[2]}
     elsif ($fs !=$stat[2] && $opt =~/!.*m/i)  {next}    # mountpoint?
     if ($stat[2] & 0040000 && $opt =~/!.*l/i) {         # finddepth
        $ret +=$s->find($opt, "$elem/*", $sub); defined($_) || return(0);
        $_ =$elem;
     }
     if    ($stat[2] & 0040000 && $opt =~/!.*d/i) {}     # exclude dirs
     elsif (&$sub(\@stat,@nme)) {$ret +=1};
     defined($_) || return(0);                      # error stop: undef($_)
     if ($stat[2] & 0040000 && $opt !~/!.*[rl]/i) { # no recurse, $_[0]->[2] =0
        $ret +=$s->find($opt, "$elem/*", $sub); defined($_) || return(0);
     }
   }
 }
 $ret
}


sub glob {
 my $s =shift;
 my @ret;
 if    ($^O ne 'MSWin32') {
    CORE::glob(@_)
 }
 elsif (-e $_[0]) {
    push @ret, $_[0];
    @ret
 }
 else {
    my $msk =($_[0] =~/([^\/\\]+)$/i ? $1 : '');
    my $pth =substr($_[0],0,-length($msk));
    $msk =~s/\*\.\*/*/g;
    $msk =~s:(\(\)[].+^\-\${}[|]):\\$1:g;
    $msk =~s/\*/.*/g;
    $msk =~s/\?/.?/g;
    local (*DIR, $_); opendir(DIR, $pth eq '' ? './' : $pth) || die("open '$pth': $!\n");
    while(defined($_ =readdir(DIR))) {
      next if $_ eq '.' || $_ eq '..' || $_ !~/^$msk$/i;
      push @ret, "${pth}$_";
    }
    closedir(DIR) || die("close '$pth': $!\n");
    @ret
 }
}



sub globn {
 map {$_ =~/[\\\/]([^\\\/]+)$/ ? $1 : $_} shift->glob(@_)
}



sub mkdir {
 my ($s, $p, $m) =@_;
 $m =0777 if !$m;
 if (!-d $p) {
    $s->pushmsg("mkdir $p");
    my @p =split /[\\\/]/, $p; 



( run in 1.063 second using v1.01-cache-2.11-cpan-39bf76dae61 )