blob: c29512e5552b61016f4be7bd3cf72c91ca717eb4 [file] [log] [blame]
require 'cocoapods-core/source'
require 'set'
module Pod
class Source
class Manager
# Returns the source whose {Source#url} is equal to `url`, adding the repo
# in a manner similarly to `pod repo add` if it is not found.
#
# @raise If no source with the given `url` could be created,
#
# @return [Source] The source whose {Source#url} is equal to `url`,
#
# @param [String] url
# The URL of the source.
#
def find_or_create_source_with_url(url)
unless source = source_with_url(url)
name = name_for_url(url)
# Hack to ensure that `repo add` output is shown.
previous_title_level = UI.title_level
UI.title_level = 0
begin
if name =~ /^master(-\d+)?$/
Command::Setup.parse([]).run
else
Command::Repo::Add.parse([name, url]).run
end
rescue Informative => e
message = "Unable to add a source with url `#{url}` " \
"named `#{name}`.\n"
message << "(#{e})\n" if Config.instance.verbose?
message << 'You can try adding it manually in ' \
'`~/.cocoapods/repos` or via `pod repo add`.'
raise Informative, message
ensure
UI.title_level = previous_title_level
end
source = source_with_url(url)
end
raise "Unable to create a source with URL #{url}" unless source
source
end
# Returns the source whose {Source#name} or {Source#url} is equal to the
# given `name_or_url`.
#
# @return [Source] The source whose {Source#name} or {Source#url} is equal to the
# given `name_or_url`.
#
# @param [String] name_or_url
# The name or the URL of the source.
#
def source_with_name_or_url(name_or_url)
all.find { |s| s.name == name_or_url } ||
find_or_create_source_with_url(name_or_url)
end
# @return [Pathname] The path where the search index should be stored.
#
def search_index_path
@search_index_path ||= Config.instance.search_index_file
end
# @!group Updating Sources
# Updates the local clone of the spec-repo with the given name or of all
# the git repos if the name is omitted.
#
# @param [String] source_name
#
# @param [Bool] show_output
#
# @return [void]
#
def update(source_name = nil, show_output = false)
if source_name
sources = [git_source_named(source_name)]
else
sources = git_sources
end
changed_spec_paths = {}
sources.each do |source|
UI.section "Updating spec repo `#{source.name}`" do
changed_source_paths = source.update(show_output)
changed_spec_paths[source] = changed_source_paths if changed_source_paths.count > 0
source.verify_compatibility!
end
end
# Perform search index update operation in background.
update_search_index_if_needed_in_background(changed_spec_paths)
end
end
extend Executable
executable :git
def git(args, include_error: false)
Executable.capture_command('git', args, :capture => include_error ? :merge : :out).first.strip
end
def update_git_repo(show_output = false)
Config.instance.with_changes(:verbose => show_output) do
args = %W(-C #{repo} fetch origin)
args.push('--progress') if show_output
git!(args)
current_branch = git!(%W(-C #{repo} rev-parse --abbrev-ref HEAD)).strip
git!(%W(-C #{repo} reset --hard origin/#{current_branch}))
end
rescue
raise Informative, 'CocoaPods was not able to update the ' \
"`#{name}` repo. If this is an unexpected issue " \
'and persists you can inspect it running ' \
'`pod repo update --verbose`'
end
end
class MasterSource
def update_git_repo(show_output = false)
if repo.join('.git', 'shallow').file?
UI.info "Performing a deep fetch of the `#{name}` specs repo to improve future performance" do
git!(%W(-C #{repo} fetch --unshallow))
end
end
super
end
def verify_compatibility!
super
latest_cocoapods_version = metadata.latest_cocoapods_version && Gem::Version.create(metadata.latest_cocoapods_version)
return unless Config.instance.new_version_message? &&
latest_cocoapods_version &&
latest_cocoapods_version > Gem::Version.new(Pod::VERSION)
rc = latest_cocoapods_version.prerelease?
install_message = !Pathname(__FILE__).dirname.writable? ? 'sudo ' : ''
install_message << 'gem install cocoapods'
install_message << ' --pre' if rc
message = [
'',
"CocoaPods #{latest_cocoapods_version} is available.".green,
"To update use: `#{install_message}`".green,
("[!] This is a test version we'd love you to try.".yellow if rc),
'',
'For more information, see https://blog.cocoapods.org ' \
'and the CHANGELOG for this version at ' \
"https://github.com/CocoaPods/CocoaPods/releases/tag/#{latest_cocoapods_version}".green,
'',
'',
].compact.join("\n")
UI.puts(message)
end
end
end