2012-01-05 03:11:37 +00:00
< ? php
/*
* This file is part of Composer .
*
* ( c ) Nils Adermann < naderman @ naderman . de >
* Jordi Boggiano < j . boggiano @ seld . be >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Composer\Command ;
use Composer\Composer ;
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Input\InputArgument ;
2012-01-15 12:00:39 +00:00
use Symfony\Component\Console\Input\InputOption ;
2012-01-05 03:11:37 +00:00
use Symfony\Component\Console\Output\OutputInterface ;
/**
* @ author Justin Rainbow < justin . rainbow @ gmail . com >
2012-01-15 12:00:39 +00:00
* @ author Jordi Boggiano < j . boggiano @ seld . be >
2012-01-05 03:11:37 +00:00
*/
class DependsCommand extends Command
{
2012-04-14 21:53:12 +00:00
protected $linkTypes = array (
'require' => 'requires' ,
'require-dev' => 'devRequires' ,
);
2012-02-19 14:04:40 +00:00
2012-01-05 03:11:37 +00:00
protected function configure ()
{
$this
-> setName ( 'depends' )
2012-01-15 12:00:39 +00:00
-> setDescription ( 'Shows which packages depend on the given package' )
2012-01-05 03:11:37 +00:00
-> setDefinition ( array (
2012-01-15 12:00:39 +00:00
new InputArgument ( 'package' , InputArgument :: REQUIRED , 'Package to inspect' ),
2012-08-15 16:29:43 +00:00
new InputOption ( 'link-type' , '' , InputOption :: VALUE_REQUIRED | InputOption :: VALUE_IS_ARRAY , 'Link types to show (require, require-dev)' , array_keys ( $this -> linkTypes ))
2012-01-05 03:11:37 +00:00
))
-> setHelp ( <<< EOT
2012-01-15 12:00:39 +00:00
Displays detailed information about where a package is referenced .
2012-01-05 03:11:37 +00:00
< info > php composer . phar depends composer / composer </ info >
EOT
)
;
}
protected function execute ( InputInterface $input , OutputInterface $output )
{
$composer = $this -> getComposer ();
2012-08-23 18:05:16 +00:00
$repos = $composer -> getRepositoryManager () -> getRepositories ();
2012-01-05 03:11:37 +00:00
2012-08-23 18:05:16 +00:00
$linkTypes = $this -> linkTypes ;
2012-01-05 03:11:37 +00:00
$needle = $input -> getArgument ( 'package' );
2012-06-23 09:58:18 +00:00
$verbose = ( bool ) $input -> getOption ( 'verbose' );
2012-08-23 18:05:16 +00:00
$types = array_map ( function ( $type ) use ( $linkTypes ) {
$type = rtrim ( $type , 's' );
if ( ! isset ( $linkTypes [ $type ])) {
throw new \InvalidArgumentException ( 'Unexpected link type: ' . $type . ', valid types: ' . implode ( ', ' , array_keys ( $linkTypes )));
}
2012-01-05 03:11:37 +00:00
2012-08-23 18:05:16 +00:00
return $type ;
}, $input -> getOption ( 'link-type' ));
foreach ( $repos as $repo ) {
$repo -> filterPackages ( function ( $package ) use ( $needle , $types , $output , $verbose ) {
static $outputPackages = array ();
2012-02-19 14:04:40 +00:00
2012-01-15 12:00:39 +00:00
foreach ( $types as $type ) {
2012-04-14 21:53:12 +00:00
foreach ( $package -> { 'get' . $this -> linkTypes [ $type ]}() as $link ) {
2012-01-08 21:39:42 +00:00
if ( $link -> getTarget () === $needle ) {
2012-01-15 12:00:39 +00:00
if ( $verbose ) {
2012-08-23 18:05:16 +00:00
$output -> writeln ( $package -> getPrettyName () . ' ' . $package -> getPrettyVersion () . ' <info>' . $type . '</info> ' . $link -> getPrettyConstraint ());
} elseif ( ! isset ( $outputPackages [ $package -> getName ()])) {
$output -> writeln ( $package -> getPrettyName ());
$outputPackages [ $package -> getName ()] = true ;
2012-01-15 12:00:39 +00:00
}
2012-01-08 21:39:42 +00:00
}
2012-01-05 03:11:37 +00:00
}
}
2012-08-23 18:05:16 +00:00
});
2012-01-15 12:00:39 +00:00
}
}
2012-05-22 10:07:08 +00:00
}