private function setOptions($pkg)
 {
     $options['baseinstalldir'] = 'propel';
     $options['packagedirectory'] = $this->dir->getAbsolutePath();
     if (empty($this->filesets)) {
         throw new BuildException("You must use a <fileset> tag to specify the files to include in the package.xml");
     }
     $options['filelistgenerator'] = 'Fileset';
     // Some PHING-specific options needed by our Fileset reader
     $options['phing_project'] = $this->getProject();
     $options['phing_filesets'] = $this->filesets;
     if ($this->packageFile !== null) {
         // create one w/ full path
         $f = new PhingFile($this->packageFile->getAbsolutePath());
         $options['packagefile'] = $f->getName();
         // must end in trailing slash
         $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
         $this->log("Creating package file: " . $f->getPath(), Project::MSG_INFO);
     } else {
         $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO);
     }
     // add install exceptions
     $options['installexceptions'] = array('pear/pear-propel-gen' => '/', 'pear/pear-propel-gen.bat' => '/', 'pear/pear-build.xml' => '/', 'pear/build.properties' => '/');
     $options['dir_roles'] = array('projects' => 'data', 'test' => 'test', 'templates' => 'data', 'resources' => 'data');
     $options['exceptions'] = array('pear/pear-propel-gen.bat' => 'script', 'pear/pear-propel-gen' => 'script', 'pear/pear-build.xml' => 'data', 'build.xml' => 'data', 'build-propel.xml' => 'data');
     $pkg->setOptions($options);
 }
 private function setOptions($pkg)
 {
     $options['baseinstalldir'] = 'phing';
     $options['packagedirectory'] = $this->dir->getAbsolutePath();
     if (empty($this->filesets)) {
         throw new BuildException("You must use a <fileset> tag to specify the files to include in the package.xml");
     }
     $options['filelistgenerator'] = 'Fileset';
     // Some PHING-specific options needed by our Fileset reader
     $options['phing_project'] = $this->getProject();
     $options['phing_filesets'] = $this->filesets;
     if ($this->packageFile !== null) {
         // create one w/ full path
         $f = new PhingFile($this->packageFile->getAbsolutePath());
         $options['packagefile'] = $f->getName();
         // must end in trailing slash
         $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
         $this->log("Creating package file: " . $f->getPath(), Project::MSG_INFO);
     } else {
         $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO);
     }
     if ($this->mode == "docs") {
         $options['dir_roles'] = array('phing_guide' => 'doc', 'api' => 'doc', 'example' => 'doc');
     } else {
         // add install exceptions
         $options['installexceptions'] = array('bin/phing.php' => '/', 'bin/pear-phing' => '/', 'bin/pear-phing.bat' => '/');
         $options['dir_roles'] = array('etc' => 'data');
         $options['exceptions'] = array('bin/pear-phing.bat' => 'script', 'bin/pear-phing' => 'script', 'CREDITS' => 'doc', 'CHANGELOG' => 'doc', 'README' => 'doc', 'UPGRADE' => 'doc', 'TODO' => 'doc');
     }
     $pkg->setOptions($options);
 }
Example #3
0
 private function setOptions($pkg)
 {
     $options = array();
     $options['baseinstalldir'] = 'spindash';
     $options['packagedirectory'] = $this->dir->getAbsolutePath();
     $options['filelistgenerator'] = 'Fileset';
     $options['phing_project'] = $this->getProject();
     $options['phing_filesets'] = $this->filesets;
     if (!is_null($this->packageFile)) {
         $f = new PhingFile($this->packageFile->getAbsolutePath());
         $options['packagefile'] = $f->getName();
         $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
         $this->log("Creating package file: " . $f->getPath(), Project::MSG_INFO);
     } else {
         $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO);
     }
     $pkg->setOptions($options);
 }
 private function setOptions($pkg)
 {
     $options['baseinstalldir'] = 'propel';
     $options['packagedirectory'] = $this->dir->getAbsolutePath();
     if (empty($this->filesets)) {
         throw new BuildException("You must use a <fileset> tag to specify the files to include in the package.xml");
     }
     $options['filelistgenerator'] = 'Fileset';
     // Some PHING-specific options needed by our Fileset reader
     $options['phing_project'] = $this->getProject();
     $options['phing_filesets'] = $this->filesets;
     if ($this->packageFile !== null) {
         // create one w/ full path
         $f = new PhingFile($this->packageFile->getAbsolutePath());
         $options['packagefile'] = $f->getName();
         // must end in trailing slash
         $options['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
         $this->log("Creating package file: " . $f->getPath(), Project::MSG_INFO);
     } else {
         $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO);
     }
     $pkg->setOptions($options);
 }
Example #5
0
 /**
  * Helper to get the parent file for a given file.
  *
  * @param PhingFile $file
  * @return PhingFile Parent file or null if none
  */
 private function _getParentFile(PhingFile $file)
 {
     $filename = $file->getAbsolutePath();
     $file = new PhingFile($filename);
     $filename = $file->getParent();
     return $filename === null ? null : new PhingFile($filename);
 }
Example #6
0
 /**
  * Adds the options that are set via attributes and the nested tags to the options array.
  */
 private function populateOptions()
 {
     // These values could be overridden if explicitly defined using nested tags
     $this->preparedOptions['package'] = $this->package;
     $this->preparedOptions['packagedirectory'] = $this->dir->getAbsolutePath();
     if ($this->packageFile !== null) {
         // create one w/ full path
         $f = new PhingFile($this->packageFile->getAbsolutePath());
         $this->preparedOptions['packagefile'] = $f->getName();
         // must end in trailing slash
         $this->preparedOptions['outputdirectory'] = $f->getParent() . DIRECTORY_SEPARATOR;
         $this->log("Creating package file: " . $f->__toString(), Project::MSG_INFO);
     } else {
         $this->log("Creating [default] package.xml file in base directory.", Project::MSG_INFO);
     }
     // converts option objects and mapping objects into
     // key => value options that can be passed to PEAR_PackageFileManager
     foreach ($this->options as $opt) {
         $this->preparedOptions[$opt->getName()] = $opt->getValue();
         //no arrays yet. preg_split('/\s*,\s*/', $opt->getValue());
     }
     foreach ($this->mappings as $map) {
         $value = $map->getValue();
         // getValue returns complex value
         if ($map->getName() == 'deps') {
             $value = $this->fixDeps($value);
         }
         $this->preparedOptions[$map->getName()] = $value;
     }
 }
Example #7
0
 /**
  * Main method builds all the targets for a typical propel project.
  */
 public function main()
 {
     // check to make sure task received all correct params
     $this->validate();
     $generatorConfig = $this->getGeneratorConfig();
     // loading model from database
     $this->log('Reading databases structure...');
     $connections = $generatorConfig->getBuildConnections();
     if (!$connections) {
         throw new Exception('You must define database connection settings in a buildtime-conf.xml file to use diff');
     }
     $totalNbTables = 0;
     $ad = new AppData();
     foreach ($connections as $name => $params) {
         $this->log(sprintf('Connecting to database "%s" using DSN "%s"', $name, $params['dsn']), Project::MSG_VERBOSE);
         $pdo = $generatorConfig->getBuildPDO($name);
         $database = new Database($name);
         $platform = $generatorConfig->getConfiguredPlatform($pdo);
         $database->setPlatform($platform);
         $database->setDefaultIdMethod(IDMethod::NATIVE);
         $parser = $generatorConfig->getConfiguredSchemaParser($pdo);
         $nbTables = $parser->parse($database, $this);
         $ad->addDatabase($database);
         $totalNbTables += $nbTables;
         $this->log(sprintf('%d tables imported from database "%s"', $nbTables, $name), Project::MSG_VERBOSE);
     }
     if ($totalNbTables) {
         $this->log(sprintf('%d tables imported from databases.', $totalNbTables));
     } else {
         $this->log('Database is empty');
     }
     // loading model from XML
     $this->packageObjectModel = true;
     $appDatasFromXml = $this->getDataModels();
     $appDataFromXml = array_pop($appDatasFromXml);
     // comparing models
     $this->log('Comparing models...');
     $manager = new PropelMigrationManager();
     $manager->setConnections($connections);
     $manager->setMigrationDir($this->getOutputDirectory());
     $migrationsUp = array();
     $migrationsDown = array();
     foreach ($ad->getDatabases() as $database) {
         $name = $database->getName();
         $this->log(sprintf('Comparing database "%s"', $name), Project::MSG_VERBOSE);
         if (!$appDataFromXml->hasDatabase($name)) {
             // FIXME: tables present in database but not in XML
             continue;
         }
         $databaseDiff = PropelDatabaseComparator::computeDiff($database, $appDataFromXml->getDatabase($name), $this->isCaseInsensitive());
         if (!$databaseDiff) {
             $this->log(sprintf('Same XML and database structures for datasource "%s" - no diff to generate', $name), Project::MSG_VERBOSE);
             continue;
         }
         $this->log(sprintf('Structure of database was modified in datasource "%s": %s', $name, $databaseDiff->getDescription()));
         $platform = $generatorConfig->getConfiguredPlatform(null, $name);
         $migrationsUp[$name] = $platform->getModifyDatabaseDDL($databaseDiff);
         $migrationsDown[$name] = $platform->getModifyDatabaseDDL($databaseDiff->getReverseDiff());
     }
     if (!$migrationsUp) {
         $this->log('Same XML and database structures for all datasource - no diff to generate');
         return;
     }
     $timestamp = time();
     $migrationFileName = $manager->getMigrationFileName($timestamp);
     $migrationClassBody = $manager->getMigrationClassBody($migrationsUp, $migrationsDown, $timestamp);
     $_f = new PhingFile($this->getOutputDirectory(), $migrationFileName);
     file_put_contents($_f->getAbsolutePath(), $migrationClassBody);
     $this->log(sprintf('"%s" file successfully created in %s', $_f->getName(), $_f->getParent()));
     if ($editorCmd = $this->getEditorCmd()) {
         $this->log(sprintf('Using "%s" as text editor', $editorCmd));
         shell_exec($editorCmd . ' ' . escapeshellarg($_f->getAbsolutePath()));
     } else {
         $this->log('  Please review the generated SQL statements, and add data migration code if necessary.');
         $this->log('  Once the migration class is valid, call the "migrate" task to execute it.');
     }
 }
 /**
  * Interpret the filename as a file relative to the given file -
  * unless the filename already represents an absolute filename.
  *
  * @param  $file the "reference" file for relative paths. This
  *         instance must be an absolute file and must not contain
  *         ./ or ../ sequences (same for \ instead of /).
  * @param  $filename a file name
  *
  * @return PhingFile A PhingFile object pointing to an absolute file that doesn't contain ./ or ../ sequences
  *         and uses the correct separator for the current platform.
  */
 function resolveFile($file, $filename)
 {
     // remove this and use the static class constant File::seperator
     // as soon as ZE2 is ready
     $fs = FileSystem::getFileSystem();
     $filename = str_replace('/', $fs->getSeparator(), str_replace('\\', $fs->getSeparator(), $filename));
     // deal with absolute files
     if (StringHelper::startsWith($fs->getSeparator(), $filename) || strlen($filename) >= 2 && Character::isLetter($filename[0]) && $filename[1] === ':') {
         return new PhingFile($this->normalize($filename));
     }
     if (strlen($filename) >= 2 && Character::isLetter($filename[0]) && $filename[1] === ':') {
         return new PhingFile($this->normalize($filename));
     }
     $helpFile = new PhingFile($file->getAbsolutePath());
     $tok = strtok($filename, $fs->getSeparator());
     while ($tok !== false) {
         $part = $tok;
         if ($part === '..') {
             $parentFile = $helpFile->getParent();
             if ($parentFile === null) {
                 $msg = "The file or path you specified ({$filename}) is invalid relative to " . $file->getPath();
                 throw new IOException($msg);
             }
             $helpFile = new PhingFile($parentFile);
         } else {
             if ($part === '.') {
                 // Do nothing here
             } else {
                 $helpFile = new PhingFile($helpFile, $part);
             }
         }
         $tok = strtok($fs->getSeparator());
     }
     return new PhingFile($helpFile->getAbsolutePath());
 }
Example #9
0
 /**
  * Check whether the file or directory denoted by the given abstract
  * pathname may be accessed by this process.  If the second argument is
  * false, then a check for read access is made; if the second
  * argument is true, then a check for write (not read-write)
  * access is made.  Return false if access is denied or an I/O error
  * occurs.
  */
 function checkAccess(PhingFile $f, $write = false)
 {
     // we clear stat cache, its expensive to look up from scratch,
     // but we need to be sure
     @clearstatcache();
     // Shouldn't this be $f->GetAbsolutePath() ?
     // And why doesn't GetAbsolutePath() work?
     $strPath = (string) $f->getPath();
     // FIXME
     // if file object does denote a file that yet not existst
     // path rights are checked
     if (!@file_exists($strPath) && !is_dir($strPath)) {
         $strPath = $f->getParent();
         if ($strPath === null || !is_dir($strPath)) {
             $strPath = Phing::getProperty("user.dir");
         }
         //$strPath = dirname($strPath);
     }
     if (!$write) {
         return (bool) @is_readable($strPath);
     } else {
         return (bool) @is_writable($strPath);
     }
 }
Example #10
0
 /**
  * @param PhingFile $file
  * @return bool
  * @throws IOException
  */
 private function _checkFile1(PhingFile $file)
 {
     // Resolve symbolic links
     if ($this->followSymlinks && $file->isLink()) {
         $linkTarget = new PhingFile($file->getLinkTarget());
         if ($linkTarget->isAbsolute()) {
             $file = $linkTarget;
         } else {
             $fs = FileSystem::getFileSystem();
             $file = new PhingFile($fs->resolve($fs->normalize($file->getParent()), $fs->normalize($file->getLinkTarget())));
         }
     }
     if ($this->type !== null) {
         if ($this->type === "dir") {
             return $file->isDirectory();
         } else {
             if ($this->type === "file") {
                 return $file->isFile();
             }
         }
     }
     return $file->exists();
 }
Example #11
0
 /**
  * Handles opening elements of the xml file.
  *
  * @param      string $uri
  * @param      string $localName The local name (without prefix), or the empty string if
  *		 Namespace processing is not being performed.
  * @param      string $rawName The qualified name (with prefix), or the empty string if
  *		 qualified names are not available.
  * @param      string $attributes The specified or defaulted attributes
  */
 public function startElement($name, $attributes)
 {
     try {
         $parentTag = $this->peekCurrentSchemaTag();
         if ($parentTag === false) {
             switch ($name) {
                 case "database":
                     if ($this->isExternalSchema()) {
                         $this->currentPackage = @$attributes["package"];
                         if ($this->currentPackage === null) {
                             $this->currentPackage = $this->defaultPackage;
                         }
                     } else {
                         $this->currDB = $this->app->addDatabase($attributes);
                     }
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "database") {
             switch ($name) {
                 case "external-schema":
                     $xmlFile = @$attributes["filename"];
                     //"referenceOnly" attribute is valid in the main schema XML file only,
                     //and it's ingnored in the nested external-schemas
                     if (!$this->isExternalSchema()) {
                         $isForRefOnly = @$attributes["referenceOnly"];
                         $this->isForReferenceOnly = $isForRefOnly !== null ? strtolower($isForRefOnly) === "true" : true;
                         // defaults to TRUE
                     }
                     if ($xmlFile[0] != '/') {
                         $f = new PhingFile($this->currentXmlFile);
                         $xf = new PhingFile($f->getParent(), $xmlFile);
                         $xmlFile = $xf->getPath();
                     }
                     $this->parseFile($xmlFile);
                     break;
                 case "domain":
                     $this->currDB->addDomain($attributes);
                     break;
                 case "table":
                     $this->currTable = $this->currDB->addTable($attributes);
                     if ($this->isExternalSchema()) {
                         $this->currTable->setForReferenceOnly($this->isForReferenceOnly);
                         $this->currTable->setPackage($this->currentPackage);
                     }
                     break;
                 case "vendor":
                     $this->currVendorObject = $this->currDB->addVendorInfo($attributes);
                     break;
                 case "behavior":
                     $this->currBehavior = $this->currDB->addBehavior($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "table") {
             switch ($name) {
                 case "column":
                     $this->currColumn = $this->currTable->addColumn($attributes);
                     break;
                 case "foreign-key":
                     $this->currFK = $this->currTable->addForeignKey($attributes);
                     break;
                 case "index":
                     $this->currIndex = $this->currTable->addIndex($attributes);
                     break;
                 case "unique":
                     $this->currUnique = $this->currTable->addUnique($attributes);
                     break;
                 case "vendor":
                     $this->currVendorObject = $this->currTable->addVendorInfo($attributes);
                     break;
                 case "validator":
                     $this->currValidator = $this->currTable->addValidator($attributes);
                     break;
                 case "id-method-parameter":
                     $this->currTable->addIdMethodParameter($attributes);
                     break;
                 case "behavior":
                     $this->currBehavior = $this->currTable->addBehavior($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "column") {
             switch ($name) {
                 case "inheritance":
                     $this->currColumn->addInheritance($attributes);
                     break;
                 case "vendor":
                     $this->currVendorObject = $this->currColumn->addVendorInfo($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "foreign-key") {
             switch ($name) {
                 case "reference":
                     $this->currFK->addReference($attributes);
                     break;
                 case "vendor":
                     $this->currVendorObject = $this->currUnique->addVendorInfo($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "index") {
             switch ($name) {
                 case "index-column":
                     $this->currIndex->addColumn($attributes);
                     break;
                 case "vendor":
                     $this->currVendorObject = $this->currIndex->addVendorInfo($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "unique") {
             switch ($name) {
                 case "unique-column":
                     $this->currUnique->addColumn($attributes);
                     break;
                 case "vendor":
                     $this->currVendorObject = $this->currUnique->addVendorInfo($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "behavior") {
             switch ($name) {
                 case "parameter":
                     $this->currBehavior->addParameter($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "validator") {
             switch ($name) {
                 case "rule":
                     $this->currValidator->addRule($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } elseif ($parentTag == "vendor") {
             switch ($name) {
                 case "parameter":
                     $this->currVendorObject->addParameter($attributes);
                     break;
                 default:
                     $this->_throwInvalidTagException($name);
             }
         } else {
             // it must be an invalid tag
             $this->_throwInvalidTagException($name);
         }
         $this->pushCurrentSchemaTag($name);
     } catch (BuildException $e) {
         throw $e;
     } catch (Exception $e) {
         echo $e;
         echo "\n";
         throw $e;
     }
 }
Example #12
0
 /**
  * Helper to get the parent file for a given file.
  *
  * @param PhingFile $file
  * @return PhingFile Parent file or null if none
  */
 function _getParentFile(PhingFile $file)
 {
     $filename = $file->getAbsolutePath();
     $file = new PhingFile($filename);
     $filename = $file->getParent();
     if ($filename !== null && self::$msgOutputLevel >= PROJECT_MSG_VERBOSE) {
         print "Searching in {$filename}\n";
     }
     return $filename === null ? null : new PhingFile($filename);
 }
Example #13
0
 /**
  * Helper to get the parent file for a given file.
  *
  * @param PhingFile $file
  * @return PhingFile Parent file or null if none
  */
 private function _getParentFile(PhingFile $file)
 {
     $filename = $file->getAbsolutePath();
     $file = new PhingFile($filename);
     $filename = $file->getParent();
     if ($filename !== null && self::$msgOutputLevel >= Project::MSG_VERBOSE) {
         self::$out->write("Searching in {$filename}" . self::getProperty("line.separator"));
     }
     return $filename === null ? null : new PhingFile($filename);
 }