class ReplaceOp

Same name and namespace in other branches
  1. 8.9.x composer/Plugin/Scaffold/Operations/ReplaceOp.php \Drupal\Composer\Plugin\Scaffold\Operations\ReplaceOp
  2. 10 composer/Plugin/Scaffold/Operations/ReplaceOp.php \Drupal\Composer\Plugin\Scaffold\Operations\ReplaceOp
  3. 11.x composer/Plugin/Scaffold/Operations/ReplaceOp.php \Drupal\Composer\Plugin\Scaffold\Operations\ReplaceOp

Scaffold operation to copy or symlink from source to destination.

@internal

Hierarchy

Expanded class hierarchy of ReplaceOp

2 files declare their use of ReplaceOp
Fixtures.php in core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Fixtures.php
ReplaceOpTest.php in core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Integration/ReplaceOpTest.php

File

composer/Plugin/Scaffold/Operations/ReplaceOp.php, line 15

Namespace

Drupal\Composer\Plugin\Scaffold\Operations
View source
class ReplaceOp extends AbstractOperation {
    
    /**
     * Identifies Replace operations.
     */
    const ID = 'replace';
    
    /**
     * The relative path to the source file.
     *
     * @var \Drupal\Composer\Plugin\Scaffold\ScaffoldFilePath
     */
    protected $source;
    
    /**
     * Whether to overwrite existing files.
     *
     * @var bool
     */
    protected $overwrite;
    
    /**
     * Constructs a ReplaceOp.
     *
     * @param \Drupal\Composer\Plugin\Scaffold\ScaffoldFilePath $sourcePath
     *   The relative path to the source file.
     * @param bool $overwrite
     *   Whether to allow this scaffold file to overwrite files already at
     *   the destination. Defaults to TRUE.
     */
    public function __construct(ScaffoldFilePath $sourcePath, $overwrite = TRUE) {
        $this->source = $sourcePath;
        $this->overwrite = $overwrite;
    }
    
    /**
     * {@inheritdoc}
     */
    protected function generateContents() {
        return file_get_contents($this->source
            ->fullPath());
    }
    
    /**
     * {@inheritdoc}
     */
    public function process(ScaffoldFilePath $destination, IOInterface $io, ScaffoldOptions $options) {
        $fs = new Filesystem();
        $destination_path = $destination->fullPath();
        // Do nothing if overwrite is 'false' and a file already exists at the
        // destination.
        if ($this->overwrite === FALSE && file_exists($destination_path)) {
            $interpolator = $destination->getInterpolator();
            $io->write($interpolator->interpolate("  - Skip <info>[dest-rel-path]</info> because it already exists and overwrite is <comment>false</comment>."));
            return new ScaffoldResult($destination, FALSE);
        }
        // Get rid of the destination if it exists, and make sure that
        // the directory where it's going to be placed exists.
        $fs->remove($destination_path);
        $fs->ensureDirectoryExists(dirname($destination_path));
        if ($options->symlink()) {
            return $this->symlinkScaffold($destination, $io);
        }
        return $this->copyScaffold($destination, $io);
    }
    
    /**
     * Copies the scaffold file.
     *
     * @param \Drupal\Composer\Plugin\Scaffold\ScaffoldFilePath $destination
     *   Scaffold file to process.
     * @param \Composer\IO\IOInterface $io
     *   IOInterface to writing to.
     *
     * @return \Drupal\Composer\Plugin\Scaffold\Operations\ScaffoldResult
     *   The scaffold result.
     */
    protected function copyScaffold(ScaffoldFilePath $destination, IOInterface $io) {
        $interpolator = $destination->getInterpolator();
        $this->source
            ->addInterpolationData($interpolator);
        if (file_put_contents($destination->fullPath(), $this->contents()) === FALSE) {
            throw new \RuntimeException($interpolator->interpolate("Could not copy source file <info>[src-rel-path]</info> to <info>[dest-rel-path]</info>!"));
        }
        $io->write($interpolator->interpolate("  - Copy <info>[dest-rel-path]</info> from <info>[src-rel-path]</info>"));
        return new ScaffoldResult($destination, $this->overwrite);
    }
    
    /**
     * Symlinks the scaffold file.
     *
     * @param \Drupal\Composer\Plugin\Scaffold\ScaffoldFilePath $destination
     *   Scaffold file to process.
     * @param \Composer\IO\IOInterface $io
     *   IOInterface to writing to.
     *
     * @return \Drupal\Composer\Plugin\Scaffold\Operations\ScaffoldResult
     *   The scaffold result.
     */
    protected function symlinkScaffold(ScaffoldFilePath $destination, IOInterface $io) {
        $interpolator = $destination->getInterpolator();
        try {
            $fs = new Filesystem();
            $fs->relativeSymlink($this->source
                ->fullPath(), $destination->fullPath());
        } catch (\Exception $e) {
            throw new \RuntimeException($interpolator->interpolate("Could not symlink source file <info>[src-rel-path]</info> to <info>[dest-rel-path]</info>!"), [], $e);
        }
        $io->write($interpolator->interpolate("  - Link <info>[dest-rel-path]</info> from <info>[src-rel-path]</info>"));
        return new ScaffoldResult($destination, $this->overwrite);
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
AbstractOperation::$contents protected property Cached contents of scaffold file to be written to disk.
AbstractOperation::contents final public function Returns the exact data that will be written to the scaffold files. Overrides OperationInterface::contents
AbstractOperation::scaffoldAtNewLocation public function Determines what to do if operation is used without a previous operation. Overrides OperationInterface::scaffoldAtNewLocation 1
AbstractOperation::scaffoldOverExistingTarget public function Determines what to do if operation is used at same path as a previous op. Overrides OperationInterface::scaffoldOverExistingTarget 1
ReplaceOp::$overwrite protected property Whether to overwrite existing files.
ReplaceOp::$source protected property The relative path to the source file.
ReplaceOp::copyScaffold protected function Copies the scaffold file.
ReplaceOp::generateContents protected function Load the scaffold contents or otherwise generate what is needed. Overrides AbstractOperation::generateContents
ReplaceOp::ID constant Identifies Replace operations.
ReplaceOp::process public function Process this scaffold operation. Overrides OperationInterface::process
ReplaceOp::symlinkScaffold protected function Symlinks the scaffold file.
ReplaceOp::__construct public function Constructs a ReplaceOp.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.