File: //opt/cloudlinux/alt-php54/root/usr/share/pear/SebastianBergmann/PHPCPD/CLI/Command.php
<?php
/**
* phpcpd
*
* Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* * Neither the name of Sebastian Bergmann nor the names of his
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package phpcpd
* @author Sebastian Bergmann <sebastian@phpunit.de>
* @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
* @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
* @since File available since Release 2.0.0
*/
namespace SebastianBergmann\PHPCPD\CLI;
use SebastianBergmann\PHPCPD\Detector\Detector;
use SebastianBergmann\PHPCPD\Detector\Strategy\DefaultStrategy;
use SebastianBergmann\PHPCPD\Log\PMD;
use SebastianBergmann\PHPCPD\Log\Text;
use SebastianBergmann\FinderFacade\FinderFacade;
use Symfony\Component\Console\Command\Command as AbstractCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* @author Sebastian Bergmann <sebastian@phpunit.de>
* @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
* @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
* @link http://github.com/sebastianbergmann/phpcpd/tree
* @since Class available since Release 2.0.0
*/
class Command extends AbstractCommand
{
/**
* Configures the current command.
*/
protected function configure()
{
$this->setName('phpcpd')
->setDefinition(
array(
new InputArgument(
'values',
InputArgument::IS_ARRAY
)
)
)
->addOption(
'names',
null,
InputOption::VALUE_REQUIRED,
'A comma-separated list of file names to check',
array('*.php')
)
->addOption(
'names-exclude',
null,
InputOption::VALUE_REQUIRED,
'A comma-separated list of file names to exclude',
array()
)
->addOption(
'exclude',
null,
InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
'Exclude a directory from code analysis'
)
->addOption(
'log-pmd',
null,
InputOption::VALUE_REQUIRED,
'Write result in PMD-CPD XML format to file'
)
->addOption(
'min-lines',
null,
InputOption::VALUE_REQUIRED,
'Minimum number of identical lines',
5
)
->addOption(
'min-tokens',
null,
InputOption::VALUE_REQUIRED,
'Minimum number of identical tokens',
70
)
->addOption(
'fuzzy',
null,
InputOption::VALUE_NONE,
'Fuzz variable names'
)
->addOption(
'progress',
null,
InputOption::VALUE_NONE,
'Show progress bar'
);
}
/**
* Executes the current command.
*
* @param InputInterface $input An InputInterface instance
* @param OutputInterface $output An OutputInterface instance
*
* @return null|integer null or 0 if everything went fine, or an error code
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$finder = new FinderFacade(
$input->getArgument('values'),
$input->getOption('exclude'),
$this->handleCSVOption($input, 'names'),
$this->handleCSVOption($input, 'names-exclude')
);
$files = $finder->findFiles();
if (empty($files)) {
$output->writeln('No files found to scan');
exit(1);
}
$progressHelper = null;
if ($input->getOption('progress')) {
$progressHelper = $this->getHelperSet()->get('progress');
$progressHelper->start($output, count($files));
}
$strategy = new DefaultStrategy;
$detector = new Detector($strategy, $progressHelper);
$quiet = $output->getVerbosity() == OutputInterface::VERBOSITY_QUIET;
$clones = $detector->copyPasteDetection(
$files,
$input->getOption('min-lines'),
$input->getOption('min-tokens'),
$input->getOption('fuzzy')
);
if ($input->getOption('progress')) {
$progressHelper->finish();
$output->writeln('');
}
if (!$quiet) {
$printer = new Text;
$printer->printResult($output, $clones);
unset($printer);
}
$logPmd = $input->getOption('log-pmd');
if ($logPmd) {
$pmd = new PMD($logPmd);
$pmd->processClones($clones);
unset($pmd);
}
if (!$quiet) {
print \PHP_Timer::resourceUsage() . "\n";
}
if (count($clones) > 0) {
exit(1);
}
}
/**
* @param Symfony\Component\Console\Input\InputOption $input
* @param string $option
* @return array
*/
private function handleCSVOption(InputInterface $input, $option)
{
$result = $input->getOption($option);
if (!is_array($result)) {
$result = explode(',', $result);
array_map('trim', $result);
}
return $result;
}
}