You are here

public function Updater::prepareInstallDirectory in Drupal 7

Make sure the installation parent directory exists and is writable.

Parameters

FileTransfer $filetransfer: Object which is a child of FileTransfer.

string $directory: The installation directory to prepare.

2 calls to Updater::prepareInstallDirectory()
Updater::install in includes/updater.inc
Installs a Drupal project, returns a list of next actions.
Updater::update in includes/updater.inc
Updates a Drupal project, returns a list of next actions.

File

includes/updater.inc, line 308
Classes used for updating various files in the Drupal webroot. These classes use a FileTransfer object to actually perform the operations. Normally, the FileTransfer is provided when the site owner is redirected to authorize.php as part of a multistep…

Class

Updater
Base class for Updaters used in Drupal.

Code

public function prepareInstallDirectory(&$filetransfer, $directory) {

  // Make the parent dir writable if need be and create the dir.
  if (!is_dir($directory)) {
    $parent_dir = dirname($directory);
    if (!is_writable($parent_dir)) {
      @chmod($parent_dir, 0755);

      // It is expected that this will fail if the directory is owned by the
      // FTP user. If the FTP user == web server, it will succeed.
      try {
        $filetransfer
          ->createDirectory($directory);
        $this
          ->makeWorldReadable($filetransfer, $directory);
      } catch (FileTransferException $e) {

        // Probably still not writable. Try to chmod and do it again.
        // @todo: Make a new exception class so we can catch it differently.
        try {
          $old_perms = substr(sprintf('%o', fileperms($parent_dir)), -4);
          $filetransfer
            ->chmod($parent_dir, 0755);
          $filetransfer
            ->createDirectory($directory);
          $this
            ->makeWorldReadable($filetransfer, $directory);

          // Put the permissions back.
          $filetransfer
            ->chmod($parent_dir, intval($old_perms, 8));
        } catch (FileTransferException $e) {
          $message = t($e
            ->getMessage(), $e->arguments);
          $throw_message = t('Unable to create %directory due to the following: %reason', array(
            '%directory' => $directory,
            '%reason' => $message,
          ));
          throw new UpdaterException($throw_message);
        }
      }

      // Put the parent directory back.
      @chmod($parent_dir, 0555);
    }
  }
}