lib/pdk/template/fetcher/git.rb in pdk-2.4.0 vs lib/pdk/template/fetcher/git.rb in pdk-2.5.0

- old
+ new

@@ -1,85 +1,85 @@ -require 'pdk' - -module PDK - module Template - module Fetcher - class Git < PDK::Template::Fetcher::AbstractFetcher - # Whether the passed uri is fetchable by Git. - # @see PDK::Template::Fetcher.instance - # @return [Boolean] - def self.fetchable?(uri, _options = {}) - PDK::Util::Git.repo?(uri.bare_uri) - end - - # @see PDK::Template::Fetcher::AbstractTemplateFetcher.fetch! - def fetch! - return if fetched - super - - # Default metadata for all git fetching methods - @metadata['template-url'] = uri.metadata_format - - # We don't do a checkout of local-path repos. There are lots of edge - # cases or user un-expectations. - if PDK::Util::Git.work_tree?(uri.shell_path) - PDK.logger.warn _("Repository '%{repo}' has a work-tree; skipping git reset.") % { - repo: uri.shell_path, - } - @path = uri.shell_path - @temporary = false - @metadata['template-ref'] = describe_path_and_ref(@path) - return - end - - # This is either a bare local repo or a remote. either way it needs cloning. - # A "remote" can also be git repo on the local filsystem. - # @todo When switching this over to using rugged, cache the cloned - # template repo in `%AppData%` or `$XDG_CACHE_DIR` and update before - # use. - require 'pdk/util' - require 'pdk/util/git' - - temp_dir = PDK::Util.make_tmpdir_name('pdk-templates') - @temporary = true - origin_repo = uri.bare_uri - git_ref = uri.uri_fragment - - # Clone the repository - clone_result = PDK::Util::Git.git('clone', origin_repo, temp_dir) - unless clone_result[:exit_code].zero? - PDK.logger.error clone_result[:stdout] - PDK.logger.error clone_result[:stderr] - raise PDK::CLI::FatalError, _("Unable to clone git repository at '%{repo}' into '%{dest}'.") % { repo: origin_repo, dest: temp_dir } - end - @path = PDK::Util.canonical_path(temp_dir) - - # Checkout the git reference - if PDK::Util::Git.work_dir_clean?(temp_dir) - Dir.chdir(temp_dir) do - full_ref = PDK::Util::Git.ls_remote(temp_dir, git_ref) - @metadata['template-ref'] = describe_path_and_ref(temp_dir, full_ref) - reset_result = PDK::Util::Git.git('reset', '--hard', full_ref) - return if reset_result[:exit_code].zero? - - PDK.logger.error reset_result[:stdout] - PDK.logger.error reset_result[:stderr] - raise PDK::CLI::FatalError, _("Unable to checkout '%{ref}' of git repository at '%{path}'.") % { ref: git_ref, path: temp_dir } - end - else - PDK.logger.warn _("Uncommitted changes found when attempting to checkout '%{ref}' of git repository at '%{path}'; skipping git reset.") % { ref: git_ref, path: temp_dir } - @metadata['template-ref'] = describe_path_and_ref(temp_dir) - end - end - - private - - #:nocov: This is a just a wrapper for another method - def describe_path_and_ref(path, ref = nil) - require 'pdk/util/git' - PDK::Util::Git.describe(File.join(path, '.git'), ref) - end - #:nocov: - end - end - end -end +require 'pdk' + +module PDK + module Template + module Fetcher + class Git < PDK::Template::Fetcher::AbstractFetcher + # Whether the passed uri is fetchable by Git. + # @see PDK::Template::Fetcher.instance + # @return [Boolean] + def self.fetchable?(uri, _options = {}) + PDK::Util::Git.repo?(uri.bare_uri) + end + + # @see PDK::Template::Fetcher::AbstractTemplateFetcher.fetch! + def fetch! + return if fetched + super + + # Default metadata for all git fetching methods + @metadata['template-url'] = uri.metadata_format + + # We don't do a checkout of local-path repos. There are lots of edge + # cases or user un-expectations. + if PDK::Util::Git.work_tree?(uri.shell_path) + PDK.logger.warn _("Repository '%{repo}' has a work-tree; skipping git reset.") % { + repo: uri.shell_path, + } + @path = uri.shell_path + @temporary = false + @metadata['template-ref'] = describe_path_and_ref(@path) + return + end + + # This is either a bare local repo or a remote. either way it needs cloning. + # A "remote" can also be git repo on the local filsystem. + # @todo When switching this over to using rugged, cache the cloned + # template repo in `%AppData%` or `$XDG_CACHE_DIR` and update before + # use. + require 'pdk/util' + require 'pdk/util/git' + + temp_dir = PDK::Util.make_tmpdir_name('pdk-templates') + @temporary = true + origin_repo = uri.bare_uri + git_ref = uri.uri_fragment + + # Clone the repository + clone_result = PDK::Util::Git.git('clone', origin_repo, temp_dir) + unless clone_result[:exit_code].zero? + PDK.logger.error clone_result[:stdout] + PDK.logger.error clone_result[:stderr] + raise PDK::CLI::FatalError, _("Unable to clone git repository at '%{repo}' into '%{dest}'.") % { repo: origin_repo, dest: temp_dir } + end + @path = PDK::Util.canonical_path(temp_dir) + + # Checkout the git reference + if PDK::Util::Git.work_dir_clean?(temp_dir) + Dir.chdir(temp_dir) do + full_ref = PDK::Util::Git.ls_remote(temp_dir, git_ref) + @metadata['template-ref'] = describe_path_and_ref(temp_dir, full_ref) + reset_result = PDK::Util::Git.git('reset', '--hard', full_ref) + return if reset_result[:exit_code].zero? + + PDK.logger.error reset_result[:stdout] + PDK.logger.error reset_result[:stderr] + raise PDK::CLI::FatalError, _("Unable to checkout '%{ref}' of git repository at '%{path}'.") % { ref: git_ref, path: temp_dir } + end + else + PDK.logger.warn _("Uncommitted changes found when attempting to checkout '%{ref}' of git repository at '%{path}'; skipping git reset.") % { ref: git_ref, path: temp_dir } + @metadata['template-ref'] = describe_path_and_ref(temp_dir) + end + end + + private + + #:nocov: This is a just a wrapper for another method + def describe_path_and_ref(path, ref = nil) + require 'pdk/util/git' + PDK::Util::Git.describe(File.join(path, '.git'), ref) + end + #:nocov: + end + end + end +end