diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 804aee79e2fd..e6281dd58a87 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -102,18 +102,7 @@ public function executeTty($command, $cwd = null) */ private function doExecute($command, $cwd, $tty, &$output = null) { - if ($this->io && $this->io->isDebug()) { - $safeCommand = Preg::replaceCallback('{://(?P[^:/\s]+):(?P[^@\s/]+)@}i', function ($m) { - // if the username looks like a long (12char+) hex string, or a modern github token (e.g. ghp_xxx) we obfuscate that - if (Preg::isMatch('{^([a-f0-9]{12,}|gh[a-z]_[a-zA-Z0-9_]+)$}', $m['user'])) { - return '://***:***@'; - } - - return '://'.$m['user'].':***@'; - }, $command); - $safeCommand = Preg::replace("{--password (.*[^\\\\]\') }", '--password \'***\' ', $safeCommand); - $this->io->writeError('Executing command ('.($cwd ?: 'CWD').'): '.$safeCommand); - } + $this->outputCommandRun($command, $cwd, false); $this->captureOutput = func_num_args() > 3; $this->errorOutput = ''; @@ -230,17 +219,7 @@ private function startJob($id) $command = $job['command']; $cwd = $job['cwd']; - if ($this->io && $this->io->isDebug()) { - $safeCommand = Preg::replaceCallback('{://(?P[^:/\s]+):(?P[^@\s/]+)@}i', function ($m) { - if (Preg::isMatch('{^[a-f0-9]{12,}$}', $m['user'])) { - return '://***:***@'; - } - - return '://'.$m['user'].':***@'; - }, $command); - $safeCommand = Preg::replace("{--password (.*[^\\\\]\') }", '--password \'***\' ', $safeCommand); - $this->io->writeError('Executing async command ('.($cwd ?: 'CWD').'): '.$safeCommand); - } + $this->outputCommandRun($command, $cwd, true); try { $process = Process::fromShellCommandline($command, $cwd, null, null, static::getTimeout()); @@ -407,6 +386,33 @@ public static function escape($argument) return self::escapeArgument($argument); } + /** + * @param string $command + * @param ?string $cwd + * @param bool $async + * @return void + */ + private function outputCommandRun($command, $cwd, $async) + { + if (null === $this->io || !$this->io->isDebug()) { + return; + } + + $safeCommand = Preg::replaceCallback('{://(?P[^:/\s]+):(?P[^@\s/]+)@}i', function ($m) { + // if the username looks like a long (12char+) hex string, or a modern github token (e.g. ghp_xxx) we obfuscate that + if (Preg::isMatch('{^([a-f0-9]{12,}|gh[a-z]_[a-zA-Z0-9_]+)$}', $m['user'])) { + return '://***:***@'; + } + if (Preg::isMatch('{^[a-f0-9]{12,}$}', $m['user'])) { + return '://***:***@'; + } + + return '://'.$m['user'].':***@'; + }, $command); + $safeCommand = Preg::replace("{--password (.*[^\\\\]\') }", '--password \'***\' ', $safeCommand); + $this->io->writeError('Executing'.($async ? ' async' : '').' command ('.($cwd ?: 'CWD').'): '.$safeCommand); + } + /** * Escapes a string to be used as a shell argument for Symfony Process. *