@ -28,6 +28,8 @@ use Composer\Script\ScriptEvents;
*/
class AutoloadGenerator
{
const EXCLUDE_PATTERN = '.*%s';
/**
* @var EventDispatcher
*/
@ -193,6 +195,11 @@ EOF;
EOF;
}
$blacklist = null;
if (!empty($autoloads['exclude-from-classmap'])) {
$blacklist = '{(' . implode('|', $autoloads['exclude-from-classmap']) . ')}';
}
// flatten array
$classMap = array();
if ($scanPsr0Packages) {
@ -215,21 +222,21 @@ EOF;
if (!is_dir($dir)) {
continue;
}
$whitelist = sprintf(
'{%s/%s.+$}',
preg_quote($dir),
($psrType === 'psr-0' & & strpos($namespace, '_') === false) ? preg_quote(strtr($namespace, '\\', '/')) : ''
);
// $whitelist = sprintf(
// '{%s/%s.+$}',
// preg_quote($dir),
// ($psrType === 'psr-0' & & strpos($namespace, '_') === false) ? preg_quote(strtr($namespace, '\\', '/')) : ''
// );
$namespaceFilter = $namespace === '' ? null : $namespace;
$classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $white list, $namespaceFilter, $classMap);
$classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $black list, $namespaceFilter, $classMap);
}
}
}
}
foreach ($autoloads['classmap'] as $dir) {
$classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, null , null, $classMap);
$classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist , null, $classMap);
}
ksort($classMap);
@ -277,9 +284,9 @@ EOF;
));
}
private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $white list = null, $namespaceFilter = null, array $classMap = array())
private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $black list = null, $namespaceFilter = null, array $classMap = array())
{
foreach ($this->generateClassMap($dir, $white list, $namespaceFilter) as $class => $path) {
foreach ($this->generateClassMap($dir, $black list, $namespaceFilter) as $class => $path) {
$pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path).",\n";
if (!isset($classMap[$class])) {
$classMap[$class] = $pathCode;
@ -294,9 +301,9 @@ EOF;
return $classMap;
}
private function generateClassMap($dir, $white list = null, $namespaceFilter = null)
private function generateClassMap($dir, $black list = null, $namespaceFilter = null)
{
return ClassMapGenerator::createMap($dir, $white list, $this->io, $namespaceFilter);
return ClassMapGenerator::createMap($dir, $black list, $this->io, $namespaceFilter);
}
public function buildPackageMap(InstallationManager $installationManager, PackageInterface $mainPackage, array $packages)
@ -359,11 +366,18 @@ EOF;
$psr4 = $this->parseAutoloadsType($packageMap, 'psr-4', $mainPackage);
$classmap = $this->parseAutoloadsType(array_reverse($sortedPackageMap), 'classmap', $mainPackage);
$files = $this->parseAutoloadsType($sortedPackageMap, 'files', $mainPackage);
$exclude = $this->parseAutoloadsType($sortedPackageMap, 'exclude-from-classmap', $mainPackage);
krsort($psr0);
krsort($psr4);
return array('psr-0' => $psr0, 'psr-4' => $psr4, 'classmap' => $classmap, 'files' => $files);
return array(
'psr-0' => $psr0,
'psr-4' => $psr4,
'classmap' => $classmap,
'files' => $files,
'exclude-from-classmap' => $exclude
);
}
/**
@ -674,6 +688,22 @@ FOOTER;
}
}
if ($type === 'exclude-from-classmap') {
// first escape user input
$path = sprintf(self::EXCLUDE_PATTERN, preg_quote($path));
if ($package === $mainPackage & & $package->getTargetDir() & & !is_readable($installPath.'/'.$path)) {
// remove target-dir from classmap entries of the root package
$targetDir = str_replace('\\< dirsep \ \ > ', '[\\\\/]', preg_quote(str_replace(array('/', '\\'), '< dirsep > ', $package->getTargetDir())));
$path = ltrim(preg_replace('{^'.$targetDir.'}', '', ltrim($path, '\\/')), '\\/');
} elseif ($package !== $mainPackage & & $package->getTargetDir() & & !is_readable($installPath.'/'.$path)) {
// add target-dir to exclude entries that don't have it
$path = preg_quote($package->getTargetDir()) . '/' . $path;
}
$autoloads[] = empty($installPath) ? $path : preg_quote($installPath) . '/' . $path;
continue;
}
$relativePath = empty($installPath) ? (empty($path) ? '.' : $path) : $installPath.'/'.$path;
if ($type === 'files' || $type === 'classmap') {