bake-toolkit 2.35.3 → 2.36.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/bakeqac +55 -20
- data/lib/bakeqac/filter.rb +47 -0
- data/lib/bakeqac/options/options.rb +2 -2
- data/lib/common/ext/file.rb +8 -0
- data/lib/common/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 405e09a71d1a19b3fc8afd55052713096efc20be
|
4
|
+
data.tar.gz: 9e6f9eb763a0640ad0e7df22f573b6617a027bfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d785d2498ec565930d8661494d20b1d182f93bab7bb140e9b86b8d22ceb04579f461bcb02bdffa23da40f1171262d7588f36019404313819056ec33daa89b075
|
7
|
+
data.tar.gz: 5533af6a837fe9998da11d02fd026d3161a452ea67dc4fc9fb63819efb8482db346bb6b544944392849329813486a73fe721471d408baea2bd759a1657e9b487
|
data/bin/bakeqac
CHANGED
@@ -5,10 +5,12 @@ require 'fileutils'
|
|
5
5
|
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
6
6
|
|
7
7
|
require "bakeqac/options/options"
|
8
|
+
require "bakeqac/filter"
|
8
9
|
require 'bake/toolchain/colorizing_formatter'
|
9
10
|
require 'bake/options/options'
|
10
11
|
require 'common/process'
|
11
12
|
require 'common/utils'
|
13
|
+
require 'common/ext/file'
|
12
14
|
|
13
15
|
STDOUT.sync = true
|
14
16
|
STDERR.sync = true
|
@@ -78,6 +80,7 @@ end
|
|
78
80
|
@options = BakeqacOptions.new(ARGV)
|
79
81
|
bakeOptions = Options.new([])
|
80
82
|
@options.parse_options(bakeOptions)
|
83
|
+
pfilter = ProjectFilter.new(@options)
|
81
84
|
success = false
|
82
85
|
|
83
86
|
###### PREREQUISITE 2: BAKE OPTIONS ######
|
@@ -199,9 +202,7 @@ end
|
|
199
202
|
if @options.qacfilter
|
200
203
|
if success
|
201
204
|
puts filterOutput
|
202
|
-
|
203
|
-
f.puts(filter.uniq)
|
204
|
-
end
|
205
|
+
ProjectFilter.writeFilter(filter)
|
205
206
|
else
|
206
207
|
puts consoleOutput # error
|
207
208
|
end
|
@@ -218,16 +219,6 @@ end
|
|
218
219
|
|
219
220
|
puts "bakeqac: printing results..."
|
220
221
|
|
221
|
-
filter = []
|
222
|
-
useFilter = File.exist?("#{@options.qacdata}/filter.txt") && @options.qacfilter
|
223
|
-
|
224
|
-
if useFilter
|
225
|
-
File.open("#{@options.qacdata}/filter.txt", "r") do |f|
|
226
|
-
f.each_line { |line| filter << line.strip }
|
227
|
-
end
|
228
|
-
filter.delete_if { |f| (f.end_with? "/gtest") or (f.end_with? "/gmock") }
|
229
|
-
end
|
230
|
-
|
231
222
|
cmd = qaExe + ["view", "-P", @options.qacdata, "-m", "STDOUT"]
|
232
223
|
if not @options.qacnoformat
|
233
224
|
cmd += ["-f", "%?u==0%(MSG: %:trc: %)%F(%l,%c): (%r:%N)%t%?v%(\n%v%)"]
|
@@ -235,7 +226,7 @@ end
|
|
235
226
|
|
236
227
|
success, consoleOutput, checkError = executeQacli(cmd)
|
237
228
|
|
238
|
-
if
|
229
|
+
if ProjectFilter.is_valid?
|
239
230
|
|
240
231
|
if !checkError # success # HACK: seems that QAC returns with error if there too much issues
|
241
232
|
# 1. filter
|
@@ -247,12 +238,7 @@ end
|
|
247
238
|
scan_res = line.scan(/\/\/ ======= Results for ([a-zA-Z]{0,1})(:{0,1})(.*)/)
|
248
239
|
if scan_res.length > 0
|
249
240
|
converted_line = (scan_res[0][0].downcase + scan_res[0][1] + scan_res[0][2].gsub(/\\/,"/"))
|
250
|
-
|
251
|
-
if converted_line.include?(fil+"/") and not converted_line.include?(fil+"/test/") and not converted_line.include?(fil+"/mock/") and not converted_line.include?(fil+"/.qacdata/")
|
252
|
-
foundFile = true
|
253
|
-
break
|
254
|
-
end
|
255
|
-
end
|
241
|
+
foundFile = ProjectFilter.localFile(converted_line)
|
256
242
|
end
|
257
243
|
if foundFile && !line.include?("QAC++ Deep Flow Static Analyser")
|
258
244
|
filteredLines << line
|
@@ -383,6 +369,55 @@ end
|
|
383
369
|
|
384
370
|
end
|
385
371
|
|
372
|
+
###### STEP 5: REPORT MDR (OPTIONAL) ######
|
373
|
+
|
374
|
+
if success and !@options.qacstep.nil? and @options.qacstep.include?("mdr")
|
375
|
+
FileUtils::mkdir_p @options.qacdata
|
376
|
+
|
377
|
+
puts "bakeqac: generating MDR report..."
|
378
|
+
|
379
|
+
cmd = qaExe + ["report", "-P", @options.qacdata, "-t", "MDR"]
|
380
|
+
|
381
|
+
success, consoleOutput = ProcessHelper.run(cmd, false)
|
382
|
+
puts consoleOutput
|
383
|
+
|
384
|
+
if success
|
385
|
+
require "json"
|
386
|
+
jsons = Dir.glob(@options.qacdata + "/prqa/reports/data/*.json")
|
387
|
+
|
388
|
+
maxComplexity = 0
|
389
|
+
numGreater10 = 0
|
390
|
+
jsons.each do |file|
|
391
|
+
raw = File.read(file)
|
392
|
+
data = JSON.parse(raw)
|
393
|
+
|
394
|
+
filename = File.normalize(data["file"])
|
395
|
+
|
396
|
+
if ProjectFilter.localFile(filename)
|
397
|
+
Bake.formatter.printAdditionalInfo(filename)
|
398
|
+
entities = data["entities"]
|
399
|
+
if Array === entities
|
400
|
+
entities.each do |e|
|
401
|
+
if e.has_key?("type") && e["type"] == "function"
|
402
|
+
if e.has_key?("metrics") && e["metrics"].has_key?("STCYC")
|
403
|
+
complexity = e["metrics"]["STCYC"].to_i
|
404
|
+
str = " #{e["name"]}:#{e["line"]}: cyclomatic complexity = #{complexity}"
|
405
|
+
complexity > 10 ? Bake.formatter.printWarning(str) : puts(str)
|
406
|
+
maxComplexity = complexity if complexity > maxComplexity
|
407
|
+
numGreater10 +=1 if complexity > 10
|
408
|
+
end
|
409
|
+
end
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
Bake.formatter.printInfo("\n**** Maximum cyclomatic complexity: #{maxComplexity} ****")
|
415
|
+
resultStr = "**** Number of functions with cyclomatic complexity > 10: #{numGreater10} ****"
|
416
|
+
numGreater10 > 0 ? Bake.formatter.printWarning(resultStr) : Bake.formatter.printSuccess(resultStr)
|
417
|
+
else
|
418
|
+
Bake.formatter.printError("Failed to generate MDR report.")
|
419
|
+
end
|
420
|
+
end
|
386
421
|
|
387
422
|
#### TODO: unittest for report
|
388
423
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Bake
|
2
|
+
|
3
|
+
class ProjectFilter
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
@@filterList = nil
|
7
|
+
@@valid = nil
|
8
|
+
@@options = options
|
9
|
+
@@filter_filename = "#{@@options.qacdata}/filter.txt"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.projects
|
13
|
+
calcFilter_internal() if @@filterList.nil?
|
14
|
+
return @@filterList
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.is_valid?
|
18
|
+
calcFilter_internal() if @@valid.nil?
|
19
|
+
return @@valid
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.localFile(str)
|
23
|
+
return true if not is_valid?
|
24
|
+
projects.any? { |fil| str.include?(fil+"/") and not str.include?(fil+"/test/") and not str.include?(fil+"/mock/") and not str.include?(fil+"/.qacdata/") }
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.writeFilter(filter)
|
28
|
+
File.open(@@filter_filename, "w+") do |f|
|
29
|
+
filter.uniq!
|
30
|
+
filter.delete_if { |f| (f.end_with? "/gtest") or (f.end_with? "/gmock") }
|
31
|
+
f.puts(filter)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.calcFilter_internal
|
36
|
+
@@filterList = []
|
37
|
+
@@valid = File.exist?(@@filter_filename) && @@options.qacfilter
|
38
|
+
if @@valid
|
39
|
+
File.open(@@filter_filename, "r") do |f|
|
40
|
+
f.each_line { |line| @@filterList << line.strip }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -63,7 +63,7 @@ module Bake
|
|
63
63
|
puts " --acf <file> Set a specific analysis config file, otherwise $(QAC_HOME)/config/acf/default.acf will be used."
|
64
64
|
puts " --qaccctpatch If specified, some adaptions to cct are made. Might improve the result - no guarantee."
|
65
65
|
puts " --qacdata <dir> QAC writes data into this folder. Default is <working directory>/.qacdata."
|
66
|
-
puts " --qacstep admin|analyze|view|report Steps can be ORed. Per default admin|analyze|view will be executed."
|
66
|
+
puts " --qacstep admin|analyze|view|report|mdr Steps can be ORed. Per default admin|analyze|view will be executed."
|
67
67
|
puts " --qacnofilter Output will be printed immediately and unfiltered. Per default filters are used to reduce noise."
|
68
68
|
puts " --qacrawformat Raw QAC output (with incomplete MISRA rules!)."
|
69
69
|
puts " --qacretry <seconds> If build or result step fail due to refused license, the step will be retried until timeout."
|
@@ -129,7 +129,7 @@ module Bake
|
|
129
129
|
|
130
130
|
if !@qacstep.nil?
|
131
131
|
@qacstep.split("|").each do |s|
|
132
|
-
if not ["admin", "analyze", "view", "report"].include?s
|
132
|
+
if not ["admin", "analyze", "view", "report", "mdr"].include?s
|
133
133
|
Bake.formatter.printError("Error: incorrect qacstep name.")
|
134
134
|
ExitHelper.exit(1)
|
135
135
|
end
|
data/lib/common/ext/file.rb
CHANGED
@@ -8,6 +8,14 @@ class File
|
|
8
8
|
filename[0] == SLASH or filename[1] == ':'
|
9
9
|
end
|
10
10
|
|
11
|
+
def self.normalize(filename)
|
12
|
+
if filename.length > 1
|
13
|
+
toIsWindowsAbs = filename[1] == ':'
|
14
|
+
return filename[0].downcase + filename[1..-1] if toIsWindowsAbs
|
15
|
+
end
|
16
|
+
return filename
|
17
|
+
end
|
18
|
+
|
11
19
|
# seems both are rel or both are abs in all cases
|
12
20
|
def self.rel_from_to_project(from,to,endWithSlash = true)
|
13
21
|
|
data/lib/common/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bake-toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.36.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Schaal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rtext
|
@@ -190,6 +190,7 @@ files:
|
|
190
190
|
- lib/bake/toolchain/ti.rb
|
191
191
|
- lib/bake/util.rb
|
192
192
|
- lib/bakeclean/options/options.rb
|
193
|
+
- lib/bakeqac/filter.rb
|
193
194
|
- lib/bakeqac/options/options.rb
|
194
195
|
- lib/bakery/buildPattern.rb
|
195
196
|
- lib/bakery/model/language.rb
|