mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-29 18:22:41 +01:00
Don't skip even lines in copied code detector
Summary: PHP 3 basics: `each()` advances internal pointer so calling `next()` is wrong. Test Plan: New test. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D4011
This commit is contained in:
parent
254678d41d
commit
4d7b441834
4 changed files with 71 additions and 1 deletions
|
@ -245,6 +245,7 @@ phutil_register_library_map(array(
|
||||||
'DifferentialDiffCreateController' => 'applications/differential/controller/DifferentialDiffCreateController.php',
|
'DifferentialDiffCreateController' => 'applications/differential/controller/DifferentialDiffCreateController.php',
|
||||||
'DifferentialDiffProperty' => 'applications/differential/storage/DifferentialDiffProperty.php',
|
'DifferentialDiffProperty' => 'applications/differential/storage/DifferentialDiffProperty.php',
|
||||||
'DifferentialDiffTableOfContentsView' => 'applications/differential/view/DifferentialDiffTableOfContentsView.php',
|
'DifferentialDiffTableOfContentsView' => 'applications/differential/view/DifferentialDiffTableOfContentsView.php',
|
||||||
|
'DifferentialDiffTestCase' => 'applications/differential/storage/__tests__/DifferentialDiffTestCase.php',
|
||||||
'DifferentialDiffViewController' => 'applications/differential/controller/DifferentialDiffViewController.php',
|
'DifferentialDiffViewController' => 'applications/differential/controller/DifferentialDiffViewController.php',
|
||||||
'DifferentialException' => 'applications/differential/exception/DifferentialException.php',
|
'DifferentialException' => 'applications/differential/exception/DifferentialException.php',
|
||||||
'DifferentialExceptionMail' => 'applications/differential/mail/DifferentialExceptionMail.php',
|
'DifferentialExceptionMail' => 'applications/differential/mail/DifferentialExceptionMail.php',
|
||||||
|
@ -1502,6 +1503,7 @@ phutil_register_library_map(array(
|
||||||
'DifferentialDiffCreateController' => 'DifferentialController',
|
'DifferentialDiffCreateController' => 'DifferentialController',
|
||||||
'DifferentialDiffProperty' => 'DifferentialDAO',
|
'DifferentialDiffProperty' => 'DifferentialDAO',
|
||||||
'DifferentialDiffTableOfContentsView' => 'AphrontView',
|
'DifferentialDiffTableOfContentsView' => 'AphrontView',
|
||||||
|
'DifferentialDiffTestCase' => 'ArcanistPhutilTestCase',
|
||||||
'DifferentialDiffViewController' => 'DifferentialController',
|
'DifferentialDiffViewController' => 'DifferentialController',
|
||||||
'DifferentialException' => 'Exception',
|
'DifferentialException' => 'Exception',
|
||||||
'DifferentialExceptionMail' => 'DifferentialMail',
|
'DifferentialExceptionMail' => 'DifferentialMail',
|
||||||
|
|
|
@ -204,7 +204,7 @@ final class DifferentialDiff extends DifferentialDAO {
|
||||||
$copies = array();
|
$copies = array();
|
||||||
foreach ($changeset->getHunks() as $hunk) {
|
foreach ($changeset->getHunks() as $hunk) {
|
||||||
$added = array_map('trim', $hunk->getAddedLines());
|
$added = array_map('trim', $hunk->getAddedLines());
|
||||||
for (reset($added); list($line, $code) = each($added); next($added)) {
|
for (reset($added); list($line, $code) = each($added); ) {
|
||||||
if (isset($map[$code])) { // We found a long matching line.
|
if (isset($map[$code])) { // We found a long matching line.
|
||||||
$best_length = 0;
|
$best_length = 0;
|
||||||
foreach ($map[$code] as $val) { // Explore all candidates.
|
foreach ($map[$code] as $val) { // Explore all candidates.
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class DifferentialDiffTestCase extends ArcanistPhutilTestCase {
|
||||||
|
|
||||||
|
public function testDetectCopiedCode() {
|
||||||
|
$root = dirname(__FILE__).'/diff/';
|
||||||
|
$parser = new ArcanistDiffParser();
|
||||||
|
|
||||||
|
$diff = DifferentialDiff::newFromRawChanges(
|
||||||
|
$parser->parseDiff(Filesystem::readFile($root.'lint_engine.diff')));
|
||||||
|
$copies = idx(head($diff->getChangesets())->getMetadata(), 'copy:lines');
|
||||||
|
|
||||||
|
$this->assertEqual(
|
||||||
|
array_combine(range(237, 252), range(167, 182)),
|
||||||
|
ipull($copies, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
diff --git a/ArcanistLintEngine.php b/ArcanistLintEngine.php
|
||||||
|
index 41e1153..255b049 100644
|
||||||
|
--- a/ArcanistLintEngine.php
|
||||||
|
+++ b/ArcanistLintEngine.php
|
||||||
|
@@ -165,22 +165,6 @@ abstract class ArcanistLintEngine {
|
||||||
|
$stopped = array();
|
||||||
|
$linters = $this->buildLinters();
|
||||||
|
|
||||||
|
- if (!$linters) {
|
||||||
|
- throw new ArcanistNoEffectException("No linters to run.");
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- $have_paths = false;
|
||||||
|
- foreach ($linters as $linter) {
|
||||||
|
- if ($linter->getPaths()) {
|
||||||
|
- $have_paths = true;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (!$have_paths) {
|
||||||
|
- throw new ArcanistNoEffectException("No paths are lintable.");
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
$exceptions = array();
|
||||||
|
foreach ($linters as $linter_name => $linter) {
|
||||||
|
try {
|
||||||
|
@@ -251,6 +235,22 @@ abstract class ArcanistLintEngine {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (!$linters) {
|
||||||
|
+ throw new ArcanistNoEffectException("No linters to run.");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ $have_paths = false;
|
||||||
|
+ foreach ($linters as $linter) {
|
||||||
|
+ if ($linter->getPaths()) {
|
||||||
|
+ $have_paths = true;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!$have_paths) {
|
||||||
|
+ throw new ArcanistNoEffectException("No paths are lintable.");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if ($exceptions) {
|
||||||
|
throw new PhutilAggregateException('Some linters failed:', $exceptions);
|
||||||
|
}
|
Loading…
Reference in a new issue