summaryrefslogtreecommitdiff
path: root/Rakefile
diff options
context:
space:
mode:
Diffstat (limited to 'Rakefile')
-rw-r--r--Rakefile407
1 files changed, 188 insertions, 219 deletions
diff --git a/Rakefile b/Rakefile
index 746d110f86..fbbd3365b6 100644
--- a/Rakefile
+++ b/Rakefile
@@ -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") }