class Rock::CLI::Release
Management of releases from the point of view of the user
The Rock scheme here is to store all release info in the common buildconf repository. Each release has its own tag, and within the commit pointed-to by the tag the files overrides.d/80-release.* contain the necessary information:
overrides.d/80-release.md: release notes (in markdown format) overrides.d/80-release.package_sets.yml: version information for the package sets overrides.d/80-release.packages.yml: version information for the packages
Constants
- RELEASE_NOTES
- RELEASE_VERSIONS
- ROCK_RELEASE_INFO
VCS information where the Rock release information is stored
Attributes
config[R]
importer[R]
package[R]
Public Class Methods
new(*args)
click to toggle source
Calls superclass method
# File lib/rock/cli/release.rb, line 40 def initialize(*args) super @ws = Autoproj::Workspace.from_environment @ws.set_as_main_workspace @ws.load_config require 'autoproj/git_server_configuration' vcs = Autoproj::VCSDefinition.from_raw(ROCK_RELEASE_INFO) @package = Autoproj::Ops::Tools. create_autobuild_package(vcs, "main configuration", config_dir) @importer = package.importer importer.remote_name = 'rock-core' end
Public Instance Methods
config_dir()
click to toggle source
# File lib/rock/cli/release.rb, line 36 def config_dir @ws.config_dir end
ensure_autoproj_config_loaded()
click to toggle source
# File lib/rock/cli/release.rb, line 84 def ensure_autoproj_config_loaded if !@autoproj_config_loaded tool = Autoproj::CLI::InspectionTool.new(@ws) tool.initialize_and_load tool.finalize_setup @autoproj_config_loaded = true end end
ensure_overrides_dir_present()
click to toggle source
# File lib/rock/cli/release.rb, line 64 def ensure_overrides_dir_present FileUtils.mkdir_p @ws.overrides_dir end
fetch_release_notes(release_name)
click to toggle source
# File lib/rock/cli/release.rb, line 54 def fetch_release_notes(release_name) verify_release_name(release_name) importer.show(package, release_name, RELEASE_NOTES) end
fetch_version_file(release_name)
click to toggle source
# File lib/rock/cli/release.rb, line 59 def fetch_version_file(release_name) verify_release_name(release_name) importer.show(package, release_name, RELEASE_VERSIONS) end
freeze(*names)
click to toggle source
# File lib/rock/cli/release.rb, line 195 def freeze(*names) release_name = @ws.config.get('current_rock_release', false) if !release_name Autoproj.error "currently not on any release, use rock-release switch first" return end version_file = fetch_version_file(release_name) versions = YAML.load(version_file) pkgs = match_names_to_packages_in_versions(names, versions) ops = Autoproj::Ops::Snapshot.new(@ws.manifest) ops.save_versions(pkgs.values, File.join(config_dir, RELEASE_VERSIONS), replace: false) end
list()
click to toggle source
# File lib/rock/cli/release.rb, line 140 def list tags = importer.tags(package, only_local: options[:local]) releases = tags.find_all do |tag_name, _| begin verify_release_name(tag_name, only_local: true) rescue InvalidReleaseName end end puts releases.map(&:first).sort.join("\n") end
match_names_to_packages_in_versions(names, versions, ignore_missing: false)
click to toggle source
# File lib/rock/cli/release.rb, line 93 def match_names_to_packages_in_versions(names, versions, ignore_missing: false) unmatched_pkg_name_to_entry = Hash.new matched_pkg = Hash.new matched_pkg_set = Array.new names.each do |name| entries = versions.find_all do |vcs| key = vcs.keys.first if key =~ /^pkg_set:/ pkg_set_name = $' if (name === vcs['name']) || (name === key) matched_pkg_set << pkg_set_name end elsif name === key matched_pkg[key] = vcs true else unmatched_pkg_name_to_entry[key] = vcs false end end if entries.empty? && !ignore_missing Autoproj.error "cannot find a package or package set matching #{name} in release #{release}" return end end if !matched_pkg_set.empty? ensure_autoproj_config_loaded matched_pkg_set.each do |pkg_set_name| pkg_set = @ws.manifest.package_set(pkg_set_name) pkg_set.each_package do |pkg| if vcs = unmatched_pkg_name_to_entry[pkg.name] matched_pkg[vcs.keys.first] = vcs end end end end matched_pkg end
notes(release_name)
click to toggle source
# File lib/rock/cli/release.rb, line 158 def notes(release_name) puts fetch_release_notes(release_name) end
switch(release_name)
click to toggle source
# File lib/rock/cli/release.rb, line 163 def switch(release_name) if release_name == "master" FileUtils.rm_f File.join(config_dir, RELEASE_VERSIONS) @ws.config.set("ROCK_SELECTED_FLAVOR", "master") @ws.config.set('current_rock_release', false) @ws.save_config Autoproj.message "successfully setup flavor #{release_name}" elsif release_name == "stable" FileUtils.rm_f File.join(config_dir, RELEASE_VERSIONS) @ws.config.set("ROCK_SELECTED_FLAVOR", "stable") @ws.config.set('current_rock_release', false) @ws.save_config Autoproj.message "successfully setup flavor #{release_name}" else versions = fetch_version_file(release_name) ensure_overrides_dir_present File.open(File.join(config_dir, RELEASE_VERSIONS), 'w') do |io| io.write versions end @ws.config.set("ROCK_SELECTED_FLAVOR", "stable") @ws.config.set('current_rock_release', release_name) @ws.save_config Autoproj.message "successfully setup release #{release_name}" end Autoproj.message " autoproj status will tell you what has changed" Autoproj.message " aup --all will attempt to include the new release changes to your working copy" Autoproj.message " aup --all --reset will (safely) reset your working copy to the release's state" Autoproj.message " aup --all --force-reset will UNSAFELY reset your working copy to the release's state" end
unfreeze(*names)
click to toggle source
# File lib/rock/cli/release.rb, line 211 def unfreeze(*names) release_name = @ws.config.get('current_rock_release', false) if !release_name Autoproj.error "currently not on any release, use rock-release switch first" return end release_versions_path = File.join(config_dir, RELEASE_VERSIONS) if !File.file?(release_versions_path) Autoproj.error "#{release_versions_path} not present on disk, use autoproj switch to restore it first" return end versions = YAML.load(File.read(release_versions_path)) pkgs = match_names_to_packages_in_versions(names, versions, ignore_missing: true) versions.delete_if do |vcs| pkgs.has_key?(vcs.keys.first) end ops = Autoproj::Ops::Snapshot.new(@ws.manifest) ops.save_versions(versions, release_versions_path, replace: true) Autoproj.message "updated #{release_versions_path}" end
verify_release_name(release_name, options = Hash.new)
click to toggle source
# File lib/rock/cli/release.rb, line 68 def verify_release_name(release_name, options = Hash.new) Kernel.validate_options options, only_local: false importer.rev_parse(package, release_name) importer.show(package, release_name, RELEASE_NOTES) rescue Autobuild::PackageException if !options[:only_local] # Try harder, fetch the remote branch importer.tags(package) return verify_release_name(release_name, only_local: true) end raise InvalidReleaseName.new(package, 'import'), "#{release_name} does not look like a valid release name" end
versions(release_name)
click to toggle source
# File lib/rock/cli/release.rb, line 152 def versions(release_name) puts fetch_version_file(release_name) end