1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
#!/usr/bin/env ruby
# frozen_string_literal: true
require 'fileutils'
require 'json'
require 'netrc'
require 'octokit'
require 'shellwords'
require 'uri'
def run(*args)
puts('<exec> ' + args.map { |s| Shellwords.escape(s) }.join(' '))
system(*args)
end
if ARGV.size != 1
warn "usage: #{$PROGRAM_NAME} [gem-name]"
exit 1
end
gem_name = ARGV[0]
version_constant =
{
'adsf' => 'Adsf::VERSION',
'adsf-live' => 'Adsf::Live::VERSION',
}.fetch(gem_name) do
warn "Error: Unknown gem name: #{gem_name}"
exit 1
end
gem_dir =
{
'adsf' => 'adsf',
'adsf-live' => 'adsf-live',
}.fetch(gem_name) do
warn "Error: Unknown gem name: #{gem_name}"
exit 1
end
gem_path =
{
'adsf' => 'adsf',
'adsf-live' => 'adsf/live',
}.fetch(gem_name) do
warn "Error: Unknown gem name: #{gem_name}"
exit 1
end
puts "version_constant = #{version_constant}"
puts "gem_dir = #{gem_dir}"
puts "gem_path = #{gem_path}"
puts
puts "=== Entering gem dir (#{gem_dir})…"
Dir.chdir(gem_dir)
puts Dir.getwd
puts
puts '=== Logging in to GitHub’s API…'
client = Octokit::Client.new(netrc: true)
puts
puts '=== Deleting old *.gem files…'
Dir['*.gem'].each do |fn|
puts "deleting #{fn}…"
FileUtils.rm_f(fn)
end
puts
unless %w[adsf-live].include?(gem_name)
puts '=== Verifying presence of release date…'
release_line = File.readlines('NEWS.md').drop(2).first
unless / \(\d{4}-\d{2}-\d{2}\)$/.match?(release_line)
warn 'Error: No proper release date found!'
exit 1
end
unless release_line.include?(Time.now.strftime('%Y-%m-%d'))
warn 'Error: The release date does not match today’s date!'
exit 1
end
puts
end
puts '=== Reading version…'
require "./lib/#{gem_path}/version"
version = eval(version_constant) # rubocop:disable Security/Eval
puts "Version = #{version}"
puts
puts '=== Building gems…'
run('bundle', 'exec', 'rake', 'gem')
puts
puts '=== Verifying that gems were built properly…'
gem_filename = "#{gem_name}-#{version}.gem"
unless File.file?(gem_filename)
warn "Error: Could not find gem: #{gem_filename}"
exit 1
end
puts
puts '=== Verifying that gem version does not yet exist…'
url = URI.parse("https://rubygems.org/api/v1/versions/#{gem_name}.json")
response = Net::HTTP.get_response(url)
existing_versions =
case response.code
when '404'
[]
when '200'
JSON.parse(response.body).map { |e| e.fetch('number') }
else
warn "Error: Couldn’t fetch version information for #{gem_name} (status #{response.code})"
exit 1
end
if existing_versions.include?(version)
warn "Error: #{gem_name} v#{version} already exists"
exit 1
end
puts
unless %w[adsf-live].include?(gem_name)
puts '=== Verifying that release does not yet exist…'
releases = client.releases('ddfreyne/adsf')
release = releases.find { |r| r.tag_name == version }
if release
warn 'Error: GitHub release already exists!'
exit 1
end
puts
end
puts '=== Reading release notes…'
release_notes =
File.readlines('NEWS.md')
.drop(4)
.take_while { |l| l !~ /^## / }
.join
puts
puts '=== Creating Git tag…'
annotation =
if gem_name == 'adsf'
version
else
"#{gem_name}-v#{version}"
end
run('git', 'tag', '--sign', '--annotate', annotation, '--message', "#{gem_name} v#{version}")
puts
puts '=== Pushing Git data…'
run('git', 'push', 'origin', '--tags')
puts
puts '=== Pushing gem…'
run('gem', 'push', gem_filename)
puts
if gem_name == 'adsf'
puts '=== Creating release on GitHub…'
sleep 3 # Give GitHub some time to detect the new tag
is_prerelease = version =~ /a|b|rc/ || version =~ /^0/
client.create_release(
'ddfreyne/adsf', version,
prerelease: !is_prerelease.nil?,
body: release_notes
)
puts
end
puts 'DONE!'
|