class Vanagon::Component::Source

Constants

SUPPORTED_PROTOCOLS

Public Class Methods

determine_source_type(uri) click to toggle source
# File lib/vanagon/component/source.rb, line 64
def determine_source_type(uri)
  # if source_type isn't specified, let's try to figure out what we have
  # order of precedence for this is git, then http, then local

  # Add a 5 second timeout for the `git remote-ls` execution to deal with
  # URLs that incorrectly respond to git queries
  timeout = 5
  if Vanagon::Component::Source::Git.valid_remote?(uri, timeout)
    if uri =~ /^http/
      VanagonLogger.warn "Using http(s) URIs for github is deprecated. " \
                         "Use `git:` URI scheme instead."
    end
    return :git
  end

  if Vanagon::Component::Source::Http.valid_url?(uri)
    return :http
  end

  if Vanagon::Component::Source::Local.valid_file?(uri)
    return :local
  end

  return :unknown
end
source(uri_instance, **options) click to toggle source

Factory to hand back the correct {Vanagon::Component::Source} subtype to the component

@param uri_instance [#to_s] URI of the source file (includes git@… style links) @param options [Hash] hash of the options needed for the subtype @param workdir [String] working directory to fetch the source into @return [Vanagon::Component::Source] the correct subtype for the given source

# File lib/vanagon/component/source.rb, line 21
def source(uri_instance, **options) # rubocop:disable Metrics/AbcSize
  # Sometimes the uri comes in as a string, but sometimes it's already been
  # coerced into a URI object. The individual source providers will turn
  # the passed uri into a URI object if needed, but for this method we
  # want to work with the uri as a string.
  uri = uri_instance.to_s
  if uri.start_with?('git')
    source_type = :git
    # when using an http(s) source for a git repo, you should prefix the
    # url with `git:`, so something like `git:https://github.com/puppetlabs/vanagon`
    # strip the leading `git:` so we have a valid uri
    uri.sub!(/^git:http/, 'http')
  else
    source_type = determine_source_type(uri)
  end

  if source_type == :git
    return Vanagon::Component::Source::Git.new uri,
      sum: options[:sum],
      ref: options[:ref],
      workdir: options[:workdir],
      dirname: options[:dirname],
      clone_options: options[:clone_options]
  end

  if source_type == :http
    return Vanagon::Component::Source::Http.new uri,
      sum: options[:sum],
      workdir: options[:workdir],
      # Default sum_type is md5 if unspecified:
      sum_type: options[:sum_type] || "md5"
  end

  if source_type == :local
    return Vanagon::Component::Source::Local.new uri,
      workdir: options[:workdir]
  end

  # Unknown source type!
  raise Vanagon::InvalidSource,
    "Source is invalid or of an unknown type: '#{uri}'; cannot continue"
end