class Bosh::Workspace::Release
Constants
- REFSPEC
Attributes
git_url[R]
name[R]
repo_dir[R]
Public Class Methods
new(release, releases_dir, credentials_callback, options = {})
click to toggle source
# File lib/bosh/workspace/release.rb, line 6 def initialize(release, releases_dir, credentials_callback, options = {}) @name = release["name"] @ref = release["ref"] @path = release["path"] @spec_version = release["version"].to_s @git_url = release["git"] @repo_dir = File.join(releases_dir, @name) @url = release["url"] @credentials_callback = credentials_callback @offline = options[:offline] end
Public Instance Methods
manifest()
click to toggle source
# File lib/bosh/workspace/release.rb, line 29 def manifest release[:manifest] end
manifest_file()
click to toggle source
# File lib/bosh/workspace/release.rb, line 25 def manifest_file File.join(repo_dir, manifest) end
name_version()
click to toggle source
# File lib/bosh/workspace/release.rb, line 33 def name_version "#{name}/#{version}" end
ref()
click to toggle source
# File lib/bosh/workspace/release.rb, line 41 def ref return nil unless @ref return find_commit_sha(repo.ref(@ref)) if Rugged::Reference.valid_name?(@ref) && repo.ref(@ref) repo.lookup(@ref).oid end
release_dir()
click to toggle source
# File lib/bosh/workspace/release.rb, line 48 def release_dir @path ? File.join(@repo_dir, @path) : @repo_dir end
update_repo(options = {})
click to toggle source
# File lib/bosh/workspace/release.rb, line 18 def update_repo(options = {}) fetch_repo hash = ref || release[:commit] update_repo_with_ref(repo, hash) update_submodules end
url()
click to toggle source
# File lib/bosh/workspace/release.rb, line 52 def url @url && @url.gsub("^VERSION^", version) end
version()
click to toggle source
# File lib/bosh/workspace/release.rb, line 37 def version release[:version] end
Private Instance Methods
fetch_repo(_repo = repo)
click to toggle source
# File lib/bosh/workspace/release.rb, line 86 def fetch_repo(_repo = repo) return if offline? _repo.fetch('origin', REFSPEC, credentials: @credentials_callback) commit = _repo.references['refs/remotes/origin/HEAD'].resolve.target_id update_repo_with_ref(_repo, commit) end
final_releases()
click to toggle source
transforms releases/foo-1.yml, releases/bar-2.yml to:
- { version: “1”, manifest: releases/foo-1.yml }
# File lib/bosh/workspace/release.rb, line 137 def final_releases @final_releases ||= begin final_releases = [] releases_tree.walk_blobs(:preorder) do |_, entry| next if entry[:filemode] == 40960 # Skip symlinks next unless version = entry[:name][/#{@name}-(.+)\.yml/, 1] final_releases << { version: version, manifest: entry[:name] } end final_releases.sort! { |a, b| a[:version].to_i <=> b[:version].to_i } end end
find_commit_sha(obj)
click to toggle source
# File lib/bosh/workspace/release.rb, line 58 def find_commit_sha(obj) defined?(obj.target) ? find_commit_sha(obj.target) : obj.oid end
init_repo(dir = @repo_dir, url = @git_url)
click to toggle source
# File lib/bosh/workspace/release.rb, line 101 def init_repo(dir = @repo_dir, url = @git_url) offline_err(url) if offline? FileUtils.mkdir_p File.dirname(dir) Rugged::Repository.init_at(dir).tap do |repo| repo.remotes.create('origin', url) end end
latest?()
click to toggle source
# File lib/bosh/workspace/release.rb, line 203 def latest? @spec_version == "latest" end
latest_offline_warning()
click to toggle source
# File lib/bosh/workspace/release.rb, line 175 def latest_offline_warning warning "Using 'latest' local version since in offline mode" end
lookup_release_ref(release)
click to toggle source
# File lib/bosh/workspace/release.rb, line 166 def lookup_release_ref(release) b = repo_blame(File.join(releases_dir, release[:manifest])) release.merge(manifest: b[:orig_path], commit: b[:final_commit_id]) end
missing_release_err(version, name)
click to toggle source
# File lib/bosh/workspace/release.rb, line 171 def missing_release_err(version, name) err "Could not find version: #{version} for release: #{name}" end
new_style_repo()
click to toggle source
# File lib/bosh/workspace/release.rb, line 120 def new_style_repo base = @path ? File.join(@path, 'releases') : 'releases' dir = File.join(repo_dir, base, @name) File.directory?(dir) && !File.symlink?(dir) end
offline?()
click to toggle source
# File lib/bosh/workspace/release.rb, line 199 def offline? @offline end
offline_err(url)
click to toggle source
# File lib/bosh/workspace/release.rb, line 109 def offline_err(url) err "Cloning repo: '#{url}' not allowed in offline mode" end
open_repo(dir = @repo_dir)
click to toggle source
# File lib/bosh/workspace/release.rb, line 97 def open_repo(dir = @repo_dir) Rugged::Repository.new(dir) end
release()
click to toggle source
# File lib/bosh/workspace/release.rb, line 157 def release return @release if @release latest_offline_warning if latest? && offline? release = final_releases.last if latest? release ||= final_releases.find { |v| v[:version] == @spec_version } missing_release_err(@spec_version, @name) unless release @release = lookup_release_ref(release) end
releases_dir()
click to toggle source
# File lib/bosh/workspace/release.rb, line 126 def releases_dir dir = new_style_repo ? "releases/#{@name}" : "releases" @path ? File.join(@path, dir) : dir end
releases_tree()
click to toggle source
# File lib/bosh/workspace/release.rb, line 131 def releases_tree repo.lookup(repo.head.target.tree.path(releases_dir)[:oid]) end
repo()
click to toggle source
# File lib/bosh/workspace/release.rb, line 82 def repo repo_exists? ? open_repo : init_repo end
repo_blame(path)
click to toggle source
# File lib/bosh/workspace/release.rb, line 149 def repo_blame(path) Rugged::Blame.new(repo, path).reduce do |m, h| return h unless m return h if h[:final_signature][:time] > m[:final_signature][:time] return m end end
repo_exists?(dir = @repo_dir)
click to toggle source
# File lib/bosh/workspace/release.rb, line 93 def repo_exists?(dir = @repo_dir) File.exist?(File.join(dir, '.git')) end
repo_path(path)
click to toggle source
# File lib/bosh/workspace/release.rb, line 73 def repo_path(path) File.join(@repo_dir, path) end
required_submodules()
click to toggle source
# File lib/bosh/workspace/release.rb, line 69 def required_submodules symlink_templates.map { |t| submodule_for(t) }.compact end
submodule_for(file)
click to toggle source
# File lib/bosh/workspace/release.rb, line 188 def submodule_for(file) repo.submodules.find { |s| file.start_with? repo_path(s.path) } end
submodule_repo(path, url)
click to toggle source
# File lib/bosh/workspace/release.rb, line 77 def submodule_repo(path, url) dir = repo_path(path) repo_exists?(dir) ? open_repo(dir) : init_repo(dir, url) end
symlink_target(file)
click to toggle source
# File lib/bosh/workspace/release.rb, line 183 def symlink_target(file) return File.readlink(file) if File.readlink(file).start_with?("/") File.expand_path(File.join(File.dirname(file), File.readlink(file))) end
symlink_templates()
click to toggle source
# File lib/bosh/workspace/release.rb, line 192 def symlink_templates return [symlink_target(templates_dir)] if File.symlink?(templates_dir) return [] unless File.exist?(templates_dir) Find.find(templates_dir) .select { |f| File.symlink?(f) }.map { |f| symlink_target(f) } end
templates_dir()
click to toggle source
# File lib/bosh/workspace/release.rb, line 179 def templates_dir repo_path 'templates' end
update_repo_with_ref(repository, ref)
click to toggle source
# File lib/bosh/workspace/release.rb, line 113 def update_repo_with_ref(repository, ref) # require 'pry' # binding.pry repository.checkout_tree ref, strategy: :force repository.checkout ref, strategy: :force end
update_submodules()
click to toggle source
# File lib/bosh/workspace/release.rb, line 62 def update_submodules required_submodules.each do |submodule| fetch_repo(submodule_repo(submodule.path, submodule.url)) update_repo_with_ref(submodule.repository, submodule.head_oid) end end