/**
* Handles the "puli map --list" command.
*
* @param Args $args The console arguments.
* @param IO $io The I/O.
*
* @return int The status code.
*/
public function handleList(Args $args, IO $io)
{
$packageNames = ArgsUtil::getPackageNames($args, $this->packages);
$states = $this->getPathMappingStates($args);
$printState = count($states) > 1;
$printPackageName = count($packageNames) > 1;
$printHeaders = $printState || $printPackageName;
$printAdvice = true;
$indentation = $printState && $printPackageName ? 8 : ($printState || $printPackageName ? 4 : 0);
foreach ($states as $state) {
$statePrinted = !$printState;
if (PathMappingState::CONFLICT === $state) {
$expr = Expr::method('getContainingPackage', Expr::method('getName', Expr::in($packageNames)))->andMethod('getState', Expr::same($state));
$mappings = $this->repoManager->findPathMappings($expr);
if (!$mappings) {
continue;
}
$printAdvice = false;
if ($printState) {
$this->printPathMappingStateHeader($io, $state);
}
$this->printConflictTable($io, $mappings, $printState ? 4 : 0);
if ($printHeaders) {
$io->writeLine('');
}
continue;
}
foreach ($packageNames as $packageName) {
$expr = Expr::method('getContainingPackage', Expr::method('getName', Expr::same($packageName)))->andMethod('getState', Expr::same($state));
$mappings = $this->repoManager->findPathMappings($expr);
if (!$mappings) {
continue;
}
$printAdvice = false;
if (!$statePrinted) {
$this->printPathMappingStateHeader($io, $state);
$statePrinted = true;
}
if ($printPackageName) {
$prefix = $printState ? ' ' : '';
$io->writeLine(sprintf('%sPackage: %s', $prefix, $packageName));
$io->writeLine('');
}
$this->printMappingTable($io, $mappings, $indentation, PathMappingState::ENABLED === $state);
if ($printHeaders) {
$io->writeLine('');
}
}
}
if ($printAdvice) {
$io->writeLine('No path mappings. Use "puli map <path> <file>" to map a Puli path to a file or directory.');
}
return 0;
}