Class: Rock::CLI::Release

Inherits:
Thor
  • Object
show all
Defined in:
lib/rock/cli/release.rb

Overview

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

Defined Under Namespace

Classes: InvalidReleaseName

Constant Summary collapse

ROCK_RELEASE_INFO =

VCS information where the Rock release information is stored

Hash[
'github' => 'rock-core/buildconf',
'branch' => 'releases']
RELEASE_NOTES =
"RELEASE_NOTES.md"
RELEASE_VERSIONS =
"overrides.d/25-release.yml"

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config



29
30
31
# File 'lib/rock/cli/release.rb', line 29

def config
  @config
end

#importerObject (readonly)

Returns the value of attribute importer



31
32
33
# File 'lib/rock/cli/release.rb', line 31

def importer
  @importer
end

#packageObject (readonly)

Returns the value of attribute package



30
31
32
# File 'lib/rock/cli/release.rb', line 30

def package
  @package
end

Instance Method Details

#freeze(*names) ⇒ Object



195
196
197
198
199
200
201
202
203
204
205
206
207
208
# 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

#listObject



140
141
142
143
144
145
146
147
148
# 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

#notes(release_name) ⇒ Object



158
159
160
# File 'lib/rock/cli/release.rb', line 158

def notes(release_name)
    puts fetch_release_notes(release_name)
end

#switch(release_name) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# 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) ⇒ Object



211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# 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

#versions(release_name) ⇒ Object



152
153
154
# File 'lib/rock/cli/release.rb', line 152

def versions(release_name)
    puts fetch_version_file(release_name)
end