blob: 09d4f0eea22bfa3c6b0d95574148146cc3af8266 [file] [log] [blame]
require File.expand_path('../../spec_helper', __FILE__)
require 'webmock'
def set_up_test_repo_for_update
set_up_test_repo
upstream = SpecHelper.temporary_directory + 'upstream'
FileUtils.cp_r(test_repo_path, upstream)
Dir.chdir(test_repo_path) do
`git remote add origin #{upstream}`
`git remote -v`
`git fetch -q`
`git branch --set-upstream-to=origin/master master`
`git config branch.master.rebase true`
end
@sources_manager.stubs(:repos_dir).returns(SpecHelper.tmp_repos_path)
end
module Pod
describe Source::Manager do
before do
@test_source = Source.new(fixture('spec-repos/test_repo'))
@sources_manager = Source::Manager.new(config.repos_dir)
end
#-------------------------------------------------------------------------#
describe 'In general' do
before do
@sources_manager.stubs(:all).returns([@test_source])
end
#--------------------------------------#
it 'returns the path of the search index' do
Source::Manager.any_instance.unstub(:search_index_path)
config.cache_root = Config::DEFAULTS[:cache_root]
path = @sources_manager.search_index_path.to_s
path.should.end_with 'Library/Caches/CocoaPods/search_index.json'
end
describe 'managing sources by URL' do
describe 'finding or creating a source by URL' do
it 'returns an existing matching source' do
Source.any_instance.stubs(:url).returns('url')
@sources_manager.expects(:name_for_url).never
@sources_manager.find_or_create_source_with_url('url').url.
should == 'url'
end
it 'runs `pod repo add` when there is no matching source' do
Command::Repo::Add.any_instance.stubs(:run).once
@sources_manager.stubs(:source_with_url).returns(nil).then.returns(Source.new('Source'))
@sources_manager.find_or_create_source_with_url('https://github.com/artsy/Specs.git').name.
should == 'Source'
end
it 'handles repositories without a remote url' do # for #2965
Command::Repo::Add.any_instance.stubs(:run).once
Source.any_instance.stubs(:url).returns(nil).then.returns('URL')
@sources_manager.find_or_create_source_with_url('URL').url.should == 'URL'
end
end
describe 'finding or creating a source by name or URL' do
it 'returns an existing source with a matching name' do
@sources_manager.expects(:name_for_url).never
@sources_manager.source_with_name_or_url('test_repo').name.
should == 'test_repo'
end
it 'tries by url when there is no matching name' do
Command::Repo::Add.any_instance.stubs(:run).once
@sources_manager.stubs(:source_with_url).returns(nil).then.returns('Source')
@sources_manager.source_with_name_or_url('https://github.com/artsy/Specs.git').
should == 'Source'
end
end
end
end
#-------------------------------------------------------------------------#
describe 'Updating Sources' do
extend SpecHelper::TemporaryRepos
before do
MasterSource.any_instance.stubs(:unchanged_github_repo?).returns(false)
end
it 'updates source backed by a git repository' do
set_up_test_repo_for_update
@sources_manager.expects(:update_search_index_if_needed_in_background).with({}).returns(nil)
repo_update = sequence('repo update')
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} fetch origin --progress)).
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} rev-parse --abbrev-ref HEAD)).
returns("my-special-branch\n").
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} reset --hard origin/my-special-branch)).
in_sequence(repo_update)
@sources_manager.update(test_repo_path.basename.to_s, true)
end
it 'updates source with --silent flag' do
set_up_test_repo_for_update
@sources_manager.expects(:update_search_index_if_needed_in_background).with({}).returns(nil)
repo_update = sequence('repo update --silent')
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} fetch origin)).
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} rev-parse --abbrev-ref HEAD)).
returns("my-special-branch\n").
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} reset --hard origin/my-special-branch)).
in_sequence(repo_update)
@sources_manager.update(test_repo_path.basename.to_s, false)
end
it 'unshallows if the git repo is shallow' do
set_up_test_repo_for_update
test_repo_path.join('.git', 'shallow').open('w') { |f| f << 'a' * 40 }
@sources_manager.expects(:update_search_index_if_needed_in_background).with({}).returns(nil)
repo_update = sequence('repo update')
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} fetch --unshallow)).
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} fetch origin --progress)).
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} rev-parse --abbrev-ref HEAD)).
returns("master\n").
in_sequence(repo_update)
MasterSource.any_instance.
expects(:git!).
with(%W(-C #{test_repo_path} reset --hard origin/master)).
in_sequence(repo_update)
@sources_manager.update(test_repo_path.basename.to_s, true)
UI.output.should.match /deep fetch.+`master`.+improve future performance/
end
it 'prints a warning if the update failed' do
set_up_test_repo_for_update
Source.any_instance.stubs(:git).with do |options|
options.join(' ') == %W(-C #{test_repo_path} rev-parse HEAD).join(' ')
end.returns('aabbccd')
Source.any_instance.stubs(:git).with do |options|
options.join(' ') == %W(-C #{test_repo_path} diff --name-only aabbccd..HEAD).join(' ')
end.returns('')
MasterSource.any_instance.expects(:git!).with(%W(-C #{test_repo_path} fetch origin --progress)).raises(<<-EOS)
fatal: '/dev/null' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
EOS
e = lambda { @sources_manager.update(test_repo_path.basename.to_s, true) }.should.raise Pod::Informative
e.message.should.include('not able to update the `master` repo')
end
it 'informs the user if there is an update for CocoaPods' do
master = @sources_manager.master.first
master.stubs(:metadata).returns(Source::Metadata.new('last' => '999.0'))
master.verify_compatibility!
UI.output.should.match /CocoaPods 999.0 is available/
end
it 'skips the update message if the user disabled the notification' do
config.new_version_message = false
master = @sources_manager.master.first
master.stubs(:metadata).returns(Source::Metadata.new('last' => '999.0'))
master.verify_compatibility!
UI.output.should.not.match /CocoaPods 999.0 is available/
end
end
end
end