You are here

public function SiteAuditCheckCodebasePhpCopyPasteDetection::calculateScore in Site Audit 8.2

Implements \SiteAudit\Check\Abstract\calculateScore().

Overrides SiteAuditCheckAbstract::calculateScore

File

Check/Codebase/PhpCopyPasteDetection.php, line 113
Contains \SiteAudit\Check\Codebase\PhpMessDetection.

Class

SiteAuditCheckCodebasePhpCopyPasteDetection
Class SiteAuditCheckCodebasePhpCopyPasteDetection.

Code

public function calculateScore() {

  // Get the path of phpcpd.
  $phpcpd_path = $this
    ->getExecPath('phpcpd');
  if ($phpcpd_path === '') {
    $this->registry['phpcpd_path'] = TRUE;
    return SiteAuditCheckAbstract::AUDIT_CHECK_SCORE_INFO;
  }

  // Get the custom code paths.
  // Get the custom code paths.
  $custom_code = $this
    ->getCustomCodePaths();
  if ($custom_code === FALSE) {
    return SiteAuditCheckAbstract::AUDIT_CHECK_SCORE_FAIL;
  }
  if (empty($custom_code)) {
    $this->registry['custom_code'] = TRUE;
    return SiteAuditCheckAbstract::AUDIT_CHECK_SCORE_INFO;
  }

  // Get options.
  $valid_options = array(
    'names' => '*.php,*.module,*.install,*.test,*.inc,*.profile,*.theme',
    'names-exclude' => '*.features.*,*_default.inc,*.ds.inc,*.strongarm.inc,*.panelizer.inc,*_defaults.inc,*.box.inc,*.context.inc,*displays.inc',
  );
  $options = $this
    ->getOptions($valid_options, 'phpcpd-');
  $temp_file = tempnam(sys_get_temp_dir(), 'site_audit');
  $option_string = " --log-pmd={$temp_file}";
  foreach ($options as $option => $value) {
    $option_string .= " --{$option}";
    if ($value !== TRUE) {
      $option_string .= "={$value}";
    }
  }

  // Suppress XML errors which will be handled by try catch instead.
  libxml_use_internal_errors(TRUE);
  foreach ($custom_code as $path) {
    $command = $phpcpd_path . ' ' . $path . $option_string;
    $process = new Process($command);
    $process
      ->run();
    try {
      $output = simplexml_load_file($temp_file);
      foreach ($output as $duplication) {
        $this->registry['phpcpd_out'][] = $duplication;
      }
    } catch (Exception $e) {
      $this
        ->logXmlError($path, 'phpcpd');
      continue;
    }
  }
  if (empty($this->registry['phpcpd_out'])) {
    return SiteAuditCheckAbstract::AUDIT_CHECK_SCORE_PASS;
  }
  return SiteAuditCheckAbstract::AUDIT_CHECK_SCORE_WARN;
}