Add workaround for php bug 53460 glob() can return false, fixes #2278

main
Jordi Boggiano 11 years ago
parent 807600b255
commit 3f6227a996

@ -152,6 +152,7 @@ EOT
}
$composer = Factory::create($io, null, $disablePlugins);
$fs = new Filesystem();
if ($noScripts === false) {
// dispatch event
@ -187,7 +188,6 @@ EOT
}
try {
$fs = new Filesystem();
$dirs = iterator_to_array($finder);
unset($finder);
foreach ($dirs as $dir) {
@ -222,10 +222,10 @@ EOT
chdir($oldCwd);
$vendorComposerDir = $composer->getConfig()->get('vendor-dir').'/composer';
if (is_dir($vendorComposerDir) && glob($vendorComposerDir.'/*') === array() && count(glob($vendorComposerDir.'/.*')) === 2) {
if (is_dir($vendorComposerDir) && $fs->isDirEmpty($vendorComposerDir)) {
@rmdir($vendorComposerDir);
$vendorDir = $composer->getConfig()->get('vendor-dir');
if (is_dir($vendorDir) && glob($vendorDir.'/*') === array() && count(glob($vendorDir.'/.*')) === 2) {
if (is_dir($vendorDir) && $fs->isDirEmpty($vendorDir)) {
@rmdir($vendorDir);
}
}

@ -132,7 +132,7 @@ abstract class ArchiveDownloader extends FileDownloader
*/
private function listFiles($dir)
{
$files = array_merge(glob($dir . '/.*'), glob($dir . '/*'));
$files = array_merge(glob($dir . '/.*') ?: array(), glob($dir . '/*') ?: array());
return array_values(array_filter($files, function ($el) {
return basename($el) !== '.' && basename($el) !== '..';

@ -15,6 +15,7 @@ namespace Composer\Installer;
use Composer\Package\PackageInterface;
use Composer\Downloader\DownloadManager;
use Composer\Repository\InstalledRepositoryInterface;
use Composer\Util\Filesystem;
/**
* Project Installer is used to install a single package into a directory as
@ -26,11 +27,13 @@ class ProjectInstaller implements InstallerInterface
{
private $installPath;
private $downloadManager;
private $filesystem;
public function __construct($installPath, DownloadManager $dm)
{
$this->installPath = rtrim(strtr($installPath, '\\', '/'), '/').'/';
$this->downloadManager = $dm;
$this->filesystem = new Filesystem;
}
/**
@ -58,7 +61,7 @@ class ProjectInstaller implements InstallerInterface
public function install(InstalledRepositoryInterface $repo, PackageInterface $package)
{
$installPath = $this->installPath;
if (file_exists($installPath) && (count(glob($installPath.'*')) || (count(glob($installPath.'.*')) > 2))) {
if (file_exists($installPath) && !$this->filesystem->isDirEmpty($installPath)) {
throw new \InvalidArgumentException("Project directory $installPath is not empty.");
}
if (!is_dir($installPath)) {

@ -41,6 +41,19 @@ class Filesystem
return false;
}
/**
* Checks if a directory is empty
*
* @param string $dir
* @return bool
*/
public function isDirEmpty($dir)
{
$dir = rtrim($dir, '/\\');
return count(glob($dir.'/*') ?: array()) === 0 && count(glob($dir.'/.*') ?: array()) === 2;
}
/**
* Recursively remove a directory
*

Loading…
Cancel
Save