ReplaceOp.php

Same filename and directory in other branches
  1. 9 composer/Plugin/Scaffold/Operations/ReplaceOp.php
  2. 8.9.x composer/Plugin/Scaffold/Operations/ReplaceOp.php
  3. 10 composer/Plugin/Scaffold/Operations/ReplaceOp.php

Namespace

Drupal\Composer\Plugin\Scaffold\Operations

File

composer/Plugin/Scaffold/Operations/ReplaceOp.php

View source
<?php

namespace Drupal\Composer\Plugin\Scaffold\Operations;

use Composer\IO\IOInterface;
use Composer\Util\Filesystem;
use Drupal\Composer\Plugin\Scaffold\ScaffoldFilePath;
use Drupal\Composer\Plugin\Scaffold\ScaffoldOptions;

/**
 * Scaffold operation to copy or symlink from source to destination.
 *
 * @internal
 */
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);
    }

}

Classes

Title Deprecated Summary
ReplaceOp Scaffold operation to copy or symlink from source to destination.

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