From 141131c1ab8b78b2006801f0e3b7524e967002d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Fazekas?= Date: Tue, 24 Dec 2024 17:35:11 +0100 Subject: [PATCH] Implement version bump --- Rakefile | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/Rakefile b/Rakefile index db1a5d2..4f4d13d 100644 --- a/Rakefile +++ b/Rakefile @@ -79,3 +79,90 @@ RDoc::Task.new do |rdoc| rdoc.rdoc_files.include(file) if File.exist?(file) } end + +def change_version(&block) + version_file = 'lib/net/scp/version.rb' + require_relative version_file + pre = Net::SCP::Version::PRE + tiny = Net::SCP::Version::TINY + result = block[pre: pre, tiny: Net::SCP::Version::TINY] + raise ArgumentError, "Version change logic should always return a pre" unless result.key?(:pre) + + new_pre = result[:pre] + new_tiny = result[:tiny] || tiny + found = { pre: false, tiny: false } + File.open("#{version_file}.new", "w") do |f| + File.readlines(version_file).each do |line| + match = + if pre.nil? + /^(\s+PRE\s+=\s+)nil(\s*)$/.match(line) + else + /^(\s+PRE\s+=\s+")#{pre}("\s*)$/.match(line) + end + if match + prefix = match[1] + postfix = match[2] + prefix.delete_suffix!('"') + postfix.delete_prefix!('"') + new_line = "#{prefix}#{new_pre.inspect}#{postfix}" + puts "Changing:\n - #{line} + #{new_line}" + line = new_line + found[:pre] = true + end + + if new_tiny != tiny + match = /^(\s+TINY\s+=\s+)#{tiny}(\s*)$/.match(line) + if match + prefix = match[1] + postfix = match[2] + new_line = "#{prefix}#{new_tiny}#{postfix}" + puts "Changing:\n - #{line} + #{new_line}" + line = new_line + found[:tiny] = true + end + end + + f.write(line) + end + raise ArgumentError, "Cound not find line: PRE = \"#{pre}\" in #{version_file}" unless found[:pre] + raise ArgumentError, "Cound not find line: TINY = \"#{tiny}\" in #{version_file}" unless found[:tiny] || new_tiny == tiny + end + + FileUtils.mv version_file, "#{version_file}.old" + FileUtils.mv "#{version_file}.new", version_file +end + +namespace :vbump do + desc "Final release" + task :final do + change_version do |pre:, tiny:| + _ = tiny + if pre.nil? + { tiny: tiny + 1, pre: nil } + else + raise ArgumentError, "Unexpected pre: #{pre}" if pre.nil? + + { pre: nil } + end + end + end + + desc "Increment prerelease" + task :pre, [:type] do |_t, args| + change_version do |pre:, tiny:| + puts " PRE => #{pre.inspect}" + match = /^([a-z]+)(\d+)/.match(pre) + raise ArgumentError, "Unexpected pre: #{pre}" if match.nil? && args[:type].nil? + + if match.nil? || (!args[:type].nil? && args[:type] != match[1]) + if pre.nil? + { pre: "#{args[:type]}1", tiny: tiny + 1 } + else + { pre: "#{args[:type]}1" } + end + else + { pre: "#{match[1]}#{match[2].to_i + 1}" } + end + end + end +end