Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit 36fb2f0

Browse files
author
Chris Hulton
committed
Skip analysis is both types of duplication disabled
Currently duplication analysis runs regardless of the configuration settings, which are only checked at the time of issue reporting to determine whether or not to emit it. This means that if a configuration has all duplication disabled (identical and similar code), analysis will still run on all files, and then ultimately output nothing. This change completely skips analysis if both types of duplication are disabled.
1 parent bd7b54b commit 36fb2f0

File tree

5 files changed

+112
-12
lines changed

5 files changed

+112
-12
lines changed

lib/cc/engine/analyzers/engine_config.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ module Analyzers
66
class EngineConfig
77
DEFAULT_COUNT_THRESHOLD = 2
88
IDENTICAL_CODE_CHECK = "identical-code".freeze
9+
IDENTICAL_CODE_CHECK_LEGACY_NAME = "Identical code".freeze
910
SIMILAR_CODE_CHECK = "similar-code".freeze
11+
SIMILAR_CODE_CHECK_LEGACY_NAME = "Similar code".freeze
12+
CHECK_MAPPINGS = {
13+
IDENTICAL_CODE_CHECK_LEGACY_NAME => IDENTICAL_CODE_CHECK,
14+
SIMILAR_CODE_CHECK_LEGACY_NAME => SIMILAR_CODE_CHECK,
15+
}.freeze
1016

1117
InvalidConfigError = Class.new(StandardError)
1218

@@ -83,12 +89,18 @@ def patterns_for(language, fallbacks)
8389
Array(fetch_language(language).fetch("patterns", fallbacks))
8490
end
8591

86-
def check_enabled?(violation)
87-
legacy_config = legacy_checks.fetch(violation.fingerprint_check_name, {
92+
def check_enabled?(legacy_check_name, check_name)
93+
legacy_config = legacy_checks.fetch(legacy_check_name, {
8894
"enabled" => true
8995
})
9096

91-
qm_checks.fetch(violation.check_name, legacy_config).fetch("enabled", true)
97+
qm_checks.fetch(check_name, legacy_config).fetch("enabled", true)
98+
end
99+
100+
def all_checks_disabled?
101+
CHECK_MAPPINGS.none? do |legacy_check_name, check_name|
102+
check_enabled?(legacy_check_name, check_name)
103+
end
92104
end
93105

94106
private

lib/cc/engine/analyzers/reporter.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,10 @@ def insufficient_occurrence?(violation)
163163
end
164164

165165
def check_disabled?(violation)
166-
!engine_config.check_enabled?(violation)
166+
!engine_config.check_enabled?(
167+
violation.fingerprint_check_name,
168+
violation.check_name,
169+
)
167170
end
168171
end
169172
end

lib/cc/engine/duplication.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ def initialize(directory:, engine_config:, io:)
3030
end
3131

3232
def run
33+
return if engine_config.all_checks_disabled?
34+
3335
Dir.chdir(directory) do
3436
languages_to_analyze.each do |language|
3537
engine = LANGUAGES[language].new(engine_config: engine_config)

spec/cc/engine/analyzers/engine_config_spec.rb

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -341,14 +341,14 @@
341341
engine_config = stub_qm_config(similar: false)
342342

343343
violation = double(check_name: "similar-code", fingerprint_check_name: "Similar code")
344-
expect(engine_config.check_enabled?(violation)).to eq(false)
344+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(false)
345345
end
346346

347347
it "returns true for similar-code check when enabled" do
348348
engine_config = stub_qm_config(similar: true)
349349

350350
violation = double(check_name: "similar-code", fingerprint_check_name: "Similar code")
351-
expect(engine_config.check_enabled?(violation)).to eq(true)
351+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(true)
352352
end
353353

354354
it "respects legacy config when present" do
@@ -360,7 +360,7 @@
360360
)
361361

362362
violation = double(check_name: "similar-code", fingerprint_check_name: "Similar code")
363-
expect(engine_config.check_enabled?(violation)).to eq(false)
363+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(false)
364364
end
365365

366366
it "overrides legacy config when both present" do
@@ -372,35 +372,77 @@
372372
)
373373

374374
violation = double(check_name: "similar-code", fingerprint_check_name: "Similar code")
375-
expect(engine_config.check_enabled?(violation)).to eq(false)
375+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(false)
376376
end
377377

378378
it "returns true by default" do
379379
engine_config = described_class.new({ "config" => {} })
380380

381381
violation = double(check_name: "similar-code", fingerprint_check_name: "Similar code")
382-
expect(engine_config.check_enabled?(violation)).to eq(true)
382+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(true)
383383
end
384384

385385
it "returns false for identical-code check when disabled" do
386386
engine_config = stub_qm_config(identical: false)
387387

388388
violation = double(check_name: "identical-code", fingerprint_check_name: "Identical code")
389-
expect(engine_config.check_enabled?(violation)).to eq(false)
389+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(false)
390390
end
391391

392392
it "returns true for identical-code check when enabled" do
393393
engine_config = stub_qm_config(identical: true)
394394

395395
violation = double(check_name: "identical-code", fingerprint_check_name: "Identical code")
396-
expect(engine_config.check_enabled?(violation)).to eq(true)
396+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(true)
397397
end
398398

399399
it "returns true by default" do
400400
engine_config = described_class.new({ "config" => {} })
401401

402402
violation = double(check_name: "identical-code", fingerprint_check_name: "Identical code")
403-
expect(engine_config.check_enabled?(violation)).to eq(true)
403+
expect(engine_config.check_enabled?(violation.fingerprint_check_name, violation.check_name)).to eq(true)
404+
end
405+
end
406+
407+
describe "#all_checks_disabled?" do
408+
context "qm config" do
409+
it "returns true if all checks are disabled" do
410+
engine_config = stub_qm_config(identical: false, similar: false)
411+
412+
expect(engine_config.all_checks_disabled?).to eq(true)
413+
end
414+
415+
it "returns false if only one check is disabled" do
416+
engine_config = stub_qm_config(identical: false, similar: true)
417+
418+
expect(engine_config.all_checks_disabled?).to eq(false)
419+
end
420+
421+
it "returns false if no checks are disabled" do
422+
engine_config = stub_qm_config(identical: true, similar: true)
423+
424+
expect(engine_config.all_checks_disabled?).to eq(false)
425+
end
426+
end
427+
428+
context "legacy config" do
429+
it "returns true if all checks are disabled" do
430+
engine_config = stub_legacy_config(identical: false, similar: false)
431+
432+
expect(engine_config.all_checks_disabled?).to eq(true)
433+
end
434+
435+
it "returns false if only one check is disabled" do
436+
engine_config = stub_legacy_config(identical: false, similar: true)
437+
438+
expect(engine_config.all_checks_disabled?).to eq(false)
439+
end
440+
441+
it "returns false if no checks are disabled" do
442+
engine_config = stub_legacy_config(identical: true, similar: true)
443+
444+
expect(engine_config.all_checks_disabled?).to eq(false)
445+
end
404446
end
405447
end
406448

@@ -418,4 +460,17 @@ def stub_qm_config(similar: true, identical: true)
418460
},
419461
})
420462
end
463+
464+
def stub_legacy_config(similar: true, identical: true)
465+
described_class.new({
466+
"checks" => {
467+
"Similar code" => {
468+
"enabled" => similar,
469+
},
470+
"Identical code" => {
471+
"enabled" => identical,
472+
},
473+
},
474+
})
475+
end
421476
end

spec/cc/engine/duplication_spec.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
require "spec_helper"
2+
require "cc/engine/duplication"
3+
4+
RSpec.describe(CC::Engine::Duplication) do
5+
describe "#run" do
6+
it "skips analysis when all duplication checks are disabled" do
7+
dir = "foo"
8+
config = {
9+
"config" => {
10+
"checks" => {
11+
"similar-code" => {
12+
"enabled" => false,
13+
},
14+
"identical-code" => {
15+
"enabled" => false,
16+
},
17+
},
18+
},
19+
}
20+
expect(Dir).to_not receive(:chdir)
21+
expect(CC::Engine::Analyzers::Reporter).to_not receive(:new)
22+
23+
CC::Engine::Duplication.new(
24+
directory: dir, engine_config: config, io: double,
25+
).run
26+
end
27+
end
28+
end

0 commit comments

Comments
 (0)