class Berkshelf::GitLocation
Attributes
Public Class Methods
Source
# File lib/berkshelf/locations/git.rb, line 12 def initialize(dependency, options = {}) super @uri = options[:git] @branch = options[:branch] @tag = options[:tag] @ref = options[:ref] @revision = options[:revision] @rel = options[:rel] # The revision to parse @rev_parse = options[:ref] || options[:branch] || options[:tag] || "master" end
Calls superclass method
Berkshelf::BaseLocation::new
Public Instance Methods
Source
# File lib/berkshelf/locations/git.rb, line 83 def ==(other) other.is_a?(GitLocation) && other.uri == uri && other.branch == branch && other.tag == tag && other.shortref == shortref && other.rel == rel end
Source
# File lib/berkshelf/locations/git.rb, line 75 def cached_cookbook if installed? @cached_cookbook ||= CachedCookbook.from_path(install_path) else nil end end
Source
# File lib/berkshelf/locations/git.rb, line 36 def install scratch_path = Pathname.new(Dir.mktmpdir) if cached? git(%{fetch --force --tags #{uri} "refs/heads/*:refs/heads/*"}, cwd: cache_path.to_s) else git %{clone #{uri} "#{cache_path}" --bare --no-hardlinks} end @revision ||= git(%{rev-parse #{@rev_parse}}, cwd: cache_path.to_s) # Clone into a scratch directory for validations git %{clone --no-checkout "#{cache_path}" "#{scratch_path}"} # Make sure the scratch directory is up-to-date and account for rel paths git(%{fetch --force --tags "#{cache_path}"}, cwd: scratch_path.to_s) git(%{reset --hard #{@revision}}, cwd: scratch_path.to_s) if rel git(%{filter-branch --subdirectory-filter "#{rel}" --force}, cwd: scratch_path.to_s) end # Validate the scratched path is a valid cookbook validate_cached!(scratch_path) # If we got this far, we should atomically move FileUtils.rm_rf(install_path) if install_path.exist? FileUtils.mv(scratch_path, install_path) # Remove the git history FileUtils.rm_rf(File.join(install_path, ".git")) install_path.chmod(0777 & ~File.umask) ensure # Ensure the scratch directory is cleaned up FileUtils.rm_rf(scratch_path) end
Install this git cookbook into the cookbook store. This method leverages a cached git copy and a scratch directory to prevent bad cookbooks from making their way into the cookbook store.
@see BaseLocation#install
Source
# File lib/berkshelf/locations/git.rb, line 27 def installed? !!(revision && install_path.exist?) end
@see BaseLoation#installed?
Source
# File lib/berkshelf/locations/git.rb, line 102 def to_lock out = " git: #{uri}\n" out << " revision: #{revision}\n" out << " ref: #{shortref}\n" if shortref out << " branch: #{branch}\n" if branch out << " tag: #{tag}\n" if tag out << " rel: #{rel}\n" if rel out end
Source
# File lib/berkshelf/locations/git.rb, line 92 def to_s info = tag || branch || shortref || @rev_parse if rel "#{uri} (at #{info}/#{rel})" else "#{uri} (at #{info})" end end
Protected Instance Methods
Source
# File lib/berkshelf/locations/git.rb, line 117 def shortref ref && ref[0...7] end
The short ref (if one was given).
@return [String, nil]
Private Instance Methods
Source
# File lib/berkshelf/locations/git.rb, line 142 def cache_path Pathname.new(Berkshelf.berkshelf_path) .join(".cache", "git", Digest::SHA1.hexdigest(uri)) end
The path where this git repository is cached.
@return [Pathname]
Source
# File lib/berkshelf/locations/git.rb, line 126 def cached? cache_path.exist? end
Determine if this git repo has already been downloaded.
@return [Boolean]
Source
# File lib/berkshelf/locations/git.rb, line 134 def install_path Berkshelf.cookbook_store.storage_path .join("#{dependency.name}-#{revision}") end
The path where this cookbook would live in the store, if it were installed.
@return [Pathname, nil]