diff --git a/bin/composer b/bin/composer index ed4979f7b..823f87a4b 100755 --- a/bin/composer +++ b/bin/composer @@ -41,9 +41,9 @@ if (function_exists('ini_set')) { }; $memoryLimit = trim(ini_get('memory_limit')); - // Increase memory_limit if it is lower than 1GB - if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1024) { - @ini_set('memory_limit', '1G'); + // Increase memory_limit if it is lower than 1.5GB + if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) { + @ini_set('memory_limit', '1536M'); } unset($memoryInBytes, $memoryLimit); } diff --git a/composer.lock b/composer.lock index 331413f0c..78883b4d7 100644 --- a/composer.lock +++ b/composer.lock @@ -189,16 +189,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "4.0.1", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "10d1f6977f6be5f177dded8f585a11debdc27591" + "reference": "d39c56a46b3ebe1f3696479966cd2b9f50aaa24f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/10d1f6977f6be5f177dded8f585a11debdc27591", - "reference": "10d1f6977f6be5f177dded8f585a11debdc27591", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/d39c56a46b3ebe1f3696479966cd2b9f50aaa24f", + "reference": "d39c56a46b3ebe1f3696479966cd2b9f50aaa24f", "shasum": "" }, "require": { @@ -251,7 +251,7 @@ "json", "schema" ], - "time": "2016-11-09T16:32:33+00:00" + "time": "2016-12-22T16:43:46+00:00" }, { "name": "psr/log", @@ -440,16 +440,16 @@ }, { "name": "symfony/console", - "version": "v2.8.14", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a871ba00e0f604dceac64c56c27f99fbeaf4854e" + "reference": "d5643cd095e5e37d31e004bb2606b5dd7e96602f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a871ba00e0f604dceac64c56c27f99fbeaf4854e", - "reference": "a871ba00e0f604dceac64c56c27f99fbeaf4854e", + "url": "https://api.github.com/repos/symfony/console/zipball/d5643cd095e5e37d31e004bb2606b5dd7e96602f", + "reference": "d5643cd095e5e37d31e004bb2606b5dd7e96602f", "shasum": "" }, "require": { @@ -497,11 +497,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2016-11-15T23:02:12+00:00" + "time": "2016-12-06T11:59:35+00:00" }, { "name": "symfony/debug", - "version": "v2.8.14", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", @@ -558,7 +558,7 @@ }, { "name": "symfony/filesystem", - "version": "v2.8.14", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -607,16 +607,16 @@ }, { "name": "symfony/finder", - "version": "v2.8.14", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0023b024363dfc0cd21262e556f25a291fe8d7fd" + "reference": "c0f10576335743b881ac1ed39d18c0fa66048775" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0023b024363dfc0cd21262e556f25a291fe8d7fd", - "reference": "0023b024363dfc0cd21262e556f25a291fe8d7fd", + "url": "https://api.github.com/repos/symfony/finder/zipball/c0f10576335743b881ac1ed39d18c0fa66048775", + "reference": "c0f10576335743b881ac1ed39d18c0fa66048775", "shasum": "" }, "require": { @@ -652,7 +652,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2016-11-03T07:52:58+00:00" + "time": "2016-12-13T09:38:12+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -715,16 +715,16 @@ }, { "name": "symfony/process", - "version": "v2.8.14", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "024de37f8a6b9e5e8244d9eb3fcf3e467dd2a93f" + "reference": "1a1bd056395540d0bc549d39818316513565d278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/024de37f8a6b9e5e8244d9eb3fcf3e467dd2a93f", - "reference": "024de37f8a6b9e5e8244d9eb3fcf3e467dd2a93f", + "url": "https://api.github.com/repos/symfony/process/zipball/1a1bd056395540d0bc549d39818316513565d278", + "reference": "1a1bd056395540d0bc549d39818316513565d278", "shasum": "" }, "require": { @@ -760,7 +760,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2016-09-29T14:03:54+00:00" + "time": "2016-11-24T00:43:03+00:00" } ], "packages-dev": [ @@ -1175,16 +1175,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.30", + "version": "4.8.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a534e04d0bd39c557c2881c341efd06fa6f1292a" + "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a534e04d0bd39c557c2881c341efd06fa6f1292a", - "reference": "a534e04d0bd39c557c2881c341efd06fa6f1292a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/98b2b39a520766bec663ff5b7ff1b729db9dbfe3", + "reference": "98b2b39a520766bec663ff5b7ff1b729db9dbfe3", "shasum": "" }, "require": { @@ -1243,7 +1243,7 @@ "testing", "xunit" ], - "time": "2016-12-01T17:05:48+00:00" + "time": "2016-12-09T02:45:31+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -1675,7 +1675,7 @@ }, { "name": "symfony/yaml", - "version": "v2.8.14", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", diff --git a/src/Composer/Repository/RepositoryFactory.php b/src/Composer/Repository/RepositoryFactory.php index d2f64edf8..0ab7ed15c 100644 --- a/src/Composer/Repository/RepositoryFactory.php +++ b/src/Composer/Repository/RepositoryFactory.php @@ -121,7 +121,7 @@ class RepositoryFactory $rm->setRepositoryClass('git', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('gitlab', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('svn', 'Composer\Repository\VcsRepository'); - $rm->setRepositoryClass('fossil', 'Composer\Repository\FossilRepository'); + $rm->setRepositoryClass('fossil', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('perforce', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('hg', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('artifact', 'Composer\Repository\ArtifactRepository'); diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php index 8edbbec37..c7e892244 100644 --- a/src/Composer/Util/Git.php +++ b/src/Composer/Util/Git.php @@ -50,7 +50,7 @@ class Git } if (preg_match('{^ssh://[^@]+@[^:]+:[^0-9]+}', $url)) { - throw new \InvalidArgumentException('The source URL '.$url.' is invalid, ssh URLs should have a port number after ":".'."\n".'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.'); + throw new \InvalidArgumentException('The source URL ' . $url . ' is invalid, ssh URLs should have a port number after ":".' . "\n" . 'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.'); } if (!$initialClone) { @@ -63,16 +63,16 @@ class Git $protocols = $this->config->get('github-protocols'); if (!is_array($protocols)) { - throw new \RuntimeException('Config value "github-protocols" must be an array, got '.gettype($protocols)); + throw new \RuntimeException('Config value "github-protocols" must be an array, got ' . gettype($protocols)); } // public github, autoswitch protocols - if (preg_match('{^(?:https?|git)://'.self::getGitHubDomainsRegex($this->config).'/(.*)}', $url, $match)) { + if (preg_match('{^(?:https?|git)://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)) { $messages = array(); foreach ($protocols as $protocol) { if ('ssh' === $protocol) { $protoUrl = "git@" . $match[1] . ":" . $match[2]; } else { - $protoUrl = $protocol ."://" . $match[1] . "/" . $match[2]; + $protoUrl = $protocol . "://" . $match[1] . "/" . $match[2]; } if (0 === $this->process->execute(call_user_func($commandCallable, $protoUrl), $ignoredOutput, $cwd)) { @@ -85,18 +85,18 @@ class Git } // failed to checkout, first check git accessibility - $this->throwException('Failed to clone ' . $url .' via '.implode(', ', $protocols).' protocols, aborting.' . "\n\n" . implode("\n", $messages), $url); + $this->throwException('Failed to clone ' . $url . ' via ' . implode(', ', $protocols) . ' protocols, aborting.' . "\n\n" . implode("\n", $messages), $url); } // if we have a private github url and the ssh protocol is disabled then we skip it and directly fallback to https - $bypassSshForGitHub = preg_match('{^git@'.self::getGitHubDomainsRegex($this->config).':(.+?)\.git$}i', $url) && !in_array('ssh', $protocols, true); + $bypassSshForGitHub = preg_match('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\.git$}i', $url) && !in_array('ssh', $protocols, true); $command = call_user_func($commandCallable, $url); $auth = null; if ($bypassSshForGitHub || 0 !== $this->process->execute($command, $ignoredOutput, $cwd)) { // private github repository without git access, try https with auth - if (preg_match('{^git@'.self::getGitHubDomainsRegex($this->config).':(.+?)\.git$}i', $url, $match)) { + if (preg_match('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\.git$}i', $url, $match)) { if (!$this->io->hasAuthentication($match[1])) { $gitHubUtil = new GitHub($this->io, $this->config, $this->process); $message = 'Cloning failed using an ssh key for authentication, enter your GitHub credentials to access private repos'; @@ -131,7 +131,7 @@ class Git //We already have an access_token from a previous request. if ($auth['username'] !== 'x-token-auth') { $token = $bitbucketUtil->requestToken($match[1], $auth['username'], $auth['password']); - if (! empty($token)) { + if (!empty($token)) { $this->io->setAuthentication($match[1], 'x-token-auth', $token['access_token']); } } @@ -165,22 +165,22 @@ class Git $defaultUsername = null; if (isset($authParts) && $authParts) { if (false !== strpos($authParts, ':')) { - list($defaultUsername, ) = explode(':', $authParts, 2); + list($defaultUsername,) = explode(':', $authParts, 2); } else { $defaultUsername = $authParts; } } - $this->io->writeError(' Authentication required ('.parse_url($url, PHP_URL_HOST).'):'); + $this->io->writeError(' Authentication required (' . parse_url($url, PHP_URL_HOST) . '):'); $auth = array( - 'username' => $this->io->ask(' Username: ', $defaultUsername), - 'password' => $this->io->askAndHideAnswer(' Password: '), + 'username' => $this->io->ask(' Username: ', $defaultUsername), + 'password' => $this->io->askAndHideAnswer(' Password: '), ); $storeAuth = $this->config->get('store-auths'); } if ($auth) { - $authUrl = $match[1].rawurlencode($auth['username']).':'.rawurlencode($auth['password']).'@'.$match[2].$match[3]; + $authUrl = $match[1] . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[2] . $match[3]; $command = call_user_func($commandCallable, $authUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { @@ -237,7 +237,8 @@ class Git $authFailures = array( 'fatal: Authentication failed', 'remote error: Invalid username or password.', - 'error: 401 Unauthorized' + 'error: 401 Unauthorized', + 'fatal: unable to access' ); foreach ($authFailures as $authFailure) { @@ -283,7 +284,7 @@ class Git public static function getGitHubDomainsRegex(Config $config) { - return '('.implode('|', array_map('preg_quote', $config->get('github-domains'))).')'; + return '(' . implode('|', array_map('preg_quote', $config->get('github-domains'))) . ')'; } public static function sanitizeUrl($message) @@ -293,7 +294,7 @@ class Git return '://***:***@'; } - return '://'.$m[1].':***@'; + return '://' . $m[1] . ':***@'; }, $message); } @@ -303,7 +304,7 @@ class Git clearstatcache(); if (0 !== $this->process->execute('git --version', $ignoredOutput)) { - throw new \RuntimeException(self::sanitizeUrl('Failed to clone '.$url.', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); + throw new \RuntimeException(self::sanitizeUrl('Failed to clone ' . $url . ', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); } throw new \RuntimeException(self::sanitizeUrl($message)); diff --git a/src/Composer/Util/IniHelper.php b/src/Composer/Util/IniHelper.php index f4eaa26f0..0dc0529a5 100644 --- a/src/Composer/Util/IniHelper.php +++ b/src/Composer/Util/IniHelper.php @@ -28,7 +28,7 @@ class IniHelper * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be empty. - + * * @return array */ public static function getAll() diff --git a/src/Composer/XdebugHandler.php b/src/Composer/XdebugHandler.php index be04dec55..a55d37368 100644 --- a/src/Composer/XdebugHandler.php +++ b/src/Composer/XdebugHandler.php @@ -136,9 +136,13 @@ class XdebugHandler { $this->tmpIni = ''; $iniPaths = IniHelper::getAll(); - $files = $this->getWorkingSet($iniPaths, $replace); - if ($this->writeTmpIni($files, $replace)) { + if (empty($iniPaths[0])) { + // There is no loaded ini + array_shift($iniPaths); + } + + if ($this->writeTmpIni($iniPaths)) { return $this->setEnvironment($iniPaths); } @@ -151,24 +155,21 @@ class XdebugHandler * The filename is passed as the -c option when the process restarts. * * @param array $iniFiles The php.ini locations - * @param bool $replace Whether the files need modifying * * @return bool */ - private function writeTmpIni(array $iniFiles, $replace) + private function writeTmpIni(array $iniFiles) { - if (empty($iniFiles)) { - // Unlikely, maybe xdebug was loaded through a command line option. - return true; - } - if (!$this->tmpIni = tempnam(sys_get_temp_dir(), '')) { return false; } $content = ''; + $regex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; + foreach ($iniFiles as $file) { - $content .= $this->getIniData($file, $replace); + $data = preg_replace($regex, ';$1', file_get_contents($file)); + $content .= $data.PHP_EOL; } $content .= PHP_EOL.'memory_limit='.ini_get('memory_limit').PHP_EOL; @@ -176,60 +177,6 @@ class XdebugHandler return @file_put_contents($this->tmpIni, $content); } - /** - * Returns an array of ini files to use - * - * @param array $iniPaths Locations used by the current prcoess - * @param null|bool $replace Whether the files need modifying, set by method - * - * @return array - */ - private function getWorkingSet(array $iniPaths, &$replace) - { - $replace = true; - $result = array(); - - if (empty($iniPaths[0])) { - // There is no loaded ini - array_shift($iniPaths); - } - - foreach ($iniPaths as $file) { - if (preg_match('/xdebug.ini$/', $file)) { - // Skip the file, no need for regex replacing - $replace = false; - } else { - $result[] = $file; - } - } - - return $result; - } - - /** - * Returns formatted ini file data - * - * @param string $iniFile The location of the ini file - * @param bool $replace Whether to regex replace content - * - * @return string The ini data - */ - private function getIniData($iniFile, $replace) - { - $contents = file_get_contents($iniFile); - $data = PHP_EOL; - - if ($replace) { - // Comment out xdebug config - $regex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; - $data .= preg_replace($regex, ';$1', $contents); - } else { - $data .= $contents; - } - - return $data; - } - /** * Returns the restart command line *