Add drupal scaffold
This commit is contained in:
parent
6fa31ad086
commit
3e6a5cbed2
2
web/.gitignore
vendored
2
web/.gitignore
vendored
|
@ -57,3 +57,5 @@ Thumbs.db
|
||||||
# Things in the core directory that Drupal 8 commits in the repository.
|
# Things in the core directory that Drupal 8 commits in the repository.
|
||||||
!core/**/*.gz
|
!core/**/*.gz
|
||||||
|
|
||||||
|
# Ignore any extra git folders.
|
||||||
|
*/.git/
|
||||||
|
|
1
web/vendor/drupal-composer/drupal-scaffold
vendored
1
web/vendor/drupal-composer/drupal-scaffold
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit 3ad465ac853c2e52e6a808f5529859917662c256
|
|
17
web/vendor/drupal-composer/drupal-scaffold/.editorconfig
vendored
Normal file
17
web/vendor/drupal-composer/drupal-scaffold/.editorconfig
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# Drupal editor configuration normalization
|
||||||
|
# @see http://editorconfig.org/
|
||||||
|
|
||||||
|
# This is the top-most .editorconfig file; do not search in parent directories.
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# All files.
|
||||||
|
[*]
|
||||||
|
end_of_line = LF
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[{composer.json,composer.lock}]
|
||||||
|
indent_size = 4
|
1
web/vendor/drupal-composer/drupal-scaffold/.gitignore
vendored
Normal file
1
web/vendor/drupal-composer/drupal-scaffold/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
vendor
|
25
web/vendor/drupal-composer/drupal-scaffold/.travis.yml
vendored
Normal file
25
web/vendor/drupal-composer/drupal-scaffold/.travis.yml
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
language: php
|
||||||
|
php:
|
||||||
|
- 5.5
|
||||||
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
git:
|
||||||
|
depth: 10000
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- phpenv config-rm xdebug.ini
|
||||||
|
- composer --verbose self-update
|
||||||
|
- composer --version
|
||||||
|
|
||||||
|
install:
|
||||||
|
- composer --verbose install
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- git config --global user.email "travisci@example.com"
|
||||||
|
- git config --global user.name "Travis CI Test"
|
||||||
|
|
||||||
|
script:
|
||||||
|
- ./vendor/bin/phpunit
|
120
web/vendor/drupal-composer/drupal-scaffold/README.md
vendored
Normal file
120
web/vendor/drupal-composer/drupal-scaffold/README.md
vendored
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
# drupal-scaffold
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/drupal-composer/drupal-scaffold.svg?branch=master)](https://travis-ci.org/drupal-composer/drupal-scaffold)
|
||||||
|
|
||||||
|
Composer plugin for automatically downloading Drupal scaffold files (like
|
||||||
|
`index.php`, `update.php`, …) when using `drupal/core` via Composer.
|
||||||
|
|
||||||
|
It is recommended that the vendor directory be placed in its standard location
|
||||||
|
at the project root, outside of the Drupal root; however, the location of the
|
||||||
|
vendor directory and the name of the Drupal root may be placed in whatever
|
||||||
|
location suits the project. Drupal-scaffold will generate the autoload.php
|
||||||
|
file at the Drupal root to require the Composer-generated autoload file in the
|
||||||
|
vendor directory.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Run `composer require drupal-composer/drupal-scaffold:dev-master` in your composer
|
||||||
|
project before installing or updating `drupal/core`.
|
||||||
|
|
||||||
|
Once drupal-scaffold is required by your project, it will automatically update
|
||||||
|
your scaffold files whenever `composer update` changes the version of
|
||||||
|
`drupal/core` installed.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
You can configure the plugin with providing some settings in the `extra` section
|
||||||
|
of your root `composer.json`.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"extra": {
|
||||||
|
"drupal-scaffold": {
|
||||||
|
"source": "http://cgit.drupalcode.org/drupal/plain/{path}?h={version}",
|
||||||
|
"excludes": [
|
||||||
|
"google123.html",
|
||||||
|
"robots.txt"
|
||||||
|
],
|
||||||
|
"includes": [
|
||||||
|
"sites/default/example.settings.my.php"
|
||||||
|
],
|
||||||
|
"initial": {
|
||||||
|
"sites/default/default.services.yml": "sites/default/services.yml",
|
||||||
|
"sites/default/default.settings.php": "sites/default/settings.php"
|
||||||
|
},
|
||||||
|
"omit-defaults": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
The `source` option may be used to specify the URL to download the
|
||||||
|
scaffold files from; the default source is drupal.org. The literal string
|
||||||
|
`{version}` in the `source` option is replaced with the current version of
|
||||||
|
Drupal core being updated prior to download.
|
||||||
|
|
||||||
|
With the `drupal-scaffold` option `excludes`, you can provide additional paths
|
||||||
|
that should not be copied or overwritten. The plugin provides no excludes by
|
||||||
|
default.
|
||||||
|
|
||||||
|
Default includes are provided by the plugin:
|
||||||
|
```
|
||||||
|
.csslintrc
|
||||||
|
.editorconfig
|
||||||
|
.eslintignore
|
||||||
|
.eslintrc (Drupal <= 8.2.x)
|
||||||
|
.eslintrc.json (Drupal >= 8.3.x)
|
||||||
|
.gitattributes
|
||||||
|
.htaccess
|
||||||
|
index.php
|
||||||
|
robots.txt
|
||||||
|
sites/default/default.settings.php
|
||||||
|
sites/default/default.services.yml
|
||||||
|
sites/development.services.yml
|
||||||
|
sites/example.settings.local.php
|
||||||
|
sites/example.sites.php
|
||||||
|
update.php
|
||||||
|
web.config
|
||||||
|
```
|
||||||
|
|
||||||
|
When setting `omit-defaults` to `true`, neither the default excludes nor the
|
||||||
|
default includes will be provided; in this instance, only those files explicitly
|
||||||
|
listed in the `excludes` and `includes` options will be considered. If
|
||||||
|
`omit-defaults` is `false` (the default), then any items listed in `excludes`
|
||||||
|
or `includes` will be in addition to the usual defaults.
|
||||||
|
|
||||||
|
The `initial` hash lists files that should be copied over only if they do not
|
||||||
|
exist in the destination. The key specifies the path to the source file, and
|
||||||
|
the value indicates the path to the destination file.
|
||||||
|
|
||||||
|
## Limitation
|
||||||
|
|
||||||
|
When using Composer to install or update the Drupal development branch, the
|
||||||
|
scaffold files are always taken from the HEAD of the branch (or, more
|
||||||
|
specifically, from the most recent development .tar.gz archive). This might
|
||||||
|
not be what you want when using an old development version (e.g. when the
|
||||||
|
version is fixed via composer.lock). To avoid problems, always commit your
|
||||||
|
scaffold files to the repository any time that composer.lock is committed.
|
||||||
|
Note that the correct scaffold files are retrieved when using a tagged release
|
||||||
|
of `drupal/core` (recommended).
|
||||||
|
|
||||||
|
## Custom command
|
||||||
|
|
||||||
|
The plugin by default is only downloading the scaffold files when installing or
|
||||||
|
updating `drupal/core`. If you want to call it manually, you have to add the
|
||||||
|
command callback to the `scripts`-section of your root `composer.json`, like this:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"scripts": {
|
||||||
|
"drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
After that you can manually download the scaffold files according to your
|
||||||
|
configuration by using `composer drupal-scaffold`.
|
||||||
|
|
||||||
|
It is assumed that the scaffold files will be committed to the repository, to
|
||||||
|
ensure that the correct files are used on the CI server (see **Limitation**,
|
||||||
|
above). After running `composer install` for the first time commit the scaffold
|
||||||
|
files to your repository.
|
25
web/vendor/drupal-composer/drupal-scaffold/composer.json
vendored
Normal file
25
web/vendor/drupal-composer/drupal-scaffold/composer.json
vendored
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"name": "drupal-composer/drupal-scaffold",
|
||||||
|
"description": "Composer Plugin for updating the Drupal scaffold files when using drupal/core",
|
||||||
|
"type": "composer-plugin",
|
||||||
|
"license": "GPL-2.0+",
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.5",
|
||||||
|
"composer-plugin-api": "^1.0.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"DrupalComposer\\DrupalScaffold\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"class": "DrupalComposer\\DrupalScaffold\\Plugin",
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"composer/composer": "dev-master",
|
||||||
|
"phpunit/phpunit": "^4.4.0"
|
||||||
|
}
|
||||||
|
}
|
1742
web/vendor/drupal-composer/drupal-scaffold/composer.lock
generated
vendored
Normal file
1742
web/vendor/drupal-composer/drupal-scaffold/composer.lock
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
15
web/vendor/drupal-composer/drupal-scaffold/phpunit.xml.dist
vendored
Normal file
15
web/vendor/drupal-composer/drupal-scaffold/phpunit.xml.dist
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
|
||||||
|
backupGlobals="false"
|
||||||
|
colors="true"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
verbose="true"
|
||||||
|
>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="drupal-scaffold">
|
||||||
|
<directory>./tests/</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
</phpunit>
|
47
web/vendor/drupal-composer/drupal-scaffold/src/FileFetcher.php
vendored
Normal file
47
web/vendor/drupal-composer/drupal-scaffold/src/FileFetcher.php
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \DrupalComposer\DrupalScaffold\FileFetcher.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DrupalComposer\DrupalScaffold;
|
||||||
|
|
||||||
|
use Composer\Util\Filesystem;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
|
|
||||||
|
class FileFetcher {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Composer\Util\RemoteFilesystem
|
||||||
|
*/
|
||||||
|
protected $remoteFilesystem;
|
||||||
|
|
||||||
|
protected $source;
|
||||||
|
protected $filenames;
|
||||||
|
protected $fs;
|
||||||
|
|
||||||
|
public function __construct(RemoteFilesystem $remoteFilesystem, $source, $filenames = []) {
|
||||||
|
$this->remoteFilesystem = $remoteFilesystem;
|
||||||
|
$this->source = $source;
|
||||||
|
$this->filenames = $filenames;
|
||||||
|
$this->fs = new Filesystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function fetch($version, $destination) {
|
||||||
|
array_walk($this->filenames, function ($filename) use ($version, $destination) {
|
||||||
|
$url = $this->getUri($filename, $version);
|
||||||
|
$this->fs->ensureDirectoryExists($destination . '/' . dirname($filename));
|
||||||
|
$this->remoteFilesystem->copy($url, $url, $destination . '/' . $filename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getUri($filename, $version) {
|
||||||
|
$map = [
|
||||||
|
'{path}' => $filename,
|
||||||
|
'{version}' => $version
|
||||||
|
];
|
||||||
|
return str_replace(array_keys($map), array_values($map), $this->source);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
365
web/vendor/drupal-composer/drupal-scaffold/src/Handler.php
vendored
Normal file
365
web/vendor/drupal-composer/drupal-scaffold/src/Handler.php
vendored
Normal file
|
@ -0,0 +1,365 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \DrupalComposer\DrupalScaffold\Handler.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DrupalComposer\DrupalScaffold;
|
||||||
|
|
||||||
|
use Composer\Composer;
|
||||||
|
use Composer\DependencyResolver\Operation\InstallOperation;
|
||||||
|
use Composer\DependencyResolver\Operation\UpdateOperation;
|
||||||
|
use Composer\IO\IOInterface;
|
||||||
|
use Composer\Package\PackageInterface;
|
||||||
|
use Composer\EventDispatcher\EventDispatcher;
|
||||||
|
use Composer\Util\Filesystem;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
|
use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem;
|
||||||
|
|
||||||
|
class Handler {
|
||||||
|
|
||||||
|
const PRE_DRUPAL_SCAFFOLD_CMD = 'pre-drupal-scaffold-cmd';
|
||||||
|
const POST_DRUPAL_SCAFFOLD_CMD = 'post-drupal-scaffold-cmd';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Composer\Composer
|
||||||
|
*/
|
||||||
|
protected $composer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Composer\IO\IOInterface
|
||||||
|
*/
|
||||||
|
protected $io;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Composer\Package\PackageInterface
|
||||||
|
*/
|
||||||
|
protected $drupalCorePackage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler constructor.
|
||||||
|
*
|
||||||
|
* @param Composer $composer
|
||||||
|
* @param IOInterface $io
|
||||||
|
*/
|
||||||
|
public function __construct(Composer $composer, IOInterface $io) {
|
||||||
|
$this->composer = $composer;
|
||||||
|
$this->io = $io;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $operation
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
protected function getCorePackage($operation) {
|
||||||
|
if ($operation instanceof InstallOperation) {
|
||||||
|
$package = $operation->getPackage();
|
||||||
|
}
|
||||||
|
elseif ($operation instanceof UpdateOperation) {
|
||||||
|
$package = $operation->getTargetPackage();
|
||||||
|
}
|
||||||
|
if (isset($package) && $package instanceof PackageInterface && $package->getName() == 'drupal/core') {
|
||||||
|
return $package;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks scaffolding to be processed after an install or update command.
|
||||||
|
*
|
||||||
|
* @param \Composer\Installer\PackageEvent $event
|
||||||
|
*/
|
||||||
|
public function onPostPackageEvent(\Composer\Installer\PackageEvent $event){
|
||||||
|
$package = $this->getCorePackage($event->getOperation());
|
||||||
|
if ($package) {
|
||||||
|
// By explicitly setting the core package, the onPostCmdEvent() will
|
||||||
|
// process the scaffolding automatically.
|
||||||
|
$this->drupalCorePackage = $package;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post install command event to execute the scaffolding.
|
||||||
|
*
|
||||||
|
* @param \Composer\Script\Event $event
|
||||||
|
*/
|
||||||
|
public function onPostCmdEvent(\Composer\Script\Event $event) {
|
||||||
|
// Only install the scaffolding if drupal/core was installed,
|
||||||
|
// AND there are no scaffolding files present.
|
||||||
|
if (isset($this->drupalCorePackage)) {
|
||||||
|
$this->downloadScaffold();
|
||||||
|
// Generate the autoload.php file after generating the scaffold files.
|
||||||
|
$this->generateAutoload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Downloads drupal scaffold files for the current process.
|
||||||
|
*/
|
||||||
|
public function downloadScaffold() {
|
||||||
|
$drupalCorePackage = $this->getDrupalCorePackage();
|
||||||
|
$webroot = realpath($this->getWebRoot());
|
||||||
|
|
||||||
|
// Collect options, excludes and settings files.
|
||||||
|
$options = $this->getOptions();
|
||||||
|
$files = array_diff($this->getIncludes(), $this->getExcludes());
|
||||||
|
|
||||||
|
// Call any pre-scaffold scripts that may be defined.
|
||||||
|
$dispatcher = new EventDispatcher($this->composer, $this->io);
|
||||||
|
$dispatcher->dispatch(self::PRE_DRUPAL_SCAFFOLD_CMD);
|
||||||
|
|
||||||
|
$version = $this->getDrupalCoreVersion($drupalCorePackage);
|
||||||
|
|
||||||
|
$remoteFs = new RemoteFilesystem($this->io);
|
||||||
|
|
||||||
|
$fetcher = new FileFetcher($remoteFs, $options['source'], $files);
|
||||||
|
$fetcher->fetch($version, $webroot);
|
||||||
|
|
||||||
|
$initialFileFetcher = new InitialFileFetcher($remoteFs, $options['source'], $this->getInitial());
|
||||||
|
$initialFileFetcher->fetch($version, $webroot);
|
||||||
|
|
||||||
|
// Call post-scaffold scripts.
|
||||||
|
$dispatcher->dispatch(self::POST_DRUPAL_SCAFFOLD_CMD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the autoload file at the project root. Include the
|
||||||
|
* autoload file that Composer generated.
|
||||||
|
*/
|
||||||
|
public function generateAutoload() {
|
||||||
|
$vendorPath = $this->getVendorPath();
|
||||||
|
$webroot = $this->getWebRoot();
|
||||||
|
|
||||||
|
// Calculate the relative path from the webroot (location of the
|
||||||
|
// project autoload.php) to the vendor directory.
|
||||||
|
$fs = new SymfonyFilesystem();
|
||||||
|
$relativeVendorPath = $fs->makePathRelative($vendorPath, realpath($webroot));
|
||||||
|
|
||||||
|
$fs->dumpFile($webroot . "/autoload.php", $this->autoLoadContents($relativeVendorPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the contents of the autoload file.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function autoLoadContents($relativeVendorPath) {
|
||||||
|
$relativeVendorPath = rtrim($relativeVendorPath, '/');
|
||||||
|
|
||||||
|
$autoloadContents = <<<EOF
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Includes the autoloader created by Composer.
|
||||||
|
*
|
||||||
|
* This file was generated by drupal-composer/drupal-scaffold.
|
||||||
|
* https://github.com/drupal-composer/drupal-scaffold
|
||||||
|
*
|
||||||
|
* @see composer.json
|
||||||
|
* @see index.php
|
||||||
|
* @see core/install.php
|
||||||
|
* @see core/rebuild.php
|
||||||
|
* @see core/modules/statistics/statistics.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
return require __DIR__ . '/$relativeVendorPath/autoload.php';
|
||||||
|
|
||||||
|
EOF;
|
||||||
|
return $autoloadContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to the 'vendor' directory.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getVendorPath() {
|
||||||
|
$config = $this->composer->getConfig();
|
||||||
|
$filesystem = new Filesystem();
|
||||||
|
$filesystem->ensureDirectoryExists($config->get('vendor-dir'));
|
||||||
|
$vendorPath = $filesystem->normalizePath(realpath($config->get('vendor-dir')));
|
||||||
|
|
||||||
|
return $vendorPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up the Drupal core package object, or return it from where we cached
|
||||||
|
* it in the $drupalCorePackage field.
|
||||||
|
*
|
||||||
|
* @return PackageInterface
|
||||||
|
*/
|
||||||
|
public function getDrupalCorePackage() {
|
||||||
|
if (!isset($this->drupalCorePackage)) {
|
||||||
|
$this->drupalCorePackage = $this->getPackage('drupal/core');
|
||||||
|
}
|
||||||
|
return $this->drupalCorePackage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Drupal core version for the given package.
|
||||||
|
*
|
||||||
|
* @param \Composer\Package\PackageInterface $drupalCorePackage
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function getDrupalCoreVersion(PackageInterface $drupalCorePackage) {
|
||||||
|
$version = $drupalCorePackage->getPrettyVersion();
|
||||||
|
if ($drupalCorePackage->getStability() == 'dev' && substr($version, -4) == '-dev') {
|
||||||
|
$version = substr($version, 0, -4);
|
||||||
|
return $version;
|
||||||
|
}
|
||||||
|
return $version;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the path to the web root.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getWebRoot() {
|
||||||
|
$drupalCorePackage = $this->getDrupalCorePackage();
|
||||||
|
$installationManager = $this->composer->getInstallationManager();
|
||||||
|
$corePath = $installationManager->getInstallPath($drupalCorePackage);
|
||||||
|
// Webroot is the parent path of the drupal core installation path.
|
||||||
|
$webroot = dirname($corePath);
|
||||||
|
|
||||||
|
return $webroot;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a package from the current composer process.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* Name of the package to get from the current composer installation.
|
||||||
|
*
|
||||||
|
* @return PackageInterface
|
||||||
|
*/
|
||||||
|
protected function getPackage($name) {
|
||||||
|
return $this->composer->getRepositoryManager()->getLocalRepository()->findPackage($name, '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve excludes from optional "extra" configuration.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getExcludes() {
|
||||||
|
return $this->getNamedOptionList('excludes', 'getExcludesDefault');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve list of additional settings files from optional "extra" configuration.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getIncludes() {
|
||||||
|
return $this->getNamedOptionList('includes', 'getIncludesDefault');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve list of initial files from optional "extra" configuration.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getInitial() {
|
||||||
|
return $this->getNamedOptionList('initial', 'getInitialDefault');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a named list of options from optional "extra" configuration.
|
||||||
|
* Respects 'omit-defaults', and either includes or does not include the
|
||||||
|
* default values, as requested.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getNamedOptionList($optionName, $defaultFn) {
|
||||||
|
$options = $this->getOptions($this->composer);
|
||||||
|
$result = array();
|
||||||
|
if (empty($options['omit-defaults'])) {
|
||||||
|
$result = $this->$defaultFn();
|
||||||
|
}
|
||||||
|
$result = array_merge($result, (array) $options[$optionName]);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve excludes from optional "extra" configuration.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getOptions() {
|
||||||
|
$extra = $this->composer->getPackage()->getExtra() + ['drupal-scaffold' => []];
|
||||||
|
$options = $extra['drupal-scaffold'] + [
|
||||||
|
'omit-defaults' => FALSE,
|
||||||
|
'excludes' => [],
|
||||||
|
'includes' => [],
|
||||||
|
'initial' => [],
|
||||||
|
'source' => 'http://cgit.drupalcode.org/drupal/plain/{path}?h={version}',
|
||||||
|
// Github: https://raw.githubusercontent.com/drupal/drupal/{version}/{path}
|
||||||
|
];
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds default excludes.
|
||||||
|
*/
|
||||||
|
protected function getExcludesDefault() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds default settings files list.
|
||||||
|
*/
|
||||||
|
protected function getIncludesDefault() {
|
||||||
|
$version = $this->getDrupalCoreVersion($this->getDrupalCorePackage());
|
||||||
|
list($major, $minor) = explode('.', $version, 3);
|
||||||
|
$version = "$major.$minor";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Files from 8.3.x
|
||||||
|
*
|
||||||
|
* @see http://cgit.drupalcode.org/drupal/tree/?h=8.3.x
|
||||||
|
*/
|
||||||
|
$common = [
|
||||||
|
'.csslintrc',
|
||||||
|
'.editorconfig',
|
||||||
|
'.eslintignore',
|
||||||
|
'.eslintrc.json',
|
||||||
|
'.gitattributes',
|
||||||
|
'.htaccess',
|
||||||
|
'index.php',
|
||||||
|
'robots.txt',
|
||||||
|
'sites/default/default.settings.php',
|
||||||
|
'sites/default/default.services.yml',
|
||||||
|
'sites/development.services.yml',
|
||||||
|
'sites/example.settings.local.php',
|
||||||
|
'sites/example.sites.php',
|
||||||
|
'update.php',
|
||||||
|
'web.config'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Version specific variations.
|
||||||
|
switch ($version) {
|
||||||
|
case '8.0':
|
||||||
|
case '8.1':
|
||||||
|
case '8.2':
|
||||||
|
$common[] = '.eslintrc';
|
||||||
|
$common = array_diff($common, ['.eslintrc.json']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sort($common);
|
||||||
|
return $common;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds default initial files.
|
||||||
|
*/
|
||||||
|
protected function getInitialDefault() {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
24
web/vendor/drupal-composer/drupal-scaffold/src/InitialFileFetcher.php
vendored
Normal file
24
web/vendor/drupal-composer/drupal-scaffold/src/InitialFileFetcher.php
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \DrupalComposer\DrupalScaffold\FileFetcher.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DrupalComposer\DrupalScaffold;
|
||||||
|
|
||||||
|
use Composer\Util\Filesystem;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
|
|
||||||
|
class InitialFileFetcher extends FileFetcher {
|
||||||
|
public function fetch($version, $destination) {
|
||||||
|
array_walk($this->filenames, function ($filename, $sourceFilename) use ($version, $destination) {
|
||||||
|
$target = "$destination/$filename";
|
||||||
|
if (!file_exists($target)) {
|
||||||
|
$url = $this->getUri($sourceFilename, $version);
|
||||||
|
$this->fs->ensureDirectoryExists($destination . '/' . dirname($filename));
|
||||||
|
$this->remoteFilesystem->copy($url, $url, $target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
81
web/vendor/drupal-composer/drupal-scaffold/src/Plugin.php
vendored
Normal file
81
web/vendor/drupal-composer/drupal-scaffold/src/Plugin.php
vendored
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains DrupalComposer\DrupalScaffold\Plugin.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DrupalComposer\DrupalScaffold;
|
||||||
|
|
||||||
|
use Composer\Composer;
|
||||||
|
use Composer\EventDispatcher\EventSubscriberInterface;
|
||||||
|
use Composer\Installer\PackageEvents;
|
||||||
|
use Composer\IO\IOInterface;
|
||||||
|
use Composer\Plugin\PluginInterface;
|
||||||
|
use Composer\Installer\PackageEvent;
|
||||||
|
use Composer\Script\ScriptEvents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composer plugin for handling drupal scaffold.
|
||||||
|
*/
|
||||||
|
class Plugin implements PluginInterface, EventSubscriberInterface {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \DrupalComposer\DrupalScaffold\Handler
|
||||||
|
*/
|
||||||
|
protected $handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function activate(Composer $composer, IOInterface $io) {
|
||||||
|
// We use a separate PluginScripts object. This way we separate
|
||||||
|
// functionality and also avoid some debug issues with the plugin being
|
||||||
|
// copied on initialisation.
|
||||||
|
// @see \Composer\Plugin\PluginManager::registerPackage()
|
||||||
|
$this->handler = new Handler($composer, $io);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public static function getSubscribedEvents() {
|
||||||
|
return array(
|
||||||
|
PackageEvents::POST_PACKAGE_INSTALL => 'postPackage',
|
||||||
|
PackageEvents::POST_PACKAGE_UPDATE => 'postPackage',
|
||||||
|
//PackageEvents::POST_PACKAGE_UNINSTALL => 'postPackage',
|
||||||
|
//ScriptEvents::POST_INSTALL_CMD => 'postCmd',
|
||||||
|
ScriptEvents::POST_UPDATE_CMD => 'postCmd',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post package event behaviour.
|
||||||
|
*
|
||||||
|
* @param \Composer\Installer\PackageEvent $event
|
||||||
|
*/
|
||||||
|
public function postPackage(PackageEvent $event) {
|
||||||
|
$this->handler->onPostPackageEvent($event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post command event callback.
|
||||||
|
*
|
||||||
|
* @param \Composer\Script\Event $event
|
||||||
|
*/
|
||||||
|
public function postCmd(\Composer\Script\Event $event) {
|
||||||
|
$this->handler->onPostCmdEvent($event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Script callback for putting in composer scripts to download the
|
||||||
|
* scaffold files.
|
||||||
|
*
|
||||||
|
* @param \Composer\Script\Event $event
|
||||||
|
*/
|
||||||
|
public static function scaffold(\Composer\Script\Event $event) {
|
||||||
|
$handler = new Handler($event->getComposer(), $event->getIO());
|
||||||
|
$handler->downloadScaffold();
|
||||||
|
// Generate the autoload.php file after generating the scaffold files.
|
||||||
|
$handler->generateAutoload();
|
||||||
|
}
|
||||||
|
}
|
99
web/vendor/drupal-composer/drupal-scaffold/tests/FetcherTest.php
vendored
Normal file
99
web/vendor/drupal-composer/drupal-scaffold/tests/FetcherTest.php
vendored
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \DrupalComposer\DrupalScaffold\Tests\FetcherTest.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DrupalComposer\DrupalScaffold\Tests;
|
||||||
|
|
||||||
|
use Composer\Downloader\TransportException;
|
||||||
|
use Composer\IO\NullIO;
|
||||||
|
use Composer\Util\Filesystem;
|
||||||
|
use Composer\Util\RemoteFilesystem;
|
||||||
|
use DrupalComposer\DrupalScaffold\FileFetcher;
|
||||||
|
use DrupalComposer\DrupalScaffold\InitialFileFetcher;
|
||||||
|
|
||||||
|
class FetcherTest extends \PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Composer\Util\Filesystem
|
||||||
|
*/
|
||||||
|
protected $fs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $tmpDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $rootDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $tmpReleaseTag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SetUp test
|
||||||
|
*/
|
||||||
|
public function setUp() {
|
||||||
|
$this->rootDir = realpath(realpath(__DIR__ . '/..'));
|
||||||
|
|
||||||
|
// Prepare temp directory.
|
||||||
|
$this->fs = new Filesystem();
|
||||||
|
$this->tmpDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'drupal-scaffold';
|
||||||
|
$this->ensureDirectoryExistsAndClear($this->tmpDir);
|
||||||
|
|
||||||
|
chdir($this->tmpDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes sure the given directory exists and has no content.
|
||||||
|
*
|
||||||
|
* @param string $directory
|
||||||
|
*/
|
||||||
|
protected function ensureDirectoryExistsAndClear($directory) {
|
||||||
|
if (is_dir($directory)) {
|
||||||
|
$this->fs->removeDirectory($directory);
|
||||||
|
}
|
||||||
|
mkdir($directory, 0777, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFetch() {
|
||||||
|
$fetcher = new FileFetcher(new RemoteFilesystem(new NullIO()), 'http://cgit.drupalcode.org/drupal/plain/{path}?h={version}', ['.htaccess', 'sites/default/default.settings.php']);
|
||||||
|
$fetcher->fetch('8.1.1', $this->tmpDir);
|
||||||
|
$this->assertFileExists($this->tmpDir . '/.htaccess');
|
||||||
|
$this->assertFileExists($this->tmpDir . '/sites/default/default.settings.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests version specific files.
|
||||||
|
*/
|
||||||
|
public function testFetchVersionSpecific() {
|
||||||
|
$fetcher = new FileFetcher(new RemoteFilesystem(new NullIO()), 'http://cgit.drupalcode.org/drupal/plain/{path}?h={version}', ['.eslintrc', '.eslintrc.json']);
|
||||||
|
|
||||||
|
$this->setExpectedException(TransportException::class);
|
||||||
|
$fetcher->fetch('8.2.x', $this->tmpDir);
|
||||||
|
|
||||||
|
$this->assertFileExists($this->tmpDir . '/.eslintrc');
|
||||||
|
$this->assertFileNotExists($this->tmpDir . '/.eslintrc.json');
|
||||||
|
|
||||||
|
// Remove downloaded files to retest with 8.3.x.
|
||||||
|
@unlink($this->tmpDir . '/.eslintrc');
|
||||||
|
|
||||||
|
$this->setExpectedException(TransportException::class);
|
||||||
|
$fetcher->fetch('8.3.x', $this->tmpDir);
|
||||||
|
|
||||||
|
$this->assertFileExists($this->tmpDir . '/.eslintrc.json');
|
||||||
|
$this->assertFileNotExists($this->tmpDir . '/.eslintrc');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInitialFetch() {
|
||||||
|
$fetcher = new InitialFileFetcher(new RemoteFilesystem(new NullIO()), 'http://cgit.drupalcode.org/drupal/plain/{path}?h={version}', ['sites/default/default.settings.php' => 'sites/default/settings.php']);
|
||||||
|
$fetcher->fetch('8.1.1', $this->tmpDir);
|
||||||
|
$this->assertFileExists($this->tmpDir . '/sites/default/settings.php');
|
||||||
|
}
|
||||||
|
}
|
185
web/vendor/drupal-composer/drupal-scaffold/tests/PluginTest.php
vendored
Normal file
185
web/vendor/drupal-composer/drupal-scaffold/tests/PluginTest.php
vendored
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \DrupalComposer\DrupalScaffold\Tests\PluginTest.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DrupalComposer\DrupalScaffold\Tests;
|
||||||
|
|
||||||
|
use Composer\Util\Filesystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests composer plugin functionality.
|
||||||
|
*/
|
||||||
|
class PluginTest extends \PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Composer\Util\Filesystem
|
||||||
|
*/
|
||||||
|
protected $fs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $tmpDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $rootDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $tmpReleaseTag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SetUp test
|
||||||
|
*/
|
||||||
|
public function setUp() {
|
||||||
|
$this->rootDir = realpath(realpath(__DIR__ . '/..'));
|
||||||
|
|
||||||
|
// Prepare temp directory.
|
||||||
|
$this->fs = new Filesystem();
|
||||||
|
$this->tmpDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'drupal-scaffold';
|
||||||
|
$this->ensureDirectoryExistsAndClear($this->tmpDir);
|
||||||
|
|
||||||
|
$this->writeTestReleaseTag();
|
||||||
|
$this->writeComposerJSON();
|
||||||
|
|
||||||
|
chdir($this->tmpDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tearDown
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function tearDown()
|
||||||
|
{
|
||||||
|
$this->fs->removeDirectory($this->tmpDir);
|
||||||
|
$this->git(sprintf('tag -d "%s"', $this->tmpReleaseTag));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests a simple composer install without core, but adding core later.
|
||||||
|
*/
|
||||||
|
public function testComposerInstallAndUpdate() {
|
||||||
|
$exampleScaffoldFile = $this->tmpDir . DIRECTORY_SEPARATOR . 'index.php';
|
||||||
|
$this->assertFileNotExists($exampleScaffoldFile, 'Scaffold file should not be exist.');
|
||||||
|
$this->composer('install');
|
||||||
|
$this->assertFileExists($this->tmpDir . DIRECTORY_SEPARATOR . 'core', 'Drupal core is installed.');
|
||||||
|
$this->assertFileExists($exampleScaffoldFile, 'Scaffold file should be automatically installed.');
|
||||||
|
$this->fs->remove($exampleScaffoldFile);
|
||||||
|
$this->assertFileNotExists($exampleScaffoldFile, 'Scaffold file should not be exist.');
|
||||||
|
$this->composer('drupal-scaffold');
|
||||||
|
$this->assertFileExists($exampleScaffoldFile, 'Scaffold file should be installed by "drupal-scaffold" command.');
|
||||||
|
|
||||||
|
foreach (['8.0.1', '8.1.x-dev'] as $version) {
|
||||||
|
// We touch a scaffold file, so we can check the file was modified after
|
||||||
|
// the scaffold update.
|
||||||
|
touch($exampleScaffoldFile);
|
||||||
|
$mtime_touched = filemtime($exampleScaffoldFile);
|
||||||
|
// Requiring a newer version triggers "composer update"
|
||||||
|
$this->composer('require --update-with-dependencies drupal/core:"' . $version .'"');
|
||||||
|
clearstatcache();
|
||||||
|
$mtime_after = filemtime($exampleScaffoldFile);
|
||||||
|
$this->assertNotEquals($mtime_after, $mtime_touched, 'Scaffold file was modified by composer update. (' . $version . ')');
|
||||||
|
}
|
||||||
|
|
||||||
|
// We touch a scaffold file, so we can check the file was modified after
|
||||||
|
// the custom commandscaffold update.
|
||||||
|
touch($exampleScaffoldFile);
|
||||||
|
clearstatcache();
|
||||||
|
$mtime_touched = filemtime($exampleScaffoldFile);
|
||||||
|
$this->composer('drupal-scaffold');
|
||||||
|
clearstatcache();
|
||||||
|
$mtime_after = filemtime($exampleScaffoldFile);
|
||||||
|
$this->assertNotEquals($mtime_after, $mtime_touched, 'Scaffold file was modified by custom command.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the default composer json to the temp direcoty.
|
||||||
|
*/
|
||||||
|
protected function writeComposerJSON() {
|
||||||
|
$json = json_encode($this->composerJSONDefaults(), JSON_PRETTY_PRINT);
|
||||||
|
// Write composer.json.
|
||||||
|
file_put_contents($this->tmpDir . '/composer.json', $json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a tag for the current commit, so we can reference it directly in the
|
||||||
|
* composer.json.
|
||||||
|
*/
|
||||||
|
protected function writeTestReleaseTag() {
|
||||||
|
// Tag the current state.
|
||||||
|
$this->tmpReleaseTag = '999.0.' . time();
|
||||||
|
$this->git(sprintf('tag -a "%s" -m "%s"', $this->tmpReleaseTag, 'Tag for testing this exact commit'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the default composer.json data.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function composerJSONDefaults() {
|
||||||
|
return array(
|
||||||
|
'repositories' => array(
|
||||||
|
array(
|
||||||
|
'type' => 'vcs',
|
||||||
|
'url' => $this->rootDir,
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'require' => array(
|
||||||
|
'drupal-composer/drupal-scaffold' => $this->tmpReleaseTag,
|
||||||
|
'composer/installers' => '^1.0.20',
|
||||||
|
'drupal/core' => '8.0.0',
|
||||||
|
),
|
||||||
|
'scripts' => array(
|
||||||
|
'drupal-scaffold' => 'DrupalComposer\\DrupalScaffold\\Plugin::scaffold'
|
||||||
|
),
|
||||||
|
'minimum-stability' => 'dev',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper for the composer command.
|
||||||
|
*
|
||||||
|
* @param string $command
|
||||||
|
* Composer command name, arguments and/or options
|
||||||
|
*/
|
||||||
|
protected function composer($command) {
|
||||||
|
chdir($this->tmpDir);
|
||||||
|
passthru(escapeshellcmd($this->rootDir . '/vendor/bin/composer ' . $command), $exit_code);
|
||||||
|
if ($exit_code !== 0) {
|
||||||
|
throw new \Exception('Composer returned a non-zero exit code');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper for git command in the root directory.
|
||||||
|
*
|
||||||
|
* @param $command
|
||||||
|
* Git command name, arguments and/or options.
|
||||||
|
*/
|
||||||
|
protected function git($command) {
|
||||||
|
chdir($this->rootDir);
|
||||||
|
passthru(escapeshellcmd('git ' . $command), $exit_code);
|
||||||
|
if ($exit_code !== 0) {
|
||||||
|
throw new \Exception('Git returned a non-zero exit code');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes sure the given directory exists and has no content.
|
||||||
|
*
|
||||||
|
* @param string $directory
|
||||||
|
*/
|
||||||
|
protected function ensureDirectoryExistsAndClear($directory) {
|
||||||
|
if (is_dir($directory)) {
|
||||||
|
$this->fs->removeDirectory($directory);
|
||||||
|
}
|
||||||
|
mkdir($directory, 0777, true);
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue