aboutsummaryrefslogtreecommitdiffstats
path: root/spec/mspec/tool/tag_from_output.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/mspec/tool/tag_from_output.rb')
-rw-r--r--spec/mspec/tool/tag_from_output.rb39
1 files changed, 39 insertions, 0 deletions
diff --git a/spec/mspec/tool/tag_from_output.rb b/spec/mspec/tool/tag_from_output.rb
new file mode 100644
index 0000000000..62764c3ff5
--- /dev/null
+++ b/spec/mspec/tool/tag_from_output.rb
@@ -0,0 +1,39 @@
+# 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
+# Remove leading "[exec] " from JRuby logs
+output = output.map { |line| line.sub(/^\[exec\] /, '') }
+
+NUMBER = /^\d+\)$/
+ERROR_OR_FAILED = / (ERROR|FAILED)$/
+SPEC_FILE = /^(\/.+_spec\.rb)\:\d+/
+
+failures = 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}"
+ unless File.exist?(tags_file) and File.readlines(tags_file, chomp: true).include?(tag_line)
+ File.open(tags_file, 'a') do |f|
+ f.puts tag_line
+ end
+ end
+}