blob: 1802aa9261dc883a10c760ebbe42db77c4151b3d (
plain)
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
|
#!/usr/bin/env ruby
# Adds tags based on error and failures output (e.g., from a CI log),
# without running any spec code.
tags_dir = %w[
spec/tags
spec/tags/ruby
].find { |dir| Dir.exist?("#{dir}/language") }
abort 'Could not find tags directory' unless tags_dir
output = ARGF.readlines
NUMBER = /^\d+\)$/
ERROR_OR_FAILED = / (ERROR|FAILED)$/
SPEC_FILE = /^(\/.+_spec\.rb)\:\d+/
output.slice_before(NUMBER).select { |number, error_line, *rest|
number =~ NUMBER and error_line =~ ERROR_OR_FAILED
}.each { |number, error_line, *rest|
description = error_line.match(ERROR_OR_FAILED).pre_match
spec_file = rest.find { |line| line =~ SPEC_FILE }
spec_file = spec_file[SPEC_FILE, 1]
prefix = spec_file.index('spec/ruby')
spec_file = spec_file[prefix..-1]
tags_file = spec_file.sub('spec/ruby/', "#{tags_dir}/").sub(/_spec\.rb$/, '_tags.txt')
dir = File.dirname(tags_file)
Dir.mkdir(dir) unless Dir.exist?(dir)
tag_line = "fails:#{description}"
lines = File.exist?(tags_file) ? File.readlines(tags_file, chomp: true) : []
unless lines.include?(tag_line)
File.write(tags_file, (lines + [tag_line]).join("\n") + "\n")
end
}
|