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
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