home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / phing / tasks / system / DeleteTask.php < prev    next >
Encoding:
PHP Script  |  2007-02-05  |  10.3 KB  |  278 lines

  1. <?php
  2. /*
  3.  *  $Id: DeleteTask.php 144 2007-02-05 15:19:00Z hans $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information please see
  19.  * <http://phing.info>.
  20.  */
  21.  
  22. require_once 'phing/Task.php';
  23.  
  24. /**
  25.  * Deletes a file or directory, or set of files defined by a fileset.
  26.  * 
  27.  * @version   $Revision: 1.13 $
  28.  * @package   phing.tasks.system
  29.  */
  30. class DeleteTask extends Task {
  31.  
  32.     protected $file;
  33.     protected $dir;
  34.     protected $filesets = array();
  35.     protected $includeEmpty = false;
  36.  
  37.     protected $quiet = false;
  38.     protected $failonerror = true;
  39.     protected $verbosity = Project::MSG_VERBOSE;
  40.     
  41.     /** Any filelists of files that should be deleted. */
  42.     private $filelists = array();
  43.     
  44.     /** 
  45.      * Set the name of a single file to be removed.
  46.      * @param PhingFile $file
  47.      */
  48.     function setFile(PhingFile $file) {       
  49.         $this->file = $file;
  50.     }
  51.  
  52.     /** 
  53.      * Set the directory from which files are to be deleted.
  54.      * @param PhingFile $dir
  55.      */
  56.     function setDir(PhingFile $dir) {
  57.         $this->dir = $dir;
  58.     }
  59.  
  60.     /**
  61.      * Used to force listing of all names of deleted files.
  62.      * @param boolean $verbosity
  63.      */
  64.     function setVerbose($verbosity) {
  65.         if ($verbosity) {
  66.             $this->verbosity = Project::MSG_INFO;
  67.         } else {
  68.             $this->verbosity = Project::MSG_VERBOSE;
  69.         }
  70.     }
  71.  
  72.     /**
  73.      * If the file does not exist, do not display a diagnostic
  74.      * message or modify the exit status to reflect an error.
  75.      * This means that if a file or directory cannot be deleted,
  76.      * then no error is reported. This setting emulates the
  77.      * -f option to the Unix rm command. Default is false
  78.     * meaning things are verbose
  79.      */
  80.     function setQuiet($bool) {
  81.         $this->quiet = $bool;
  82.         if ($this->quiet) {
  83.             $this->failonerror = false;
  84.         }
  85.     }
  86.  
  87.     /** this flag means 'note errors to the output, but keep going' */
  88.     function setFailOnError($bool) {
  89.         $this->failonerror = $bool;
  90.     }
  91.  
  92.  
  93.     /** Used to delete empty directories.*/
  94.     function setIncludeEmptyDirs($includeEmpty) {
  95.         $this->includeEmpty = (boolean) $includeEmpty;
  96.     }
  97.  
  98.     /** Nested creator, adds a set of files (nested fileset attribute). */
  99.     function createFileSet() {
  100.         $num = array_push($this->filesets, new FileSet());
  101.         return $this->filesets[$num-1];
  102.     }
  103.     
  104.     /** Nested creator, adds a set of files (nested fileset attribute). */
  105.     function createFileList() {
  106.         $num = array_push($this->filelists, new FileList());
  107.         return $this->filelists[$num-1];
  108.     }
  109.  
  110.     /** Delete the file(s). */
  111.     function main() {
  112.         if ($this->file === null && $this->dir === null && count($this->filesets) === 0 && count($this->filelists) === 0) {
  113.             throw new BuildException("At least one of the file or dir attributes, or a fileset element, or a filelist element must be set.");
  114.         }
  115.  
  116.         if ($this->quiet && $this->failonerror) {
  117.             throw new BuildException("quiet and failonerror cannot both be set to true", $this->location);
  118.         }
  119.  
  120.         // delete a single file
  121.         if ($this->file !== null) {
  122.             if ($this->file->exists()) {
  123.                 if ($this->file->isDirectory()) {
  124.                     $this->log("Directory " . $this->file->__toString() . " cannot be removed using the file attribute. Use dir instead.");
  125.                 } else {
  126.                     $this->log("Deleting: " . $this->file->__toString());
  127.                     try {
  128.                         $this->file->delete();
  129.                     } catch(Exception $e) {
  130.                         $message = "Unable to delete file " . $this->file->__toString() .": " .$e->getMessage();
  131.                         if($this->failonerror) {
  132.                             throw new BuildException($message);
  133.                         } else {
  134.                             $this->log($message, $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  135.                         }                        
  136.                     }
  137.                 }
  138.             } else {
  139.                 $this->log("Could not find file " . $this->file->getAbsolutePath() . " to delete.",Project::MSG_VERBOSE);
  140.             }
  141.         }
  142.  
  143.         // delete the directory
  144.         if ($this->dir !== null && $this->dir->exists() && $this->dir->isDirectory()) {
  145.             if ($this->verbosity === Project::MSG_VERBOSE) {
  146.                 $this->log("Deleting directory " . $this->dir->__toString());
  147.             }
  148.             $this->removeDir($this->dir);
  149.         }
  150.         
  151.         // delete the files in the filelists
  152.         foreach($this->filelists as $fl) {
  153.             try {
  154.                 $files = $fl->getFiles($this->project);
  155.                 $this->removeFiles($fl->getDir($this->project), $files, $empty=array());
  156.             } catch (BuildException $be) {
  157.                 // directory doesn't exist or is not readable
  158.                     if ($this->failonerror) {
  159.                     throw $be;
  160.                 } else {
  161.                     $this->log($be->getMessage(), $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  162.                 }
  163.             }
  164.         }
  165.             
  166.         // delete the files in the filesets
  167.         foreach($this->filesets as $fs) {
  168.             try {
  169.                 $ds = $fs->getDirectoryScanner($this->project);
  170.                 $files = $ds->getIncludedFiles();
  171.                 $dirs = $ds->getIncludedDirectories();
  172.                 $this->removeFiles($fs->getDir($this->project), $files, $dirs);
  173.             } catch (BuildException $be) {
  174.                     // directory doesn't exist or is not readable
  175.                     if ($this->failonerror) {
  176.                         throw $be;
  177.                     } else {
  178.                         $this->log($be->getMessage(), $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  179.                     }
  180.                 }
  181.         }
  182.     }
  183.     
  184.     /**
  185.      * Recursively removes a directory.
  186.      * @param PhingFile $d The directory to remove.
  187.      */
  188.     private function removeDir($d) {
  189.         $list = $d->listDir();
  190.         if ($list === null) {
  191.             $list = array();
  192.         }
  193.         
  194.         foreach($list as $s) {
  195.             $f = new PhingFile($d, $s);
  196.             if ($f->isDirectory()) {
  197.                 $this->removeDir($f);
  198.             } else {
  199.                 $this->log("Deleting " . $f->__toString(), $this->verbosity);
  200.                 try {
  201.                     $f->delete();
  202.                 } catch (Exception $e) {
  203.                     $message = "Unable to delete file " . $f->__toString() . ": " . $e->getMessage();
  204.                     if($this->failonerror) {
  205.                         throw new BuildException($message);
  206.                     } else {
  207.                         $this->log($message, $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  208.                     }
  209.                 }               
  210.             }
  211.         }
  212.         $this->log("Deleting directory " . $d->getAbsolutePath(), $this->verbosity);
  213.         try {
  214.             $d->delete();
  215.         } catch (Exception $e) {
  216.             $message = "Unable to delete directory " . $d->__toString() . ": " . $e->getMessage();
  217.             if($this->failonerror) {
  218.               throw new BuildException($message);
  219.             } else {
  220.               $this->log($message, $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  221.             }
  222.         }               
  223.     }
  224.  
  225.     /**
  226.      * remove an array of files in a directory, and a list of subdirectories
  227.      * which will only be deleted if 'includeEmpty' is true
  228.      * @param PhingFile $d directory to work from
  229.      * @param array &$files array of files to delete; can be of zero length
  230.      * @param array &$dirs array of directories to delete; can of zero length
  231.      */
  232.     private function removeFiles(PhingFile $d, &$files, &$dirs) {
  233.         if (count($files) > 0) {
  234.             $this->log("Deleting " . count($files) . " files from " . $d->__toString());
  235.             for ($j=0,$_j=count($files); $j < $_j; $j++) {
  236.                 $f = new PhingFile($d, $files[$j]);
  237.                 $this->log("Deleting " . $f->getAbsolutePath(), $this->verbosity);
  238.                 try {
  239.                     $f->delete();
  240.                 } catch (Exception $e) {
  241.                     $message = "Unable to delete file " . $f->__toString() . ": " . $e->getMessage();
  242.                     if($this->failonerror) {
  243.                         throw new BuildException($message);
  244.                     } else {
  245.                         $this->log($message, $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  246.                     }
  247.                 }               
  248.  
  249.             }
  250.         }
  251.  
  252.         if (count($dirs) > 0 && $this->includeEmpty) {
  253.             $dirCount = 0;
  254.             for ($j=count($dirs)-1; $j>=0; --$j) {
  255.                 $dir = new PhingFile($d, $dirs[$j]);
  256.                 $dirFiles = $dir->listDir();
  257.                 if ($dirFiles === null || count($dirFiles) === 0) {
  258.                     $this->log("Deleting " . $dir->__toString(), $this->verbosity);
  259.                     try {
  260.                         $dir->delete();
  261.                         $dirCount++;
  262.                     } catch (Exception $e) {
  263.                         $message="Unable to delete directory " + $dir;
  264.                         if($this->failonerror) {
  265.                             throw new BuildException($message);
  266.                         } else {
  267.                             $this->log($message, $this->quiet ? Project::MSG_VERBOSE : Project::MSG_WARN);
  268.                         }
  269.                     }
  270.                 }
  271.             }
  272.             if ($dirCount > 0) {
  273.                 $this->log("Deleted $dirCount director" . ($dirCount==1 ? "y" : "ies") . " from " . $d->__toString());
  274.             }
  275.         }
  276.     }
  277. }
  278.