Example #1
0
 /**
  * Imports a package from a gzip compressed tarball file
  *
  * @param string $archiveName Path to the archive file
  * @param string $packageName Package name
  * @param bool $dbAvailable
  * @param bool $repositoryID
  *
  * @return eZPackage The eZPackage object if successfull, or one of the
  *         STATUS_* class constants if an error occurs
  */
 static function import($archiveName, &$packageName, $dbAvailable = true, $repositoryID = false)
 {
     if (is_dir($archiveName)) {
         eZDebug::writeError("Importing from directory is not supported.");
         $retValue = false;
         return $retValue;
     } else {
         $tempDirPath = eZPackage::temporaryImportPath();
         // make a temporary directory to extract the package file to
         do {
             $archivePath = eZDir::path(array($tempDirPath, mt_rand()));
         } while (file_exists($archivePath));
         eZDir::mkdir($archivePath, false, true);
         $archiveOptions = new ezcArchiveOptions(array('readOnly' => true));
         // Fix for issue #15891: ezjscore - file names are cutted
         // Force the type of the archive as ezcArchive::TAR_GNU so that long file names are supported on Windows
         // The previous value for the second parameter was null which meant the type was guessed from the
         // archive, but on Windows it was detected as TAR_USTAR and this lead to filenames being limited
         // to 100 characters
         $archive = ezcArchive::open("compress.zlib://{$archiveName}", ezcArchive::TAR_GNU, $archiveOptions);
         $fileList = array();
         $fileList[] = eZPackage::definitionFilename();
         // Search for the files we want to extract
         foreach ($archive as $entry) {
             if (in_array($entry->getPath(), $fileList)) {
                 if (!$archive->extractCurrent($archivePath)) {
                     eZDebug::writeError("Failed extracting package definition file from {$archivePath}");
                     return false;
                 }
             }
         }
         $definitionFileName = eZDir::path(array($archivePath, self::definitionFilename()));
         $package = eZPackage::fetchFromFile($definitionFileName);
         eZPackage::removeFiles($archivePath);
         if ($package) {
             $packageName = $package->attribute('name');
             if (!self::isValidName($packageName)) {
                 return eZPackage::STATUS_INVALID_NAME;
             }
             if (!$repositoryID) {
                 $repositoryID = $package->attribute('vendor-dir');
             }
             $existingPackage = eZPackage::fetch($packageName, false, false, $dbAvailable);
             if ($existingPackage) {
                 return eZPackage::STATUS_ALREADY_EXISTS;
             }
             unset($package);
             $fullRepositoryPath = eZPackage::repositoryPath() . '/' . $repositoryID;
             $packagePath = $fullRepositoryPath . '/' . $packageName;
             if (!file_exists($packagePath)) {
                 eZDir::mkdir($packagePath, false, true);
             }
             $archive->extract($packagePath);
             $package = eZPackage::fetch($packageName, $fullRepositoryPath, false, $dbAvailable);
             if (!$package) {
                 eZDebug::writeError("Failed loading imported package {$packageName} from {$fullRepositoryPath}");
             }
         } else {
             eZDebug::writeError("Failed loading temporary package {$packageName}");
         }
         return $package;
     }
 }