--- /dev/null
+<?php
+namespace Robo\Task\Composer;
+
+use Robo\Contract\CommandInterface;
+use Robo\Exception\TaskException;
+use Robo\Task\BaseTask;
+
+abstract class Base extends BaseTask implements CommandInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $command = '';
+
+ /**
+ * @var boolena
+ */
+ protected $built = false;
+
+ /**
+ * @var string
+ */
+ protected $prefer;
+
+ /**
+ * @var string
+ */
+ protected $dev;
+
+ /**
+ * @var string
+ */
+ protected $ansi;
+
+ /**
+ * @var string
+ */
+ protected $nointeraction;
+
+ /**
+ * Action to use
+ *
+ * @var string
+ */
+ protected $action = '';
+
+ /**
+ * @param null|string $pathToComposer
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToComposer = null)
+ {
+ $this->command = $pathToComposer;
+ if (!$this->command) {
+ $this->command = $this->findExecutablePhar('composer');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "Neither local composer.phar nor global composer installation could be found.");
+ }
+ }
+
+ /**
+ * adds `prefer-dist` option to composer
+ *
+ * @return $this
+ */
+ public function preferDist($preferDist = true)
+ {
+ if (!$preferDist) {
+ return $this->preferSource();
+ }
+ $this->prefer = '--prefer-dist';
+ return $this;
+ }
+
+ /**
+ * adds `prefer-source` option to composer
+ *
+ * @return $this
+ */
+ public function preferSource()
+ {
+ $this->prefer = '--prefer-source';
+ return $this;
+ }
+
+ /**
+ * adds `dev` option to composer
+ *
+ * @return $this
+ */
+ public function dev($dev = true)
+ {
+ if (!$dev) {
+ return $this->noDev();
+ }
+ $this->dev = '--dev';
+ return $this;
+ }
+
+ /**
+ * adds `no-dev` option to composer
+ *
+ * @return $this
+ */
+ public function noDev()
+ {
+ $this->dev = '--no-dev';
+ return $this;
+ }
+
+ /**
+ * adds `ansi` option to composer
+ *
+ * @return $this
+ */
+ public function ansi($ansi = true)
+ {
+ if (!$ansi) {
+ return $this->noAnsi();
+ }
+ $this->ansi = '--ansi';
+ return $this;
+ }
+
+ /**
+ * adds `no-ansi` option to composer
+ *
+ * @return $this
+ */
+ public function noAnsi()
+ {
+ $this->ansi = '--no-ansi';
+ return $this;
+ }
+
+ public function interaction($interaction = true)
+ {
+ if (!$interaction) {
+ return $this->noInteraction();
+ }
+ return $this;
+ }
+
+ /**
+ * adds `no-interaction` option to composer
+ *
+ * @return $this
+ */
+ public function noInteraction()
+ {
+ $this->nointeraction = '--no-interaction';
+ return $this;
+ }
+
+ /**
+ * adds `optimize-autoloader` option to composer
+ *
+ * @return $this
+ */
+ public function optimizeAutoloader($optimize = true)
+ {
+ if ($optimize) {
+ $this->option('--optimize-autoloader');
+ }
+ return $this;
+ }
+
+ /**
+ * adds `ignore-platform-reqs` option to composer
+ *
+ * @return $this
+ */
+ public function ignorePlatformRequirements($ignore = true)
+ {
+ $this->option('--ignore-platform-reqs');
+ return $this;
+ }
+
+ /**
+ * disable plugins
+ *
+ * @return $this
+ */
+ public function disablePlugins($disable = true)
+ {
+ if ($disable) {
+ $this->option('--no-plugins');
+ }
+ return $this;
+ }
+
+ /**
+ * skip scripts
+ *
+ * @return $this
+ */
+ public function noScripts($disable = true)
+ {
+ if ($disable) {
+ $this->option('--no-scripts');
+ }
+ return $this;
+ }
+
+ /**
+ * adds `--working-dir $dir` option to composer
+ *
+ * @return $this
+ */
+ public function workingDir($dir)
+ {
+ $this->option("--working-dir", $dir);
+ return $this;
+ }
+
+ /**
+ * Copy class fields into command options as directed.
+ */
+ public function buildCommand()
+ {
+ if (!isset($this->ansi) && $this->getConfig()->get(\Robo\Config\Config::DECORATED)) {
+ $this->ansi();
+ }
+ if (!isset($this->nointeraction) && !$this->getConfig()->get(\Robo\Config\Config::INTERACTIVE)) {
+ $this->noInteraction();
+ }
+ $this->option($this->prefer)
+ ->option($this->dev)
+ ->option($this->nointeraction)
+ ->option($this->ansi);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ if (!$this->built) {
+ $this->buildCommand();
+ $this->built = true;
+ }
+ return "{$this->command} {$this->action}{$this->arguments}";
+ }
+}