260 lines
6.8 KiB
Ruby
260 lines
6.8 KiB
Ruby
=begin
|
|
--------------------------------------------------------------------------------
|
|
|
|
Methods and classes used by the scripts.
|
|
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
=end
|
|
|
|
#
|
|
# ------------------------------------------------------------------------------------
|
|
# This exception class says that we aren't happy with the state of things.
|
|
# ------------------------------------------------------------------------------------
|
|
#
|
|
|
|
class BadState < Exception
|
|
end
|
|
|
|
#
|
|
# ------------------------------------------------------------------------------------
|
|
# A class with methods for handling the settings.
|
|
# ------------------------------------------------------------------------------------
|
|
#
|
|
|
|
class Settings
|
|
#
|
|
# The settings themselves: getters, setters, and validators.
|
|
#
|
|
|
|
def self.base_directory
|
|
`git config --get --global vivo.release.basedirectory`.strip
|
|
end
|
|
|
|
def self.base_directory=(dir)
|
|
`git config --global vivo.release.basedirectory #{dir}`
|
|
end
|
|
|
|
def self.confirm_base_directory(path)
|
|
expanded = File.expand_path(path)
|
|
vivo_git = File.expand_path("VIVO/.git", expanded)
|
|
vitro_git = File.expand_path("Vitro/.git", expanded)
|
|
raise BadState.new("#{expanded} is not a directory") unless File.directory?(expanded)
|
|
raise BadState.new("#{expanded} doesn't contain a VIVO repository") unless File.directory?(vivo_git)
|
|
raise BadState.new("#{expanded} doesn't contain a Vitro repository") unless File.directory?(vitro_git)
|
|
expanded
|
|
end
|
|
|
|
|
|
def self.username
|
|
`git config --get --global user.name`.strip
|
|
end
|
|
|
|
def self.username=(name)
|
|
`git config --global user.name #{name}`
|
|
end
|
|
|
|
def self.confirm_username(name)
|
|
# any string will do.
|
|
name
|
|
end
|
|
|
|
|
|
def self.email
|
|
`git config --get --global user.email`.strip
|
|
end
|
|
|
|
def self.email=(address)
|
|
`git config --global user.email #{address}`
|
|
end
|
|
|
|
def self.confirm_email(address)
|
|
# any string will do.
|
|
address
|
|
end
|
|
|
|
|
|
def self.release_label
|
|
`git config --get --global vivo.releaselabel`.strip
|
|
end
|
|
|
|
def self.release_label=(label)
|
|
`git config --global vivo.releaselabel #{label}`
|
|
end
|
|
|
|
def self.confirm_release_label(label)
|
|
raise BadState.new("Incorrect format for release label - '#{label}'") unless label =~ /^\d\.\d(\.\d)?$/
|
|
label
|
|
end
|
|
|
|
|
|
def self.candidate_label
|
|
`git config --get --global vivo.candidatelabel`.strip
|
|
end
|
|
|
|
def self.candidate_label=(label)
|
|
`git config --global vivo.candidatelabel #{label}`
|
|
end
|
|
|
|
def self.confirm_candidate_label(label)
|
|
raise BadState.new("Incorrect format for candidate label - '#{label}'") unless label =~ /^(rc\d+|tc\d+|final)$/
|
|
label
|
|
end
|
|
|
|
#
|
|
# Values derived from the settings.
|
|
#
|
|
|
|
# The name of the maintenance branch. Looks like "maint-rel-4.2" even for releases like "4.2.1"
|
|
# Test candidates for major releases are built on the develop branch.
|
|
def self.branch_name
|
|
if is_test_candidate?()
|
|
"develop"
|
|
else
|
|
release_label = Settings.confirm_release_label(Settings.release_label)
|
|
major_release = release_label[0..2]
|
|
"maint-rel-#{major_release}"
|
|
end
|
|
end
|
|
|
|
# The name of the Git tag. Looks like "rel-1.9-tc2" or "rel-1.9" (for final)
|
|
def self.tag_name
|
|
release_label = Settings.confirm_release_label(Settings.release_label)
|
|
label = Settings.confirm_candidate_label(Settings.candidate_label)
|
|
suffix = label == "final" ? "" : "-#{label}"
|
|
"rel-#{release_label}#{suffix}"
|
|
end
|
|
|
|
# The message for the Git tag. Looks like "Release 1.9 rc5 tag"
|
|
def self.tag_message
|
|
release_label = Settings.confirm_release_label(Settings.release_label)
|
|
candidate_label = Settings.confirm_candidate_label(Settings.candidate_label)
|
|
"Release #{release_label} #{candidate_label} tag"
|
|
end
|
|
|
|
# Where is the local VIVO repository? Looks like "/Users/jeb228/git/VIVO"
|
|
def self.vivo_path
|
|
base_directory = Settings.confirm_base_directory(Settings.base_directory)
|
|
File.expand_path("VIVO", base_directory)
|
|
end
|
|
|
|
# Where is the local Vitro repository? Looks like "/Users/jeb228/git/Vitro"
|
|
def self.vitro_path
|
|
base_directory = Settings.confirm_base_directory(Settings.base_directory)
|
|
File.expand_path("Vitro", base_directory)
|
|
end
|
|
|
|
# Where will the distribution files be created? Looks like "/Users/jeb228/git/release_4.9/tc5/vivo-rel-4.9-tc5"
|
|
def self.export_dir
|
|
base_directory = Settings.confirm_base_directory(Settings.base_directory)
|
|
release_label = Settings.confirm_release_label(Settings.release_label)
|
|
candidate_label = Settings.confirm_candidate_label(Settings.candidate_label)
|
|
tag_name = Settings.tag_name
|
|
File.expand_path("release_#{release_label}/#{candidate_label}/vivo-#{tag_name}", base_directory)
|
|
end
|
|
|
|
# Where to store the file for revision info in VIVO
|
|
def self.vivo_revision_info_path
|
|
File.expand_path("revisionInfo", Settings.export_dir)
|
|
end
|
|
|
|
# Where to store the file for revision info in VIVO
|
|
def self.vitro_revision_info_path
|
|
File.expand_path("vitro-core/revisionInfo", Settings.export_dir)
|
|
end
|
|
|
|
# Looks like "vivo-rel-4.9-tc3" or "vivo-rel-4.9" for final
|
|
def self.vivo_distribution_filename
|
|
"vivo-#{Settings.tag_name}"
|
|
end
|
|
|
|
# Looks like "vitro-rel-4.9-tc3" or "vitro-rel-4.9" for final
|
|
def self.vitro_distribution_filename
|
|
"vitro-#{Settings.tag_name}"
|
|
end
|
|
end
|
|
|
|
#
|
|
# ------------------------------------------------------------------------------------
|
|
# Confirmation methods.
|
|
# ------------------------------------------------------------------------------------
|
|
#
|
|
|
|
def is_test_candidate?()
|
|
Settings.confirm_candidate_label(Settings.candidate_label)[0..0] == 't'
|
|
end
|
|
|
|
def is_final_release?()
|
|
Settings.confirm_candidate_label(Settings.candidate_label) == 'final'
|
|
end
|
|
|
|
#
|
|
# ------------------------------------------------------------------------------------
|
|
# General-purpose methods.
|
|
# ------------------------------------------------------------------------------------
|
|
#
|
|
|
|
def prompt(p)
|
|
print("#{p} ")
|
|
gets.strip
|
|
end
|
|
|
|
def echo_command(c)
|
|
puts ">>>>>> #{c}"
|
|
`#{c}`
|
|
end
|
|
|
|
def get_permission_and_go(p)
|
|
puts
|
|
yn = prompt("#{p} (y/n)")
|
|
if yn.downcase == 'y'
|
|
puts
|
|
yield
|
|
puts
|
|
else
|
|
puts
|
|
puts "OK - forget it."
|
|
puts
|
|
end
|
|
end
|
|
|
|
def approve_and_execute(cmds, prompt="")
|
|
if prompt.empty?
|
|
puts "Execute these commands?"
|
|
else
|
|
puts "Execute these commands? (#{prompt})"
|
|
end
|
|
|
|
puts ">>>>> #{cmds.join("\n>>>>> ")}"
|
|
yn = prompt "(y/n)"
|
|
raise BadState.new("OK") if (yn.downcase != 'y')
|
|
|
|
cmds.each do |cmd|
|
|
puts ">>>>> #{cmd}"
|
|
puts `#{cmd}`
|
|
raise BadState.new("Command failed: code #{$?.exitstatus}") unless $?.success?
|
|
end
|
|
puts
|
|
end
|
|
|
|
def branch_exists?(dir, branch)
|
|
Dir.chdir(dir) do |path|
|
|
re = Regexp.new("\\b#{branch}\\b")
|
|
`git branch`.index(re)
|
|
end
|
|
end
|
|
|
|
def remote_branch_exists?(dir, branch)
|
|
Dir.chdir(dir) do |path|
|
|
re = Regexp.new("remotes/origin/#{branch}\\b")
|
|
`git branch -a`.index(re)
|
|
end
|
|
end
|
|
|
|
def tag_exists?(dir, tag)
|
|
Dir.chdir(dir) do |path|
|
|
re = Regexp.new("^#{tag}$")
|
|
`git tag`.index(re)
|
|
end
|
|
end
|
|
|