ruby-changes:46601
From: eregon <ko1@a...>
Date: Sun, 14 May 2017 23:09:35 +0900 (JST)
Subject: [ruby-changes:46601] eregon:r58716 (trunk): Update to ruby/mspec@4b980493
eregon 2017-05-14 23:09:29 +0900 (Sun, 14 May 2017) New Revision: 58716 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=58716 Log: Update to ruby/mspec@4b980493 Added directories: trunk/spec/mspec/tool/sync/ Added files: trunk/spec/mspec/lib/mspec/helpers/warning.rb trunk/spec/mspec/spec/helpers/suppress_warning_spec.rb trunk/spec/mspec/tool/sync/.gitignore trunk/spec/mspec/tool/sync/sync-rubyspec.rb trunk/spec/mspec/tool/sync/sync.yml Modified files: trunk/spec/mspec/lib/mspec/helpers.rb trunk/spec/mspec/lib/mspec/runner/formatters/unit.rb trunk/spec/mspec/spec/utils/script_spec.rb Index: spec/mspec/tool/sync/.gitignore =================================================================== --- spec/mspec/tool/sync/.gitignore (nonexistent) +++ spec/mspec/tool/sync/.gitignore (revision 58716) @@ -0,0 +1,4 @@ https://github.com/ruby/ruby/blob/trunk/spec/mspec/tool/sync/.gitignore#L1 +/jruby +/rubinius +/ruby +/truffleruby Index: spec/mspec/tool/sync/sync-rubyspec.rb =================================================================== --- spec/mspec/tool/sync/sync-rubyspec.rb (nonexistent) +++ spec/mspec/tool/sync/sync-rubyspec.rb (revision 58716) @@ -0,0 +1,210 @@ https://github.com/ruby/ruby/blob/trunk/spec/mspec/tool/sync/sync-rubyspec.rb#L1 +IMPLS = { + truffleruby: { + git: "https://github.com/graalvm/truffleruby.git", + from_commit: "f10ab6988d", + }, + jruby: { + git: "https://github.com/jruby/jruby.git", + from_commit: "f10ab6988d", + }, + rbx: { + git: "https://github.com/rubinius/rubinius.git", + }, + mri: { + git: "https://github.com/ruby/ruby.git", + master: "trunk", + prefix: "spec/rubyspec", + }, +} + +# Assuming the rubyspec repo is a sibling of the mspec repo +RUBYSPEC_REPO = File.expand_path("../../../../rubyspec", __FILE__) +raise RUBYSPEC_REPO unless Dir.exist?(RUBYSPEC_REPO) + +NOW = Time.now + +class RubyImplementation + attr_reader :name + + def initialize(name, data) + @name = name.to_s + @data = data + end + + def git_url + @data[:git] + end + + def default_branch + @data[:master] || "master" + end + + def repo_name + File.basename(git_url, ".git") + end + + def repo_org + File.basename(File.dirname(git_url)) + end + + def from_commit + from = @data[:from_commit] + "#{from}..." if from + end + + def prefix + @data[:prefix] || "spec/ruby" + end + + def rebased_branch + "#{@name}-rebased" + end +end + +def sh(*args) + puts args.join(' ') + system(*args) + raise unless $?.success? +end + +def branch?(name) + branches = `git branch`.sub('*', '').lines.map(&:strip) + branches.include?(name) +end + +def update_repo(impl) + unless File.directory? impl.repo_name + sh "git", "clone", impl.git_url + end + + Dir.chdir(impl.repo_name) do + puts Dir.pwd + + sh "git", "checkout", impl.default_branch + sh "git", "pull" + end +end + +def filter_commits(impl) + Dir.chdir(impl.repo_name) do + date = NOW.strftime("%F") + branch = "specs-#{date}" + + unless branch?(branch) + sh "git", "checkout", "-b", branch + sh "git", "filter-branch", "-f", "--subdirectory-filter", impl.prefix, *impl.from_commit + sh "git", "push", "-f", RUBYSPEC_REPO, "#{branch}:#{impl.name}" + end + end +end + +def rebase_commits(impl) + Dir.chdir(RUBYSPEC_REPO) do + sh "git", "checkout", "master" + sh "git", "pull" + + rebased = impl.rebased_branch + if branch?(rebased) + puts "#{rebased} already exists, assuming it correct" + sh "git", "checkout", rebased + else + sh "git", "checkout", impl.name + + if ENV["LAST_MERGE"] + last_merge = `git log -n 1 --format='%H %ct' #{ENV["LAST_MERGE"]}` + else + last_merge = `git log --grep='Merge ruby/spec commit' -n 1 --format='%H %ct'` + end + last_merge, commit_timestamp = last_merge.chomp.split(' ') + + raise "Could not find last merge" unless last_merge + puts "Last merge is #{last_merge}" + + commit_date = Time.at(Integer(commit_timestamp)) + days_since_last_merge = (NOW-commit_date) / 86400 + if days_since_last_merge > 60 + raise "#{days_since_last_merge} since last merge, probably wrong commit" + end + + puts "Rebasing..." + sh "git", "branch", "-D", rebased if branch?(rebased) + sh "git", "checkout", "-b", rebased, impl.name + sh "git", "rebase", "--onto", "master", last_merge + end + end +end + +def test_new_specs + require "yaml" + Dir.chdir(RUBYSPEC_REPO) do + versions = YAML.load_file(".travis.yml") + versions = versions["matrix"]["include"].map { |job| job["rvm"] } + versions.delete "ruby-head" + min_version, max_version = versions.minmax + + run_rubyspec = -> version { + command = "chruby #{version} && ../mspec/bin/mspec -j" + sh ENV["SHELL"], "-c", command + } + run_rubyspec[min_version] + run_rubyspec[max_version] + run_rubyspec["trunk"] + end +end + +def verify_commits(impl) + puts + Dir.chdir(RUBYSPEC_REPO) do + history = `git log master...` + history.lines.slice_before(/^commit \h{40}$/).each do |commit, *message| + commit = commit.chomp.split.last + message = message.join + if /\W(#\d+)/ === message + puts "Commit #{commit} contains an unqualified issue number: #{$1}" + puts "Replace it with #{impl.repo_org}/#{impl.repo_name}#{$1}" + sh "git", "rebase", "-i", "#{commit}^" + end + end + + puts "Manually check commit messages:" + sh "git", "log", "master..." + end +end + +def fast_forward_master(impl) + Dir.chdir(RUBYSPEC_REPO) do + sh "git", "checkout", "master" + sh "git", "merge", "--ff-only", "#{impl.name}-rebased" + end +end + +def check_ci + puts + puts <<-EOS + Push to master, and check that the CI passes: + https://github.com/ruby/spec/commits/master + EOS +end + +def main(impls) + impls.each_pair do |impl, data| + impl = RubyImplementation.new(impl, data) + update_repo(impl) + filter_commits(impl) + rebase_commits(impl) + test_new_specs + verify_commits(impl) + fast_forward_master(impl) + check_ci + end +end + +if ARGV == ["all"] + impls = IMPLS +else + args = ARGV.map { |arg| arg.to_sym } + raise ARGV.to_s unless (args - IMPLS.keys).empty? + impls = IMPLS.select { |impl| args.include?(impl) } +end + +main(impls) Index: spec/mspec/tool/sync/sync.yml =================================================================== --- spec/mspec/tool/sync/sync.yml (nonexistent) +++ spec/mspec/tool/sync/sync.yml (revision 58716) @@ -0,0 +1,4 @@ https://github.com/ruby/ruby/blob/trunk/spec/mspec/tool/sync/sync.yml#L1 +mri: 4e95b8c265d4d365477a05fe6701186415576303 +truffleruby: c8fb3e592bf354cd67893555c671955cc54c32ff +jruby: d834e4279090998ba3ef087d81278734cab4c50a +rbx: 7799d9fa48467cdbfceeed6765a63366d9dc8b0e Index: spec/mspec/lib/mspec/helpers/warning.rb =================================================================== --- spec/mspec/lib/mspec/helpers/warning.rb (nonexistent) +++ spec/mspec/lib/mspec/helpers/warning.rb (revision 58716) @@ -0,0 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/spec/mspec/lib/mspec/helpers/warning.rb#L1 +class Object + def suppress_warning + verbose = $VERBOSE + $VERBOSE = nil + yield + ensure + $VERBOSE = verbose + end +end Index: spec/mspec/lib/mspec/helpers.rb =================================================================== --- spec/mspec/lib/mspec/helpers.rb (revision 58715) +++ spec/mspec/lib/mspec/helpers.rb (revision 58716) @@ -10,3 +10,4 @@ require 'mspec/helpers/numeric' https://github.com/ruby/ruby/blob/trunk/spec/mspec/lib/mspec/helpers.rb#L10 require 'mspec/helpers/ruby_exe' require 'mspec/helpers/scratch' require 'mspec/helpers/tmp' +require 'mspec/helpers/warning' Index: spec/mspec/lib/mspec/runner/formatters/unit.rb =================================================================== --- spec/mspec/lib/mspec/runner/formatters/unit.rb (revision 58715) +++ spec/mspec/lib/mspec/runner/formatters/unit.rb (revision 58716) @@ -8,7 +8,7 @@ class UnitdiffFormatter < DottedFormatte https://github.com/ruby/ruby/blob/trunk/spec/mspec/lib/mspec/runner/formatters/unit.rb#L8 @exceptions.each do |exc| outcome = exc.failure? ? "FAILED" : "ERROR" print "\n#{count += 1})\n#{exc.description} #{outcome}\n" - print exc.message, ": \n" + print exc.message, ":\n" print exc.backtrace, "\n" end print "\n#{@tally.format}\n" Index: spec/mspec/spec/utils/script_spec.rb =================================================================== --- spec/mspec/spec/utils/script_spec.rb (revision 58715) +++ spec/mspec/spec/utils/script_spec.rb (revision 58716) @@ -356,9 +356,9 @@ describe MSpecScript, "#entries" do https://github.com/ruby/ruby/blob/trunk/spec/mspec/spec/utils/script_spec.rb#L356 end it "returns the pattern in an array if it is a file" do - File.should_receive(:expand_path).with("file").and_return("file/expanded") - File.should_receive(:file?).with("file/expanded").and_return(true) - @script.entries("file").should == ["file/expanded"] + File.should_receive(:expand_path).with("file").and_return("file/expanded.rb") + File.should_receive(:file?).with("file/expanded.rb").and_return(true) + @script.entries("file").should == ["file/expanded.rb"] end it "returns Dir['pattern/**/*_spec.rb'] if pattern is a directory" do @@ -381,9 +381,10 @@ describe MSpecScript, "#entries" do https://github.com/ruby/ruby/blob/trunk/spec/mspec/spec/utils/script_spec.rb#L381 end it "returns the pattern in an array if it is a file" do - File.should_receive(:expand_path).with(@name).and_return(@name) - File.should_receive(:file?).with(@name).and_return(true) - @script.entries("name").should == [@name] + name = "#{@name}.rb" + File.should_receive(:expand_path).with(name).and_return(name) + File.should_receive(:file?).with(name).and_return(true) + @script.entries("name.rb").should == [name] end it "returns Dir['pattern/**/*_spec.rb'] if pattern is a directory" do Index: spec/mspec/spec/helpers/suppress_warning_spec.rb =================================================================== --- spec/mspec/spec/helpers/suppress_warning_spec.rb (nonexistent) +++ spec/mspec/spec/helpers/suppress_warning_spec.rb (revision 58716) @@ -0,0 +1,19 @@ https://github.com/ruby/ruby/blob/trunk/spec/mspec/spec/helpers/suppress_warning_spec.rb#L1 +require 'spec_helper' +require 'mspec/guards' +require 'mspec/helpers' + +describe Object, "#suppress_warning" do + it "hides warnings" do + suppress_warning do + warn "should not be shown" + end + end + + it "yields the block" do + a = 0 + suppress_warning do + a = 1 + end + a.should == 1 + end +end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/