Rearrange npm release process again
Make prep_release idempotent, including the npm bump.
This commit is contained in:
parent
d7c8d34cc4
commit
71df60e921
|
@ -8,6 +8,18 @@ gem_version = Gem::Version.new(version)
|
|||
|
||||
directory "pkg"
|
||||
|
||||
# This "npm-ifies" the current version number
|
||||
# With npm, versions such as "5.0.0.rc1" or "5.0.0.beta1.1" are not compliant with its
|
||||
# versioning system, so they must be transformed to "5.0.0-rc1" and "5.0.0-beta1-1" respectively.
|
||||
|
||||
# "5.0.1" --> "5.0.1"
|
||||
# "5.0.1.1" --> "5.0.1-1" *
|
||||
# "5.0.0.rc1" --> "5.0.0-rc1"
|
||||
#
|
||||
# * This makes it a prerelease. That's bad, but we haven't come up with
|
||||
# a better solution at the moment.
|
||||
npm_version = version.gsub(/\./).with_index { |s, i| i >= 2 ? "-" : s }
|
||||
|
||||
(FRAMEWORKS + ["rails"]).each do |framework|
|
||||
namespace framework do
|
||||
gem = "pkg/#{framework}-#{version}.gem"
|
||||
|
@ -45,6 +57,17 @@ directory "pkg"
|
|||
raise "Could not insert PRE in #{file}" unless $1
|
||||
|
||||
File.open(file, "w") { |f| f.write ruby }
|
||||
|
||||
require "json"
|
||||
if File.exist?("#{framework}/package.json") && JSON.parse(File.read("#{framework}/package.json"))["version"] != npm_version
|
||||
Dir.chdir("#{framework}") do
|
||||
if sh "which npm"
|
||||
sh "npm version #{npm_version} --no-git-tag-version"
|
||||
else
|
||||
raise "You must have npm installed to release Rails."
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
task gem => %w(update_versions pkg) do
|
||||
|
@ -63,38 +86,10 @@ directory "pkg"
|
|||
task push: :build do
|
||||
sh "gem push #{gem}"
|
||||
|
||||
# When running the release task we usually run build first to check that the gem works properly.
|
||||
# NPM will refuse to publish or rebuild the gem if the version is changed when the Rails gem
|
||||
# versions are changed. This then causes the gem push to fail. Because of this we need to update
|
||||
# the version and publish at the same time.
|
||||
if File.exist?("#{framework}/package.json")
|
||||
Dir.chdir("#{framework}") do
|
||||
# This "npm-ifies" the current version
|
||||
# With npm, versions such as "5.0.0.rc1" or "5.0.0.beta1.1" are not compliant with its
|
||||
# versioning system, so they must be transformed to "5.0.0-rc1" and "5.0.0-beta1-1" respectively.
|
||||
|
||||
# In essence, the code below runs through all "."s that appear in the version,
|
||||
# and checks to see if their index in the version string is greater than or equal to 2,
|
||||
# and if so, it will change the "." to a "-".
|
||||
|
||||
# Sample version transformations:
|
||||
# irb(main):001:0> version = "5.0.1.1"
|
||||
# => "5.0.1.1"
|
||||
# irb(main):002:0> version.gsub(/\./).with_index { |s, i| i >= 2 ? '-' : s }
|
||||
# => "5.0.1-1"
|
||||
# irb(main):003:0> version = "5.0.0.rc1"
|
||||
# => "5.0.0.rc1"
|
||||
# irb(main):004:0> version.gsub(/\./).with_index { |s, i| i >= 2 ? '-' : s }
|
||||
# => "5.0.0-rc1"
|
||||
npm_version = version.gsub(/\./).with_index { |s, i| i >= 2 ? "-" : s }
|
||||
|
||||
# Check if npm is installed, and raise an error if not
|
||||
if sh "which npm"
|
||||
sh "npm version #{npm_version} --no-git-tag-version"
|
||||
sh "npm publish"
|
||||
else
|
||||
raise "You must have npm installed to release Rails."
|
||||
end
|
||||
npm_tag = version =~ /[a-z]/ ? "pre" : "latest"
|
||||
sh "npm publish --tag #{npm_tag}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -106,9 +101,11 @@ namespace :changelog do
|
|||
(FRAMEWORKS + ["guides"]).each do |fw|
|
||||
require "date"
|
||||
fname = File.join fw, "CHANGELOG.md"
|
||||
current_contents = File.read(fname)
|
||||
|
||||
header = "## Rails #{version} (#{Date.today.strftime('%B %d, %Y')}) ##\n\n* No changes.\n\n\n"
|
||||
contents = header + File.read(fname)
|
||||
header = "## Rails #{version} (#{Date.today.strftime('%B %d, %Y')}) ##\n\n"
|
||||
header << "* No changes.\n\n\n" if current_contents =~ /\A##/
|
||||
contents = header + current_contents
|
||||
File.open(fname, "wb") { |f| f.write contents }
|
||||
end
|
||||
end
|
||||
|
@ -145,7 +142,7 @@ namespace :all do
|
|||
task push: FRAMEWORKS.map { |f| "#{f}:push" } + ["rails:push"]
|
||||
|
||||
task :ensure_clean_state do
|
||||
unless `git status -s | grep -v 'RAILS_VERSION\\|CHANGELOG\\|Gemfile.lock'`.strip.empty?
|
||||
unless `git status -s | grep -v 'RAILS_VERSION\\|CHANGELOG\\|Gemfile.lock\\|package.json\\|version.rb'`.strip.empty?
|
||||
abort "[ABORTING] `git status` reports a dirty tree. Make sure all changes are committed"
|
||||
end
|
||||
|
||||
|
@ -160,14 +157,16 @@ namespace :all do
|
|||
end
|
||||
|
||||
task :commit do
|
||||
File.open("pkg/commit_message.txt", "w") do |f|
|
||||
f.puts "# Preparing for #{version} release\n"
|
||||
f.puts
|
||||
f.puts "# UNCOMMENT THE LINE ABOVE TO APPROVE THIS COMMIT"
|
||||
end
|
||||
unless `git status -s`.strip.empty?
|
||||
File.open("pkg/commit_message.txt", "w") do |f|
|
||||
f.puts "# Preparing for #{version} release\n"
|
||||
f.puts
|
||||
f.puts "# UNCOMMENT THE LINE ABOVE TO APPROVE THIS COMMIT"
|
||||
end
|
||||
|
||||
sh "git add . && git commit --verbose --template=pkg/commit_message.txt"
|
||||
rm_f "pkg/commit_message.txt"
|
||||
sh "git add . && git commit --verbose --template=pkg/commit_message.txt"
|
||||
rm_f "pkg/commit_message.txt"
|
||||
end
|
||||
end
|
||||
|
||||
task :tag do
|
||||
|
@ -175,9 +174,9 @@ namespace :all do
|
|||
sh "git push --tags"
|
||||
end
|
||||
|
||||
task prep_release: %w(ensure_clean_state build)
|
||||
task prep_release: %w(ensure_clean_state build bundle commit)
|
||||
|
||||
task release: %w(ensure_clean_state build bundle commit tag push)
|
||||
task release: %w(prep_release tag push)
|
||||
end
|
||||
|
||||
task :announce do
|
||||
|
|
Loading…
Reference in New Issue