-
-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathextract-log-types
executable file
·51 lines (44 loc) · 1.63 KB
/
extract-log-types
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env ruby
if ARGV.empty? || !File.directory?(ARGV[0])
STDERR.puts "Usage: #{$PROGRAM_NAME} <SOURCE>"
exit 1
end
%w(find pathname set).each do |lib|
require lib
end
types = Hash.new
Find.find(ARGV[0]) do |path|
next unless File.file? path
next unless File.extname(path) == '.cpp'
contents = File.read(path)
v3calls = contents.scan(/\bLog\(("[^"]+"|MODNAME),\s+LOG_([A-Z]+),/).map { |type, level| { type: type, level: level }}
v4calls = contents.scan(/\b(RawIO|Debug|Normal|Warning|Critical)\(("[^"]+"|MODNAME),/).map { |level, type| { level: level, type: type }}
(v3calls + v4calls).each do |log|
if log[:type] == 'MODNAME'
if path =~ /\/((?:m|core)_[a-z0-9_]+)(?:\.cpp|\/)?/
log[:type] = $~[1]
else
STDERR.puts "WTF: unable to extract module name from #{path}"
next
end
else
log[:type] = log[:type][1...-1]
end
types[log[:type]] ||= Set.new
types[log[:type]] << log[:level].downcase
end
end
if types.empty?
STDERR.puts "No log calls found. Did you specify the right directory?"
exit 1
end
longest_type = types.keys.max_by(&:length).length
longest_level = types.values.map { |t| t.sum(&:length) + ((t.size - 1) * 4) }.max
levelorder = %w(sparse critical warning default normal verbose debug rawio)
types.sort.each do |type, levels|
type_padding = longest_type - type.length
levelstr = levels.to_a.sort_by { |obj| levelorder.index obj }.join('<br>')
level_padding = longest_level - levelstr.length
message = type =~ /^m_(.+)$/ ? "Messages relating to [the #{$1} module](/{{ version }}/modules/#{$1})." : ''
puts " #{type}#{' ' * type_padding} | #{levelstr}#{' ' * level_padding} | #{message}"
end