diff options
Diffstat (limited to 'Rakefile')
-rw-r--r-- | Rakefile | 407 |
1 files changed, 188 insertions, 219 deletions
@@ -1,26 +1,16 @@ -# -*- encoding: utf-8 -*- # frozen_string_literal: true $:.unshift File.expand_path("../lib", __FILE__) -require "shellwords" require "benchmark" -NULL_DEVICE = (Gem.win_platform? ? "NUL" : "/dev/null") -RUBYGEMS_REPO = if `git -C "#{File.expand_path("..")}" remote --verbose 2> #{NULL_DEVICE}` =~ /rubygems/i +RUBYGEMS_REPO = if `git -C "#{File.expand_path("..")}" remote --verbose 2> #{IO::NULL}` =~ /rubygems/i File.expand_path("..") else File.expand_path("tmp/rubygems") end -def bundler_spec - @bundler_spec ||= Gem::Specification.load("bundler.gemspec") -end - -def safe_task(&block) - yield - true -rescue - false +def development_dependencies + @development_dependencies ||= Gem::Specification.load("bundler.gemspec").development_dependencies end # Benchmark task execution @@ -37,29 +27,32 @@ module Rake end end +desc "Run specs" +task :spec do + sh("bin/rspec") +end + namespace :spec do + def safe_task(&block) + yield + true + rescue StandardError + false + end + desc "Ensure spec dependencies are installed" task :deps do - deps = Hash[bundler_spec.development_dependencies.map do |d| + deps = Hash[development_dependencies.map do |d| [d.name, d.requirement.to_s] end] - deps["rubocop"] ||= "= 0.50.0" if RUBY_VERSION >= "2.0.0" # can't go in the gemspec because of the ruby version requirement - # JRuby can't build ronn or rdiscount, so we skip that - if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" - deps.delete("ronn") - deps.delete("rdiscount") - end + # JRuby can't build ronn, so we skip that + deps.delete("ronn") if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" gem_install_command = "install --no-document --conservative " + deps.sort_by {|name, _| name }.map do |name, version| "'#{name}:#{version}'" end.join(" ") sh %(#{Gem.ruby} -S gem #{gem_install_command}) - - # Download and install gems used inside tests - $LOAD_PATH.unshift("./spec") - require "support/rubygems_ext" - Spec::Rubygems.setup end namespace :travis do @@ -68,250 +61,236 @@ namespace :spec do system "sudo sed -i 's/1000::/1000:Travis:/g' /etc/passwd" # Strip secure_path so that RVM paths transmit through sudo -E system "sudo sed -i '/secure_path/d' /etc/sudoers" + # Refresh packages index that the ones we need can be installed + sh "sudo apt-get update" # Install groff so ronn can generate man/help pages sh "sudo apt-get install groff-base -y" # Install graphviz so that the viz specs can run - sh "sudo apt-get install graphviz -y 2>&1 | tail -n 2" + sh "sudo apt-get install graphviz -y" # Install the gems with a consistent version of RubyGems - sh "gem update --system 2.6.13" - - $LOAD_PATH.unshift("./spec") - require "support/rubygems_ext" - Spec::Rubygems::DEPS["codeclimate-test-reporter"] = "~> 0.6.0" if RUBY_VERSION >= "2.2.0" + sh "gem update --system 3.0.3" # Install the other gem deps, etc Rake::Task["spec:deps"].invoke end end -end -begin - rspec = bundler_spec.development_dependencies.find {|d| d.name == "rspec" } - gem "rspec", rspec.requirement.to_s - require "rspec/core/rake_task" - - desc "Run specs" - RSpec::Core::RakeTask.new - task :spec => "man:build" - - if RUBY_VERSION >= "2.0.0" - # can't go in the gemspec because of the ruby version requirement - gem "rubocop", "= 0.50.0" - require "rubocop/rake_task" - rubocop = RuboCop::RakeTask.new - rubocop.options = ["--parallel"] + task :clean do + rm_rf "tmp" end - namespace :spec do - task :clean do - rm_rf "tmp" - end - - desc "Run the real-world spec suite" - task :realworld => %w[set_realworld spec] - - namespace :realworld do - desc "Re-record cassettes for the realworld specs" - task :record => %w[set_record realworld] - - task :set_record do - ENV["BUNDLER_SPEC_FORCE_RECORD"] = "TRUE" - end - end - - task :set_realworld do - ENV["BUNDLER_REALWORLD_TESTS"] = "1" - end - - desc "Run the spec suite with the sudo tests" - task :sudo => %w[set_sudo spec clean_sudo] + desc "Run the real-world spec suite" + task :realworld => %w[set_realworld spec] - task :set_sudo do - ENV["BUNDLER_SUDO_TESTS"] = "1" - end + namespace :realworld do + desc "Re-record cassettes for the realworld specs" + task :record => %w[set_record realworld] - task :clean_sudo do - puts "Cleaning up sudo test files..." - system "sudo rm -rf #{File.expand_path("../tmp/sudo_gem_home", __FILE__)}" + task :set_record do + ENV["BUNDLER_SPEC_FORCE_RECORD"] = "TRUE" end + end - # RubyGems specs by version - namespace :rubygems do - rubyopt = ENV["RUBYOPT"] - # When editing this list, also edit .travis.yml! - branches = %w[master] - releases = %w[v2.5.2 v2.6.14 v2.7.7 v3.0.1] - (branches + releases).each do |rg| - desc "Run specs with RubyGems #{rg}" - RSpec::Core::RakeTask.new(rg) do |t| - t.rspec_opts = %w[--format progress --color] - t.ruby_opts = %w[-w] - end + task :set_realworld do + ENV["BUNDLER_REALWORLD_TESTS"] = "1" + end - # Create tasks like spec:rubygems:v1.8.3:sudo to run the sudo specs - namespace rg do - task :sudo => ["set_sudo", rg, "clean_sudo"] - task :realworld => ["set_realworld", rg] - end + desc "Run the spec suite with the sudo tests" + task :sudo => %w[set_sudo spec clean_sudo] - task "clone_rubygems_#{rg}" do - unless File.directory?(RUBYGEMS_REPO) - system("git clone https://github.com/rubygems/rubygems.git tmp/rubygems") - end - hash = nil - - if RUBYGEMS_REPO.start_with?(Dir.pwd) - Dir.chdir(RUBYGEMS_REPO) do - system("git remote update") - if rg == "master" - system("git checkout origin/master") - else - system("git checkout #{rg}") || raise("Unknown RubyGems ref #{rg}") - end - hash = `git rev-parse HEAD`.chomp - end - elsif rg != "master" - raise "need to be running against master with bundler as a submodule" - end + task :set_sudo do + ENV["BUNDLER_SUDO_TESTS"] = "1" + end - puts "Checked out rubygems '#{rg}' at #{hash}" - ENV["RUBYOPT"] = "-I#{File.join(RUBYGEMS_REPO, "lib")} #{rubyopt}" - puts "RUBYOPT=#{ENV["RUBYOPT"]}" - end + task :clean_sudo do + puts "Cleaning up sudo test files..." + system "sudo rm -rf #{File.expand_path("../tmp/sudo_gem_home", __FILE__)}" + end - task rg => ["man:build", "clone_rubygems_#{rg}"] - task "rubygems:all" => rg + # RubyGems specs by version + namespace :rubygems do + # When editing this list, also edit .travis.yml! + branches = %w[master] + releases = %w[v2.5.2 v2.6.14 v2.7.9 v3.0.3] + (branches + releases).each do |rg| + desc "Run specs with RubyGems #{rg}" + task rg do + sh("bin/rspec --format progress") end - desc "Run specs under a RubyGems checkout (set RG=path)" - RSpec::Core::RakeTask.new("co") do |t| - t.rspec_opts = %w[--format documentation --color] - t.ruby_opts = %w[-w] + # Create tasks like spec:rubygems:v1.8.3:sudo to run the sudo specs + namespace rg do + task :sudo => ["set_sudo", rg, "clean_sudo"] + task :realworld => ["set_realworld", rg] end - task "setup_co" do - rg = File.expand_path ENV["RG"] - puts "Running specs against RubyGems in #{rg}..." - ENV["RUBYOPT"] = "-I#{rg} #{rubyopt}" + task "set_#{rg}" do + ENV["RGV"] = rg end - task "co" => "setup_co" - task "rubygems:all" => "co" + task rg => ["set_#{rg}"] + task "rubygems:all" => rg end - desc "Run the tests on Travis CI against a RubyGem version (using ENV['RGV'])" - task :travis do - rg = ENV["RGV"] || raise("RubyGems version is required on Travis!") + desc "Run specs under a RubyGems checkout (set RGV=path)" + task "co" do + sh("bin/rspec --format progress") + end - # disallow making network requests on CI - ENV["BUNDLER_SPEC_PRE_RECORDED"] = "TRUE" + namespace "co" do + task :sudo => ["set_sudo", "co", "clean_sudo"] + task :realworld => ["set_realworld", "co"] + end - puts "\n\e[1;33m[Travis CI] Running bundler specs against RubyGems #{rg}\e[m\n\n" - specs = safe_task { Rake::Task["spec:rubygems:#{rg}"].invoke } + task "setup_co" do + ENV["RGV"] = RUBYGEMS_REPO + end - Rake::Task["spec:rubygems:#{rg}"].reenable + task "co" => "setup_co" + task "rubygems:all" => "co" + end - puts "\n\e[1;33m[Travis CI] Running bundler sudo specs against RubyGems #{rg}\e[m\n\n" - sudos = system("sudo -E rake spec:rubygems:#{rg}:sudo") - # clean up by chowning the newly root-owned tmp directory back to the travis user - system("sudo chown -R #{ENV["USER"]} #{File.join(File.dirname(__FILE__), "tmp")}") + desc "Run the tests on Travis CI against a RubyGem version (using ENV['RGV'])" + task :travis do + rg = ENV["RGV"] || raise("RubyGems version is required on Travis!") - Rake::Task["spec:rubygems:#{rg}"].reenable + rg = "co" if File.directory?(File.expand_path(ENV["RGV"])) - puts "\n\e[1;33m[Travis CI] Running bundler real world specs against RubyGems #{rg}\e[m\n\n" - realworld = safe_task { Rake::Task["spec:rubygems:#{rg}:realworld"].invoke } + # disallow making network requests on CI + ENV["BUNDLER_SPEC_PRE_RECORDED"] = "TRUE" - { "specs" => specs, "sudo" => sudos, "realworld" => realworld }.each do |name, passed| - if passed - puts "\e[0;32m[Travis CI] #{name} passed\e[m" - else - puts "\e[0;31m[Travis CI] #{name} failed\e[m" - end - end + puts "\n\e[1;33m[Travis CI] Running bundler specs against RubyGems #{rg}\e[m\n\n" + specs = safe_task { Rake::Task["spec:rubygems:#{rg}"].invoke } + + Rake::Task["spec:rubygems:#{rg}"].reenable + + puts "\n\e[1;33m[Travis CI] Running bundler sudo specs against RubyGems #{rg}\e[m\n\n" + sudos = system("sudo -E rake spec:rubygems:#{rg}:sudo") + # clean up by chowning the newly root-owned tmp directory back to the travis user + system("sudo chown -R #{ENV["USER"]} #{File.join(File.dirname(__FILE__), "tmp")}") + + Rake::Task["spec:rubygems:#{rg}"].reenable + + puts "\n\e[1;33m[Travis CI] Running bundler real world specs against RubyGems #{rg}\e[m\n\n" + realworld = safe_task { Rake::Task["spec:rubygems:#{rg}:realworld"].invoke } - unless specs && sudos && realworld - raise "Spec run failed, please review the log for more information" + { "specs" => specs, "sudo" => sudos, "realworld" => realworld }.each do |name, passed| + if passed + puts "\e[0;32m[Travis CI] #{name} passed\e[m" + else + puts "\e[0;31m[Travis CI] #{name} failed\e[m" end end - end -rescue LoadError - task :spec do - abort "Run `rake spec:deps` to be able to run the specs" - end - task :rubocop do - abort "Run `rake spec:deps` to be able to run rubocop" + unless specs && sudos && realworld + raise "Spec run failed, please review the log for more information" + end end end -begin - require "ronn" +desc "Run RuboCop" +task :rubocop do + sh("bin/rubocop --parallel") +end - namespace :man do - directory "man" +namespace :man do + if RUBY_ENGINE == "jruby" + task(:build) {} + else + ronn_dep = development_dependencies.find do |dep| + dep.name == "ronn" + end - index = [] - sources = Dir["man/*.ronn"].map {|f| File.basename(f, ".ronn") } - sources.map do |basename| - ronn = "man/#{basename}.ronn" - manual_section = ".1" unless basename =~ /\.(\d+)\Z/ - roff = "man/#{basename}#{manual_section}" + ronn_requirement = ronn_dep.requirement.to_s - index << [ronn, File.basename(roff)] + begin + gem "ronn", ronn_requirement - file roff => ["man", ronn] do - sh "#{Gem.ruby} -S ronn --roff --pipe #{ronn} > #{roff}" - end + require "ronn" + rescue LoadError + task(:build) { abort "We couln't activate ronn (#{ronn_requirement}). Try `gem install ronn:'#{ronn_requirement}'` to be able to build the help pages" } + else + directory "man" - file "#{roff}.txt" => roff do - sh "groff -Wall -mtty-char -mandoc -Tascii #{roff} | col -b > #{roff}.txt" - end + index = [] + sources = Dir["man/*.ronn"].map {|f| File.basename(f, ".ronn") } + sources.map do |basename| + ronn = "man/#{basename}.ronn" + manual_section = ".1" unless basename =~ /\.(\d+)\Z/ + roff = "man/#{basename}#{manual_section}" - task :build_all_pages => "#{roff}.txt" - end + index << [ronn, File.basename(roff)] - file "index.txt" do - index.map! do |(ronn, roff)| - [File.read(ronn).split(" ").first, roff] + file roff => ["man", ronn] do + sh "#{Gem.ruby} -S ronn --roff --pipe #{ronn} > #{roff}" + end + + file "#{roff}.txt" => roff do + sh "groff -Wall -mtty-char -mandoc -Tascii #{roff} | col -b > #{roff}.txt" + end + + task :build_all_pages => "#{roff}.txt" end - index = index.sort_by(&:first) - justification = index.map {|(n, _f)| n.length }.max + 4 - File.open("man/index.txt", "w") do |f| - index.each do |name, filename| - f << name.ljust(justification) << filename << "\n" + + file "index.txt" do + index.map! do |(ronn, roff)| + [File.read(ronn).split(" ").first, roff] + end + index = index.sort_by(&:first) + justification = index.map {|(n, _f)| n.length }.max + 4 + File.open("man/index.txt", "w") do |f| + index.each do |name, filename| + f << name.ljust(justification) << filename << "\n" + end end end - end - task :build_all_pages => "index.txt" + task :build_all_pages => "index.txt" - task :clean do - leftovers = Dir["man/*"].reject do |f| - File.extname(f) == ".ronn" + task :clean do + leftovers = Dir["man/*"].reject do |f| + File.extname(f) == ".ronn" + end + rm leftovers if leftovers.any? end - rm leftovers if leftovers.any? - end - desc "Build the man pages" - task :build => ["man:clean", "man:build_all_pages"] + desc "Build the man pages" + task :build => ["man:clean", "man:build_all_pages"] - desc "Remove all built man pages" - task :clobber do - rm_rf "lib/bundler/man" + desc "Remove all built man pages" + task :clobber do + rm_rf "lib/bundler/man" + end end - - task(:require) {} - end -rescue LoadError - namespace :man do - task(:require) { abort "Install the ronn gem to be able to release!" } - task(:build) { warn "Install the ronn gem to build the help pages" } end end +automatiek_dep = development_dependencies.find do |dep| + dep.name == "automatiek" +end + +automatiek_requirement = automatiek_dep.requirement.to_s + begin + gem "automatiek", automatiek_requirement + require "automatiek" +rescue LoadError + namespace :vendor do + desc "Vendor a specific version of molinillo" + task(:molinillo) { abort "We couldn't activate automatiek (#{automatiek_requirement}). Try `gem install automatiek:'#{automatiek_requirement}'` to be able to vendor gems" } + desc "Vendor a specific version of fileutils" + task(:fileutils) { abort "We couldn't activate automatiek (#{automatiek_requirement}). Try `gem install automatiek:'#{automatiek_requirement}'` to be able to vendor gems" } + + desc "Vendor a specific version of thor" + task(:thor) { abort "We couldn't activate automatiek (#{automatiek_requirement}). Try `gem install automatiek:'#{automatiek_requirement}'` to be able to vendor gems" } + + desc "Vendor a specific version of net-http-persistent" + task(:"net-http-persistent") { abort "We couldn't activate automatiek (#{automatiek_requirement}). Try `gem install automatiek:'#{automatiek_requirement}'` to be able to vendor gems" } + end +else + desc "Vendor a specific version of molinillo" Automatiek::RakeTask.new("molinillo") do |lib| lib.download = { :github => "https://github.com/CocoaPods/Molinillo" } lib.namespace = "Molinillo" @@ -319,6 +298,7 @@ begin lib.vendor_lib = "lib/bundler/vendor/molinillo" end + desc "Vendor a specific version of thor" Automatiek::RakeTask.new("thor") do |lib| lib.download = { :github => "https://github.com/erikhuda/thor" } lib.namespace = "Thor" @@ -326,6 +306,7 @@ begin lib.vendor_lib = "lib/bundler/vendor/thor" end + desc "Vendor a specific version of fileutils" Automatiek::RakeTask.new("fileutils") do |lib| lib.download = { :github => "https://github.com/ruby/fileutils" } lib.namespace = "FileUtils" @@ -333,6 +314,7 @@ begin lib.vendor_lib = "lib/bundler/vendor/fileutils" end + desc "Vendor a specific version of net-http-persistent" Automatiek::RakeTask.new("net-http-persistent") do |lib| lib.download = { :github => "https://github.com/drbrain/net-http-persistent" } lib.namespace = "Net::HTTP::Persistent" @@ -349,13 +331,6 @@ begin end lib.send(:extend, mixin) end -rescue LoadError - namespace :vendor do - task(:fileutils) { abort "Install the automatiek gem to be able to vendor gems." } - task(:molinillo) { abort "Install the automatiek gem to be able to vendor gems." } - task(:thor) { abort "Install the automatiek gem to be able to vendor gems." } - task("net-http-persistent") { abort "Install the automatiek gem to be able to vendor gems." } - end end task :override_version do @@ -368,14 +343,8 @@ task :override_version do File.open(version_file, "w") {|f| f << contents } end -desc "Update vendored SSL certs to match the certs vendored by RubyGems" -task :update_certs => "spec:rubygems:clone_rubygems_master" do - require "bundler/ssl_certs/certificate_manager" - Bundler::SSLCerts::CertificateManager.update_from!(RUBYGEMS_REPO) -end - task :default => :spec -Dir["task/*.{rb,rake}"].each(&method(:load)) +Dir["task/*.rake"].each(&method(:load)) task :generate_files => Rake::Task.tasks.select {|t| t.name.start_with?("lib/bundler/generated") } |