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