diff options
Diffstat (limited to 'buildscripts/phing/classes/phing/tasks/system/MoveTask.php')
-rw-r--r-- | buildscripts/phing/classes/phing/tasks/system/MoveTask.php | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/buildscripts/phing/classes/phing/tasks/system/MoveTask.php b/buildscripts/phing/classes/phing/tasks/system/MoveTask.php new file mode 100644 index 00000000..a3e94536 --- /dev/null +++ b/buildscripts/phing/classes/phing/tasks/system/MoveTask.php @@ -0,0 +1,197 @@ +<?php +/* + * $Id: MoveTask.php 59 2006-04-28 14:49:47Z mrook $ + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software consists of voluntary contributions made by many individuals + * and is licensed under the LGPL. For more information please see + * <http://phing.info>. + */ + +require_once 'phing/tasks/system/CopyTask.php'; +include_once 'phing/system/io/PhingFile.php'; +include_once 'phing/system/io/IOException.php'; + +/** + * Moves a file or directory to a new file or directory. + * + * By default, the destination file is overwritten if it + * already exists. When overwrite is turned off, then files + * are only moved if the source file is newer than the + * destination file, or when the destination file does not + * exist. + * + * Source files and directories are only deleted when the file or + * directory has been copied to the destination successfully. + * + * @version $Revision: 1.8 $ + * @package phing.tasks.system + */ +class MoveTask extends CopyTask { + + function __construct() { + parent::__construct(); + $this->forceOverwrite = true; + } + + protected function doWork() { + + $copyMapSize = count($this->fileCopyMap); + if ($copyMapSize > 0) { + // files to move + $this->log("Moving $copyMapSize files to " . $this->destDir->getAbsolutePath()); + + foreach($this->fileCopyMap as $from => $to) { + if ($from == $to) { + $this->log("Skipping self-move of $from", $this->verbosity); + continue; + } + + $moved = false; + $f = new PhingFile($from); + $d = new PhingFile($to); + + $moved = false; + try { // try to rename + $this->log("Attempting to rename $from to $to", $this->verbosity); + $this->renameFile($f, $d, $this->forceOverwrite); + $moved = true; + } catch (IOException $ioe) { + $moved = false; + $this->log("Failed to rename $from to $to: " . $ioe->getMessage(), $this->verbosity); + } + + if (!$moved) { + try { // try to move + $this->log("Moving $from to $to", $this->verbosity); + + $this->fileUtils->copyFile($f, $d, $this->forceOverwrite, $this->preserveLMT, $this->filterChains, $this->getProject()); + + $f = new PhingFile($fromFile); + $f->delete(); + } catch (IOException $ioe) { + $msg = "Failed to move $from to $to: " . $ioe->getMessage(); + throw new BuildException($msg, $this->location); + } + } // if !moved + } // foreach fileCopyMap + } // if copyMapSize + + // handle empty dirs if appropriate + if ($this->includeEmpty) { + $e = array_keys($this->dirCopyMap); + $count = 0; + foreach ($e as $dir) { + $d = new PhingFile((string) $dir); + if (!$d->exists()) { + if (!$d->mkdirs()) { + $this->log("Unable to create directory " . $d->getAbsolutePath(), PROJECT_MSG_ERR); + } else { + $count++; + } + } + } + if ($count > 0) { + $this->log("moved $count empty director" . ($count == 1 ? "y" : "ies") . " to " . $this->destDir->getAbsolutePath()); + } + } + + if (count($this->filesets) > 0) { + // process filesets + foreach($this->filesets as $fs) { + $dir = $fs->getDir($this->project); + if ($this->okToDelete($dir)) { + $this->deleteDir($dir); + } + } + } + } + + /** Its only ok to delete a dir tree if there are no files in it. */ + private function okToDelete($d) { + $list = $d->listDir(); + if ($list === null) { + return false; // maybe io error? + } + + foreach($list as $s) { + $f = new PhingFile($d, $s); + if ($f->isDirectory()) { + if (!$this->okToDelete($f)) { + return false; + } + } else { + // found a file + return false; + } + } + return true; + } + + /** Go and delete the directory tree. */ + private function deleteDir($d) { + + $list = $d->listDir(); + if ($list === null) { + return; // on an io error list() can return null + } + + foreach($list as $fname) { + $f = new PhingFile($d, $fname); + if ($f->isDirectory()) { + $this->deleteDir($f); + } else { + throw new BuildException("UNEXPECTED ERROR - The file " . $f->getAbsolutePath() . " should not exist!"); + } + } + + $this->log("Deleting directory " . $d->getPath(), $this->verbosity); + try { + $d->delete(); + } catch (Exception $e) { + throw new BuildException("Unable to delete directory " . $d->__toString() . ": " . $e->getMessage()); + } + } + + /** + * Attempts to rename a file from a source to a destination. + * If overwrite is set to true, this method overwrites existing file + * even if the destination file is newer. + * Otherwise, the source f + * ile is renamed only if the destination file # + * is older than it. + */ + private function renameFile(PhingFile $sourceFile, PhingFile $destFile, $overwrite) { + $renamed = true; + + // ensure that parent dir of dest file exists! + $parent = $destFile->getParentFile(); + if ($parent !== null) { + if (!$parent->exists()) { + $parent->mkdirs(); + } + } + if ($destFile->exists()) { + try { + $destFile->delete(); + } catch (Exception $e) { + throw new BuildException("Unable to remove existing file " . $destFile->__toString() . ": " . $e->getMessage()); + } + } + $renamed = $sourceFile->renameTo($destFile); + + return $renamed; + } +} +?> |