diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index 1c0cf3f90..b79350fcc 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -81,6 +81,9 @@ EOT } } + $output->write('Checking disk free space: '); + $this->outputResult($output, $this->checkDiskSpace($config)); + $output->write('Checking composer version: '); $this->outputResult($output, $this->checkVersion()); @@ -213,6 +216,18 @@ EOT } } + private function checkDiskSpace($config) + { + $minSpaceFree = 1024*1024; + if ((($df = disk_free_space($dir = $config->get('home'))) !== false && $df < $minSpaceFree) + || (($df = disk_free_space($dir = $config->get('vendor-dir'))) !== false && $df < $minSpaceFree) + ) { + return 'The disk hosting '.$dir.' is full, this may be the cause of the following exception'; + } + + return true; + } + private function checkVersion() { $protocol = extension_loaded('openssl') ? 'https' : 'http'; diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 424d9d3df..aaaf55ab5 100755 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -141,6 +141,28 @@ class Application extends BaseApplication return $workingDir; } + /** + * {@inheritDoc} + */ + public function renderException($e, $output) + { + try { + $composer = $this->getComposer(false); + if ($composer) { + $config = $composer->getConfig(); + + $minSpaceFree = 1024*1024; + if ((($df = disk_free_space($dir = $config->get('home'))) !== false && $df < $minSpaceFree) + || (($df = disk_free_space($dir = $config->get('vendor-dir'))) !== false && $df < $minSpaceFree) + ) { + $output->writeln('The disk hosting '.$dir.' is full, this may be the cause of the following exception'); + } + } + } catch (\Exception $e) {} + + return parent::renderException($e, $output); + } + /** * @param bool $required * @throws JsonValidationException