merger.rb: Drop SVN support

This commit is contained in:
Takashi Kokubun 2024-05-28 13:51:45 -07:00
parent 7873275326
commit 7a860bacee

View File

@ -2,9 +2,8 @@
# -*- ruby -*-
exec "${RUBY-ruby}" "-x" "$0" "$@" && [ ] if false
#!ruby
# This needs ruby 2.0, Subversion and Git.
# As a Ruby committer, run this in an SVN repository
# to commit a change.
# This needs ruby 2.0 and Git.
# As a Ruby committer, run this in a git repository to commit a change.
require 'tempfile'
require 'net/http'
@ -15,13 +14,7 @@ ENV['LC_ALL'] = 'C'
ORIGIN = 'git@git.ruby-lang.org:ruby.git'
GITHUB = 'git@github.com:ruby/ruby.git'
module Merger
REPOS = 'svn+ssh://svn@ci.ruby-lang.org/ruby/'
end
class << Merger
include Merger
class << Merger = Object.new
def help
puts <<-HELP
\e[1msimple backport\e[0m
@ -69,11 +62,7 @@ class << Merger
def version_up(teeny: false)
now = Time.now
now = now.localtime(9*60*60) # server is Japan Standard Time +09:00
if svn_mode?
system('svn', 'revert', 'version.h')
else
system('git', 'checkout', 'HEAD', 'version.h')
end
system('git', 'checkout', 'HEAD', 'version.h')
v, pl = version
if teeny
@ -129,31 +118,10 @@ class << Merger
end
tagname = "v#{v.join('_')}#{("_#{pl}" if v[0] < "2" || (v[0] == "2" && v[1] < "1") || /^(?:preview|rc)/ =~ pl)}"
if svn_mode?
if relname
branch_url = `svn info`[/URL: (.*)/, 1]
else
branch_url = "#{REPOS}branches/ruby_"
if v[0] < '2' || (v[0] == '2' && v[1] < '1')
abort 'patchlevel must be greater than 0 for patch release' if pl == '0'
branch_url << v.join('_')
else
abort 'teeny must be greater than 0 for patch release' if v[2] == '0'
branch_url << v.join('_').sub(/_\d+\z/, '')
end
end
tag_url = "#{REPOS}tags/#{tagname}"
system('svn', 'info', tag_url, out: IO::NULL, err: IO::NULL)
if $?.success?
abort 'specfied tag already exists. check tag name and remove it if you want to force re-tagging'
end
execute('svn', 'cp', '-m', "add tag #{tagname}", branch_url, tag_url, interactive: true)
else
unless execute('git', 'tag', tagname)
abort 'specfied tag already exists. check tag name and remove it if you want to force re-tagging'
end
execute('git', 'push', ORIGIN, tagname, interactive: true)
unless execute('git', 'tag', tagname)
abort 'specfied tag already exists. check tag name and remove it if you want to force re-tagging'
end
execute('git', 'push', ORIGIN, tagname, interactive: true)
end
def remove_tag(relname)
@ -173,64 +141,33 @@ class << Merger
tagname = relname
end
if svn_mode?
tag_url = "#{REPOS}tags/#{tagname}"
execute('svn', 'rm', '-m', "remove tag #{tagname}", tag_url, interactive: true)
else
execute('git', 'tag', '-d', tagname)
execute('git', 'push', ORIGIN, ":#{tagname}", interactive: true)
execute('git', 'push', GITHUB, ":#{tagname}", interactive: true)
end
execute('git', 'tag', '-d', tagname)
execute('git', 'push', ORIGIN, ":#{tagname}", interactive: true)
execute('git', 'push', GITHUB, ":#{tagname}", interactive: true)
end
def update_revision_h
if svn_mode?
execute('svn', 'up')
end
execute('ruby tool/file2lastrev.rb --revision.h . > revision.tmp')
execute('tool/ifchange', '--timestamp=.revision.time', 'revision.h', 'revision.tmp')
execute('rm', '-f', 'revision.tmp')
end
def stat
if svn_mode?
`svn stat`
else
`git status --short`
end
`git status --short`
end
def diff(file = nil)
if svn_mode?
command = %w[svn diff --diff-cmd=diff -x -upw]
else
command = %w[git diff --color HEAD]
end
command = %w[git diff --color HEAD]
IO.popen(command + [file].compact, &:read)
end
def commit(file)
if svn_mode?
begin
execute('svn', 'ci', '-F', file)
execute('svn', 'update') # svn ci doesn't update revision info on working copy
ensure
execute('rm', '-f', 'subversion.commitlog')
end
else
current_branch = IO.popen(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], &:read).strip
execute('git', 'add', '.') &&
execute('git', 'commit', '-F', file)
end
current_branch = IO.popen(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], &:read).strip
execute('git', 'add', '.') && execute('git', 'commit', '-F', file)
end
private
def svn_mode?
return @svn_mode if defined?(@svn_mode)
@svn_mode = system("svn info", %i(out err) => IO::NULL)
end
# Prints the version of Ruby found in version.h
def version
v = p = nil
@ -303,8 +240,6 @@ else
revs.each do |rev|
git_rev = nil
case rev
when /\A\d{1,6}\z/
svn_rev = rev
when /\A\h{7,40}\z/
git_rev = rev
when nil then
@ -315,30 +250,20 @@ else
exit
end
# Merge revision from Git patch or SVN
if git_rev
git_uri = "https://git.ruby-lang.org/ruby.git/patch/?id=#{git_rev}"
resp = Net::HTTP.get_response(URI(git_uri))
if resp.code != '200'
abort "'#{git_uri}' returned status '#{resp.code}':\n#{resp.body}"
end
patch = resp.body.sub(/^diff --git a\/version\.h b\/version\.h\nindex .*\n--- a\/version\.h\n\+\+\+ b\/version\.h\n@@ .* @@\n(?:[-\+ ].*\n|\n)+/, '')
message = "#{(patch[/^Subject: (.*)\n---\n /m, 1] || "Message not found for revision: #{git_rev}\n")}"
message.gsub!(/\G(.*)\n( .*)/, "\\1\\2")
message = "\n\n#{message}"
puts '+ git apply'
IO.popen(['git', 'apply', '--3way'], 'wb') { |f| f.write(patch) }
else
default_merge_branch = (%r{^URL: .*/branches/ruby_1_8_} =~ `svn info` ? 'branches/ruby_1_8' : 'trunk')
svn_src = "#{Merger::REPOS}#{ARGV[1] || default_merge_branch}"
message = IO.popen(['svn', 'log', '-c', svn_rev, svn_src], &:read)
cmd = ['svn', 'merge', '--accept=postpone', '-c', svn_rev, svn_src]
puts "+ #{cmd.join(' ')}"
system(*cmd)
# Merge revision from Git patch
git_uri = "https://git.ruby-lang.org/ruby.git/patch/?id=#{git_rev}"
resp = Net::HTTP.get_response(URI(git_uri))
if resp.code != '200'
abort "'#{git_uri}' returned status '#{resp.code}':\n#{resp.body}"
end
patch = resp.body.sub(/^diff --git a\/version\.h b\/version\.h\nindex .*\n--- a\/version\.h\n\+\+\+ b\/version\.h\n@@ .* @@\n(?:[-\+ ].*\n|\n)+/, '')
message = "#{(patch[/^Subject: (.*)\n---\n /m, 1] || "Message not found for revision: #{git_rev}\n")}"
message.gsub!(/\G(.*)\n( .*)/, "\\1\\2")
message = "\n\n#{message}"
puts '+ git apply'
IO.popen(['git', 'apply', '--3way'], 'wb') { |f| f.write(patch) }
commit_message << message.sub(/\A-+\nr.*/, '').sub(/\n-+\n\z/, '').gsub(/^./, "\t\\&")
end