right_scraper 1.0.26 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +16 -0
- data/README.rdoc +9 -28
- data/Rakefile +51 -39
- data/lib/right_scraper/builders/base.rb +64 -0
- data/lib/right_scraper/builders/filesystem.rb +96 -0
- data/lib/right_scraper/builders/union.rb +57 -0
- data/lib/right_scraper/logger.rb +102 -0
- data/lib/right_scraper/loggers/noisy.rb +85 -0
- data/lib/right_scraper/processes/ssh.rb +188 -0
- data/lib/right_scraper/repositories/base.rb +299 -0
- data/lib/right_scraper/repositories/download.rb +90 -0
- data/lib/right_scraper/repositories/git.rb +92 -0
- data/lib/right_scraper/repositories/mock.rb +70 -0
- data/lib/right_scraper/repositories/svn.rb +96 -0
- data/lib/right_scraper/resources/base.rb +70 -0
- data/{spec/scraper_base_spec.rb → lib/right_scraper/resources/cookbook.rb} +9 -23
- data/lib/right_scraper/resources/workflow.rb +55 -0
- data/lib/right_scraper/retrievers/base.rb +114 -0
- data/lib/right_scraper/retrievers/checkout.rb +79 -0
- data/lib/right_scraper/retrievers/download.rb +97 -0
- data/lib/right_scraper/retrievers/git.rb +140 -0
- data/lib/right_scraper/retrievers/svn.rb +87 -0
- data/lib/right_scraper/scanners/base.rb +111 -0
- data/lib/right_scraper/scanners/cookbook_manifest.rb +59 -0
- data/lib/right_scraper/scanners/cookbook_metadata.rb +69 -0
- data/lib/right_scraper/scanners/cookbook_s3_upload.rb +84 -0
- data/lib/right_scraper/scanners/union.rb +89 -0
- data/lib/right_scraper/scanners/workflow_manifest.rb +86 -0
- data/lib/right_scraper/scanners/workflow_metadata.rb +70 -0
- data/lib/right_scraper/scanners/workflow_s3_upload.rb +85 -0
- data/lib/right_scraper/scraper.rb +81 -57
- data/lib/right_scraper/scraper_logger.rb +61 -0
- data/lib/right_scraper/scrapers/base.rb +262 -0
- data/lib/right_scraper/scrapers/cookbook.rb +73 -0
- data/lib/right_scraper/scrapers/workflow.rb +88 -0
- data/lib/right_scraper/svn_client.rb +101 -0
- data/lib/right_scraper/version.rb +28 -0
- data/lib/right_scraper.rb +35 -11
- data/right_scraper.gemspec +26 -13
- data/right_scraper.rconf +13 -0
- data/spec/builder_spec.rb +50 -0
- data/spec/cookbook_helper.rb +73 -0
- data/spec/cookbook_manifest_spec.rb +55 -0
- data/spec/cookbook_s3_upload_spec.rb +152 -0
- data/spec/download/download_retriever_spec.rb +118 -0
- data/spec/download/download_retriever_spec_helper.rb +72 -0
- data/spec/download/download_spec.rb +130 -0
- data/spec/download/multi_dir_spec.rb +106 -0
- data/spec/download/multi_dir_spec_helper.rb +40 -0
- data/spec/git/cookbook_spec.rb +166 -0
- data/spec/git/demokey +27 -0
- data/spec/git/demokey.pub +1 -0
- data/spec/git/password_key +30 -0
- data/spec/git/password_key.pub +1 -0
- data/spec/git/repository_spec.rb +110 -0
- data/spec/git/retriever_spec.rb +505 -0
- data/spec/git/retriever_spec_helper.rb +112 -0
- data/spec/git/scraper_spec.rb +136 -0
- data/spec/git/ssh_spec.rb +170 -0
- data/spec/git/url_spec.rb +103 -0
- data/spec/logger_spec.rb +185 -0
- data/spec/repository_spec.rb +89 -23
- data/spec/{scraper_spec_helper_base.rb → retriever_spec_helper.rb} +41 -27
- data/spec/scanner_spec.rb +61 -0
- data/spec/scraper_helper.rb +96 -0
- data/spec/scraper_spec.rb +123 -45
- data/spec/spec_helper.rb +87 -14
- data/spec/svn/cookbook_spec.rb +97 -0
- data/spec/svn/multi_svn_spec.rb +64 -0
- data/spec/svn/multi_svn_spec_helper.rb +40 -0
- data/spec/svn/repository_spec.rb +72 -0
- data/spec/svn/retriever_spec.rb +261 -0
- data/spec/svn/scraper_spec.rb +90 -0
- data/spec/svn/{svn_scraper_spec_helper.rb → svn_retriever_spec_helper.rb} +46 -27
- data/spec/svn/url_spec.rb +47 -0
- data/spec/url_spec.rb +164 -0
- metadata +203 -31
- data/lib/right_scraper/linux/process_monitor.rb +0 -84
- data/lib/right_scraper/repository.rb +0 -78
- data/lib/right_scraper/scraper_base.rb +0 -175
- data/lib/right_scraper/scrapers/download_scraper.rb +0 -67
- data/lib/right_scraper/scrapers/git_scraper.rb +0 -283
- data/lib/right_scraper/scrapers/svn_scraper.rb +0 -119
- data/lib/right_scraper/watcher.rb +0 -158
- data/lib/right_scraper/win32/process_monitor.rb +0 -98
- data/spec/download/download_scraper_spec.rb +0 -94
- data/spec/git/git_scraper_spec.rb +0 -165
- data/spec/git/git_scraper_spec_helper.rb +0 -72
- data/spec/rcov.opts +0 -1
- data/spec/spec.opts +0 -2
- data/spec/svn/svn_scraper_spec.rb +0 -148
- data/spec/watcher_spec.rb +0 -74
@@ -0,0 +1,130 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright: Copyright (c) 2010-2011 RightScale, Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# 'Software'), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'cookbook_helper'))
|
24
|
+
|
25
|
+
describe RightScraper::Resources::Cookbook do
|
26
|
+
include RightScraper::SpecHelpers::DevelopmentModeEnvironment
|
27
|
+
|
28
|
+
include RightScraper::CookbookHelper
|
29
|
+
|
30
|
+
shared_examples_for 'a download repository' do
|
31
|
+
it_should_behave_like 'a generic repository'
|
32
|
+
|
33
|
+
it 'should have no tag' do
|
34
|
+
parse_url(@repository)[:tag].should be_nil
|
35
|
+
end
|
36
|
+
it 'should have no position' do
|
37
|
+
parse_url(@repository)[:position].should be_nil
|
38
|
+
end
|
39
|
+
it 'should have no credentials' do
|
40
|
+
parse_url(@repository)[:username].should be_nil
|
41
|
+
parse_url(@repository)[:password].should be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with a download repository' do
|
46
|
+
before(:each) do
|
47
|
+
@repository = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
48
|
+
:repo_type => :download,
|
49
|
+
:url => "http://a.site/foo/bar/baz",
|
50
|
+
:first_credential => "user",
|
51
|
+
:second_credential => "password")
|
52
|
+
end
|
53
|
+
|
54
|
+
it_should_behave_like 'a download repository'
|
55
|
+
|
56
|
+
it 'should have a cookbook hash' do
|
57
|
+
checkout_hash =
|
58
|
+
Digest::SHA1.hexdigest("1\000download\000http://a.site/foo/bar/baz\000")
|
59
|
+
example_cookbook(@repository).resource_hash.should ==
|
60
|
+
Digest::SHA1.hexdigest("1\000#{checkout_hash}\000")
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should have a cookbook hash invariant under credential changes' do
|
64
|
+
old_hash = example_cookbook(@repository).resource_hash
|
65
|
+
@repository.first_credential = "b-key"
|
66
|
+
example_cookbook(@repository).resource_hash.should == old_hash
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should have a cookbook hash that varies when the position changes' do
|
70
|
+
example_cookbook(@repository, "foo").resource_hash.should_not ==
|
71
|
+
example_cookbook(@repository, "bar").resource_hash
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with a download repository with a port' do
|
76
|
+
before(:each) do
|
77
|
+
@repository = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
78
|
+
:repo_type => :download,
|
79
|
+
:url => "http://a.site:23/foo/bar/baz",
|
80
|
+
:first_credential => "user",
|
81
|
+
:second_credential => "password")
|
82
|
+
end
|
83
|
+
|
84
|
+
it_should_behave_like 'a download repository'
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'with a download repository with just a user' do
|
88
|
+
before(:each) do
|
89
|
+
@repository = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
90
|
+
:repo_type => :download,
|
91
|
+
:url => "http://a.site/foo/bar/baz",
|
92
|
+
:first_credential => "user")
|
93
|
+
end
|
94
|
+
|
95
|
+
it_should_behave_like 'a download repository'
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'with a weird download repository' do
|
99
|
+
before(:each) do
|
100
|
+
@repository = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
101
|
+
:repo_type => :download,
|
102
|
+
:url => "urn:a.site:stuff")
|
103
|
+
end
|
104
|
+
|
105
|
+
it_should_behave_like 'a download repository'
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'with a malicious download repository' do
|
109
|
+
before(:each) do
|
110
|
+
@repository = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
111
|
+
:repo_type => :download,
|
112
|
+
:url => "http://foo.bar.baz.quux/%20CBLAH",
|
113
|
+
:first_credential => "foo:b/ar",
|
114
|
+
:second_credential => "foo@bar")
|
115
|
+
end
|
116
|
+
|
117
|
+
it_should_behave_like 'a download repository'
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'with a download repository that includes a query' do
|
121
|
+
before(:each) do
|
122
|
+
@repository = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
123
|
+
:repo_type => :download,
|
124
|
+
:url => "http://foo.bar.baz.quux/stuff?q=bar")
|
125
|
+
end
|
126
|
+
|
127
|
+
it_should_behave_like 'a download repository'
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright: Copyright (c) 2010-2011 RightScale, Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# 'Software'), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'multi_dir_spec_helper'))
|
25
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'scraper_helper'))
|
26
|
+
|
27
|
+
describe RightScraper::Retrievers::Download do
|
28
|
+
context 'in a multiple directory situation with a resources_path set' do
|
29
|
+
include RightScraper::SpecHelpers::DevelopmentModeEnvironment
|
30
|
+
|
31
|
+
include RightScraper::ScraperHelper
|
32
|
+
include RightScraper::SpecHelpers
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
@helper = RightScraper::MultiDirectorySpecHelper.new
|
36
|
+
@repo = @helper.repo
|
37
|
+
end
|
38
|
+
|
39
|
+
after(:each) do
|
40
|
+
@helper.close unless @helper.nil?
|
41
|
+
@helper = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'given a download repository' do
|
45
|
+
before(:each) do
|
46
|
+
@retriever = @repo.retriever(:max_bytes => 1024**2, :max_seconds => 20, :basedir => @helper.download_repo_path)
|
47
|
+
@retriever.retrieve
|
48
|
+
@scraper = RightScraper::Scrapers::Base.scraper(:kind => :cookbook,
|
49
|
+
:ignorable_paths => @retriever.ignorable_paths,
|
50
|
+
:repo_dir => @retriever.repo_dir,
|
51
|
+
:repository => @retriever.repository)
|
52
|
+
|
53
|
+
@download_file = @helper.download_file
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should return two cookbooks' do
|
57
|
+
@scraper.next_resource.should_not == nil
|
58
|
+
@scraper.next_resource.should_not == nil
|
59
|
+
@scraper.next_resource.should == nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should scrape' do
|
63
|
+
@helper.check_resource(@scraper.next_resource, @download_file, @repo, "subdir1")
|
64
|
+
@helper.check_resource(@scraper.next_resource, @download_file, @repo, "subdir2")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should scrape a gzipped tarball' do
|
69
|
+
@download_file = @helper.download_file
|
70
|
+
res, status = exec("gzip -c #{@download_file} > #{@download_file}.gz")
|
71
|
+
raise "Failed to gzip tarball: #{res}" unless status.success?
|
72
|
+
begin
|
73
|
+
@repo.url += ".gz"
|
74
|
+
@retriever = @repo.retriever(:max_bytes => 1024**2, :max_seconds => 20, :basedir => @helper.download_repo_path)
|
75
|
+
@retriever.retrieve
|
76
|
+
@scraper = RightScraper::Scrapers::Base.scraper(:kind => :cookbook,
|
77
|
+
:ignorable_paths => @retriever.ignorable_paths,
|
78
|
+
:repo_dir => @retriever.repo_dir,
|
79
|
+
:repository => @retriever.repository)
|
80
|
+
@helper.check_resource(@scraper.next_resource, @download_file + ".gz", @repo, "subdir1")
|
81
|
+
@helper.check_resource(@scraper.next_resource, @download_file + ".gz", @repo, "subdir2")
|
82
|
+
ensure
|
83
|
+
File.unlink(@download_file + ".gz")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should scrape a bzipped tarball' do
|
88
|
+
@download_file = @helper.download_file
|
89
|
+
res, status = exec("bzip2 -c #{@download_file} > #{@download_file}.bz2")
|
90
|
+
raise "Failed to bzip tarball: #{res}" unless status.success?
|
91
|
+
begin
|
92
|
+
@repo.url += ".bz2"
|
93
|
+
@retriever = @repo.retriever(:max_bytes => 1024**2, :max_seconds => 20, :basedir => @helper.download_repo_path)
|
94
|
+
@retriever.retrieve
|
95
|
+
@scraper = RightScraper::Scrapers::Base.scraper(:kind => :cookbook,
|
96
|
+
:ignorable_paths => @retriever.ignorable_paths,
|
97
|
+
:repo_dir => @retriever.repo_dir,
|
98
|
+
:repository => @retriever.repository)
|
99
|
+
@helper.check_resource(@scraper.next_resource, @download_file + ".bz2", @repo, "subdir1")
|
100
|
+
@helper.check_resource(@scraper.next_resource, @download_file + ".bz2", @repo, "subdir2")
|
101
|
+
ensure
|
102
|
+
File.unlink(@download_file + ".bz2")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright: Copyright (c) 2010-2011 RightScale, Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# 'Software'), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'download_retriever_spec_helper'))
|
25
|
+
|
26
|
+
module RightScraper
|
27
|
+
class MultiDirectorySpecHelper < DownloadRetrieverSpecHelper
|
28
|
+
def make_cookbooks
|
29
|
+
super
|
30
|
+
create_cookbook(File.join(download_repo_path, 'subdir1'), repo_content)
|
31
|
+
create_cookbook(File.join(download_repo_path, 'subdir2'), repo_content)
|
32
|
+
end
|
33
|
+
|
34
|
+
def repo
|
35
|
+
r = super
|
36
|
+
r.resources_path = ['subdir1', 'subdir2']
|
37
|
+
r
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright: Copyright (c) 2010-2011 RightScale, Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# 'Software'), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
24
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'cookbook_helper'))
|
25
|
+
|
26
|
+
describe RightScraper::Resources::Cookbook do
|
27
|
+
include RightScraper::SpecHelpers::DevelopmentModeEnvironment
|
28
|
+
|
29
|
+
include RightScraper::CookbookHelper
|
30
|
+
|
31
|
+
shared_examples_for 'a git repository' do
|
32
|
+
it_should_behave_like 'a generic repository'
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with an invalid git repository' do
|
36
|
+
before(:each) do
|
37
|
+
@repository = RightScraper::Repositories::Git.from_hash(:display_name => 'test repo',
|
38
|
+
:repo_type => :git,
|
39
|
+
:url => "http://a.site/foo/bar/baz")
|
40
|
+
end
|
41
|
+
|
42
|
+
it_should_behave_like 'a git repository'
|
43
|
+
|
44
|
+
it 'should fail to scrape' do
|
45
|
+
lambda {
|
46
|
+
begin
|
47
|
+
@tmpdir = Dir.mktmpdir
|
48
|
+
retriever = @repository.retriever(:basedir => @tmpdir)
|
49
|
+
retriever.retrieve
|
50
|
+
ensure
|
51
|
+
FileUtils.remove_entry_secure(@tmpdir)
|
52
|
+
end
|
53
|
+
}.should raise_exception(Git::GitExecuteError)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with a git repository with a credential that requires a password' do
|
58
|
+
before(:each) do
|
59
|
+
passwd_key = File.open(File.join(File.dirname(__FILE__), 'password_key')).read
|
60
|
+
@repository = RightScraper::Repositories::Git.from_hash(
|
61
|
+
:display_name => 'test repo',
|
62
|
+
:repo_type => :git,
|
63
|
+
:url => "http://a.site/foo/bar/baz",
|
64
|
+
:first_credential => passwd_key)
|
65
|
+
end
|
66
|
+
|
67
|
+
it_should_behave_like 'a git repository'
|
68
|
+
|
69
|
+
it 'should close the connection to the agent' do
|
70
|
+
oldpid = ENV['SSH_AGENT_PID']
|
71
|
+
lambda {
|
72
|
+
begin
|
73
|
+
@tmpdir = Dir.mktmpdir
|
74
|
+
retriever = @repository.retriever(:basedir => @tmpdir)
|
75
|
+
retriever.retrieve
|
76
|
+
ensure
|
77
|
+
FileUtils.remove_entry_secure(@tmpdir)
|
78
|
+
end
|
79
|
+
}.should raise_exception(ProcessWatcher::NonzeroExitCode)
|
80
|
+
ENV['SSH_AGENT_PID'].should == oldpid
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'with an invalid git repository with a real credential' do
|
85
|
+
before(:each) do
|
86
|
+
passwd_key = File.open(File.join(File.dirname(__FILE__), 'demokey')).read
|
87
|
+
@repository = RightScraper::Repositories::Git.from_hash(
|
88
|
+
:display_name => 'test repo',
|
89
|
+
:repo_type => :git,
|
90
|
+
:url => "http://example.example/foo/bar/baz",
|
91
|
+
:first_credential => passwd_key)
|
92
|
+
end
|
93
|
+
|
94
|
+
it_should_behave_like 'a git repository'
|
95
|
+
|
96
|
+
it 'should close the connection to the agent' do
|
97
|
+
oldpid = ENV['SSH_AGENT_PID']
|
98
|
+
lambda {
|
99
|
+
begin
|
100
|
+
@tmpdir = Dir.mktmpdir
|
101
|
+
retriever = @repository.retriever(:basedir => @tmpdir)
|
102
|
+
retriever.retrieve
|
103
|
+
ensure
|
104
|
+
FileUtils.remove_entry_secure(@tmpdir)
|
105
|
+
end
|
106
|
+
}.should raise_exception(Git::GitExecuteError)
|
107
|
+
ENV['SSH_AGENT_PID'].should == oldpid
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'with a git repository' do
|
112
|
+
before(:each) do
|
113
|
+
@repository = RightScraper::Repositories::Git.from_hash(
|
114
|
+
:display_name => 'test repo',
|
115
|
+
:repo_type => :git,
|
116
|
+
:url => "http://a.site/foo/bar/baz",
|
117
|
+
:first_credential => "a-key")
|
118
|
+
end
|
119
|
+
|
120
|
+
it_should_behave_like 'a git repository'
|
121
|
+
|
122
|
+
it 'should have a tag' do
|
123
|
+
@repository.tag.should == "master"
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should have a cookbook hash' do
|
127
|
+
repo_hash = Digest::SHA1.hexdigest("1\000git\000http://a.site/foo/bar/baz\000master")
|
128
|
+
example_cookbook(@repository).resource_hash.should ==
|
129
|
+
Digest::SHA1.hexdigest("1\000#{repo_hash}\000")
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should have a cookbook hash invariant under credential changes' do
|
133
|
+
old_hash = example_cookbook(@repository).resource_hash
|
134
|
+
@repository.first_credential = "b-key"
|
135
|
+
example_cookbook(@repository).resource_hash.should == old_hash
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should have a cookbook hash that varies when the tag changes' do
|
139
|
+
old_hash = example_cookbook(@repository).resource_hash
|
140
|
+
@repository.tag = "tag"
|
141
|
+
example_cookbook(@repository).resource_hash.should_not == old_hash
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should have a cookbook hash that varies when the position changes' do
|
145
|
+
example_cookbook(@repository, "foo").resource_hash.should_not ==
|
146
|
+
example_cookbook(@repository, "bar").resource_hash
|
147
|
+
end
|
148
|
+
end
|
149
|
+
context 'with a git repository with a tag' do
|
150
|
+
before(:each) do
|
151
|
+
@repository = RightScraper::Repositories::Git.from_hash(
|
152
|
+
:display_name => 'test repo',
|
153
|
+
:repo_type => :git,
|
154
|
+
:url => "http://a.site/foo/bar/baz",
|
155
|
+
:tag => "DEADBEEF",
|
156
|
+
:first_credential => "a-key")
|
157
|
+
end
|
158
|
+
|
159
|
+
it_should_behave_like 'a git repository'
|
160
|
+
|
161
|
+
it 'should have a tag' do
|
162
|
+
@repository.tag.should == "DEADBEEF"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
data/spec/git/demokey
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEoQIBAAKCAQEAxJsM8sZ6++Nky/ogLEYhKtKivB37sPB9M6Un0z6PkIRgUsGd
|
3
|
+
ntMJqP1U6820jH+n1/lOH/MnlUsvzoo8DnOdbe9kGOHBmtWmNcjqacZUn9Dbpbjv
|
4
|
+
lI7RUUmZ5OBKn8Pjt2qbSXnnci9Q5j5Rgh6DR8A70S04FIUP8AGpCIO23BhA928C
|
5
|
+
iM18zN5mBvzET7L2DYiNhJJFsFWMbN13CdukTjNVNLETEusNVUU09G1NxX4esKky
|
6
|
+
7tHh1c9APFvu98KjYOHkv1o7dB7T4dO3KaKCNWINCHeeoE+QmAkhAZwI72ijRkPx
|
7
|
+
H+QMisMsHucPFvgOVVObxHWu9hRlNWIOodANHQIBIwKCAQBDaFw1+uhWXJeWZGLN
|
8
|
+
Wd98ZXmflUBZ7A2rTpFPva2QomorAI3QDddtI6gWVSf1qBxKDFVMyGVXwgHDKBSX
|
9
|
+
PZUPv8qMMCUfJK4Dz9tXdzL09ya8eeu959K8yMcMpKvfAVVjdQIKkDIYhUBO8Mt9
|
10
|
+
EcacQeiffTfMhWSMzV6Gk48m4ySfpqpLFOdL5DQfBhoPatsjqbMMe5bC+t/LlGhO
|
11
|
+
lrxH1BDM+54O+EamgCiZp2AsLNfhjyrXu5fqzXCHA/0cC5hWDB7JPCJwe+XL4ivy
|
12
|
+
zLEdRdqcV7cqX0wvsDohFXXJ+P8SlQtbzZmtb1cfheii8EZNzjZeCqRqmNOGyuHN
|
13
|
+
La0LAoGBAOWm8yNw/6rIcRW+bGp2xsCZ/RYMeeHXYi9yTXbCfWu6ToFnivkpxcH3
|
14
|
+
aG5SivCQeGC6J6ZFwDIwFbbLUvvyCcVv25WrgUvAQC5/rRlh8cKffnLoNx/9SFNz
|
15
|
+
xE8/48so5zcLsrkvAi+w+x/Lfu3IguoItpYqIXxhmBvCra+TPnUZAoGBANspgG5n
|
16
|
+
e4S8aQ2Yvo3WnzZLhy0+WpbK7ProydAM0T4Xuk13SDeS0Sf4PFA3D4S0LZ2kn/pe
|
17
|
+
g9844laR5/tz7GGguEqePuCWdUck0vLuMRBV19yC61MSG/RD2Cg2jvuOwIREXoF6
|
18
|
+
dNyf7fjiIZAd4wHprjxdX9MIPospj0x4IbSlAoGAfKsWRnCKymzPrLfUdE8bb96Q
|
19
|
+
tDKokIrdh3iQc6toqDHwGlzHyRatLsgiv4vlBj/MUcQkJw/r/fzYlm5gP6CmN/rk
|
20
|
+
6tlyEy3ZsteYe35QCpEYwgkH+2w9NJ3uOaZXFoPrOyObiRmE2A+eRHXIj7X97MLm
|
21
|
+
xovmStXk2962DtrnZCMCgYEAqRFjE1ckxXtm+9w7OjfZ6A5g9wQ3QSAzJ/Voe+yh
|
22
|
+
amoTYFS0DZ0lAZOcPeFVHTqJlt4VAvh0W74q8lNMjsckEMxw6Rr9TirswdqUGn07
|
23
|
+
ysXhCTHLepjw/kL3NPbjVFguHORI54paJooAuK5xqbCnzkaNuYncNRT9DEShvqXQ
|
24
|
+
288CgYA+2HcMnscZOBF7DStMxEgmJuez9XE04ke0Mbzs1Igp001jllJExOtI/4pn
|
25
|
+
uVfahf3ds/n3YQu0wHLe2utKckE4DCd3zMKTwz32pGodXzSFwhNteeEutefHLtsH
|
26
|
+
2IPpEtDXfDbBUJGYFLKyUHswZ9glKffhs31X5jb77BMbScNEQw==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1 @@
|
|
1
|
+
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxJsM8sZ6++Nky/ogLEYhKtKivB37sPB9M6Un0z6PkIRgUsGdntMJqP1U6820jH+n1/lOH/MnlUsvzoo8DnOdbe9kGOHBmtWmNcjqacZUn9DbpbjvlI7RUUmZ5OBKn8Pjt2qbSXnnci9Q5j5Rgh6DR8A70S04FIUP8AGpCIO23BhA928CiM18zN5mBvzET7L2DYiNhJJFsFWMbN13CdukTjNVNLETEusNVUU09G1NxX4esKky7tHh1c9APFvu98KjYOHkv1o7dB7T4dO3KaKCNWINCHeeoE+QmAkhAZwI72ijRkPxH+QMisMsHucPFvgOVVObxHWu9hRlNWIOodANHQ== grahamhughes@Graham-Hughess-Computer.local
|
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
3
|
+
DEK-Info: DES-EDE3-CBC,6B0CA080DABAAD1E
|
4
|
+
|
5
|
+
/HzipjC3L/jIQGWAIBLbAIFYd3R9a/LtZhYlH0BL2fa3xIhCfSTrgaF/dSGivhXp
|
6
|
+
bAJC1JBvIKfyZp/sNJxN058rbhWJXUeixbyjGqCZpfHGbWRRp41V3s0Vtlb6yv/t
|
7
|
+
tpv+wAf36RcE/Did+SEvLSesBAeYqt+6RAeyntDPiBDXA24neJ9krn8LoYu6vc7L
|
8
|
+
u4M7YmAcjxdive3AYYz8pnldzLBtvJ+2QK9gMexyGiFrvJi7efHRw1aqac4LOLSE
|
9
|
+
/0575oEvULJoUSgNSMMqCU+CDBbSn6re+TMA89gDAEKYDyAL/SU0OJGs30ulfHMg
|
10
|
+
CCkDF8NK7X9zBlAkD/m0mrIHbjWjnWIlBj1ZUcGYtp3/oMuMyBTpkVcNJVUMN5YF
|
11
|
+
U9iWGsP+OTXGxOWQh3NiG+0xBgLjzPkaJIxw4tWg5pSpavD6yZ8rOQcpPFC05NzE
|
12
|
+
Kll750p7fX0G+/M9gVu84QfCc+xTpD/bJ8BvdfQnpBAPx653IO1OCNWtdURTu4a5
|
13
|
+
6lBVa0NG92xx9CeuyC9jFNpqMN65YLF4vchLnTH1UkzEJ46S8TIIiEj2UPHP82N9
|
14
|
+
aKX+0lc60s3RKZWTEvPYzEAAXRihyVUefvbT0e1Dz1NzW2WzRA4UwHc0rg5r/2d5
|
15
|
+
MGnI77i+cNtyPmEucLn5PQAkSubGs5Ww9vwB2mAyLIWsLDzkUX7/TFBE/05p35if
|
16
|
+
Tz8Lj7bpIY4itzV752rfYI17QL2AXUkEaR3PKFl8JC9NxrO/Uw/xeuFeGsti7pKk
|
17
|
+
gqsFV0PzfrlbKXnL2EMpyOYIf7T5bd5ScWL6+59pPujPZ1XiPrcffGWJ6jFUghqu
|
18
|
+
e7isM8r+byAUEM+q/AM10i51YeB/MqRi9Y00iFnOUvwJ1z+VH43f0Vnhha+Z8OQe
|
19
|
+
Xl5ibB5lCx2mQZ5NfYAdaRNHWP9LZVTyG1lq8X47EAc2cebz6CqsJ9w+UL02hcYC
|
20
|
+
5byP50MfiWNpk24MsNJWPp01wuTrz90W3m/jubw+86uMQfl8ibjkqA4tZSGMHimv
|
21
|
+
EqI6QYZTF09Zxuh4eFnTU06gACxOqqdcJQ+wKa7LFVNWsbvt4bo2DzFTTa7BmnAI
|
22
|
+
wS0In0hv4nEdgIk00vdkryldtFwqNL1QLFjfAghQ+HAZa6c04N1oS5TD+LdCPARL
|
23
|
+
2k0E1uJa4mDxk3hYlDxzZDuLdvc2YKBzWnho4oq+TMONtVZF/chbm0jdF4UJocF2
|
24
|
+
EcIUUi5iXwtQCcI+qOLh3uQV1M9UYDSLZfgnoTKjRML66KcDmlnHLUp00FToc2Gs
|
25
|
+
qUImOmOncozeAe/uBJAiDkPe1A7ia4DgOyGtk8lsYMRtVOJ8apjpmHy/BD28snxC
|
26
|
+
jAORGx4SpqJu7bQKiBKDe5ZR3c8HDqBaLtoPabvBiykEvPq/PH1zotZYD0lOpvgG
|
27
|
+
QDA1t/YXzSygjTR8U1inTJ2fxG5Iksjrq1R9GR/B3T+m79aYLADAS9Hvl7yDW8QQ
|
28
|
+
TDu+RQsQnzO9LjWMBrsyq9nEi0fvNNTlxOQf28nlLFHPVIaaxF4N14YPd86vNtcy
|
29
|
+
pBmOFpsyBiZbnY+R0ti9uJbMHdr14fsTWV6dsOF4FDerDEk6ajcXpA==
|
30
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1 @@
|
|
1
|
+
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw56wRLwoHYzEHSZtf4e/34Jc2v1mhTZuIjNzCbhKyFS6JzsGl5Hzq0gsV1spVw+l0HW725z0wZST+AeNdcgBmm5CBl4153jTT8eZ7uqVC1PCzp16TwpYeBdxvVJGhgXFJCy0qmlPkBB6/tq/KWDIUJVE3V2U5QEyC88v2tZSqxtzRkHms2+ZG/eUydWFsNRSCNqUZ/L6H9Iqi3xZl1xmYt/JeCtgNe7eh721LMfWfD9xg2ekTmBBEeCOCIL1+0i9duK9Rsn5H3pOvekEdCHhge3OelYTP9z/trJievJ96ViJUjLppV6OO7Oog0UzaMgi2HMNy9WGgtJ5TTuBLM5KmQ== grahamhughes@kyuzo.local
|
@@ -0,0 +1,110 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright: Copyright (c) 2010-2011 RightScale, Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# 'Software'), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
18
|
+
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
19
|
+
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
20
|
+
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
21
|
+
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
25
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'right_scraper', 'repositories', 'mock'))
|
26
|
+
|
27
|
+
describe RightScraper::Repositories::Git do
|
28
|
+
include RightScraper::SpecHelpers::DevelopmentModeEnvironment
|
29
|
+
|
30
|
+
shared_examples_for 'git repository for hashing' do
|
31
|
+
it 'should have the same repository hash with or without credentials' do
|
32
|
+
initial_hash = @repo.repository_hash
|
33
|
+
@repo.first_credential = nil
|
34
|
+
@repo.repository_hash.should == initial_hash
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should have the same checkout hash with or without credentials' do
|
38
|
+
initial_hash = @repo.checkout_hash
|
39
|
+
@repo.first_credential = nil
|
40
|
+
@repo.checkout_hash.should == initial_hash
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should have a different checkout hash from repository hash' do
|
44
|
+
@repo.repository_hash.should_not == @repo.checkout_hash
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should have the same repository hash regardless of tag' do
|
48
|
+
initial_hash = @repo.repository_hash
|
49
|
+
@repo.tag = 'bar'
|
50
|
+
@repo.repository_hash.should == initial_hash
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should have different checkout hashes as tags change' do
|
54
|
+
initial_hash = @repo.checkout_hash
|
55
|
+
@repo.tag = 'bar'
|
56
|
+
@repo.checkout_hash.should_not == initial_hash
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with an HTTP scheme' do
|
61
|
+
before(:each) do
|
62
|
+
@repo = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
63
|
+
:repo_type => :git,
|
64
|
+
:url => "http://foo.bar.baz.quux/%20CBLAH",
|
65
|
+
:tag => 'foo',
|
66
|
+
:first_credential => "foo:b/ar")
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should have a checkout hash' do
|
70
|
+
@repo.checkout_hash.should ==
|
71
|
+
Digest::SHA1.hexdigest("1\000git\000http://foo.bar.baz.quux/%20CBLAH\000foo")
|
72
|
+
end
|
73
|
+
|
74
|
+
it_should_behave_like 'git repository for hashing'
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with a git scheme' do
|
78
|
+
before(:each) do
|
79
|
+
@repo = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
80
|
+
:repo_type => :git,
|
81
|
+
:url => "git://foo.bar.baz.quux/%20CBLAH",
|
82
|
+
:tag => 'foo',
|
83
|
+
:first_credential => "foo:b/ar")
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should have a checkout hash' do
|
87
|
+
@repo.checkout_hash.should ==
|
88
|
+
Digest::SHA1.hexdigest("1\000git\000git://foo.bar.baz.quux/%20CBLAH\000foo")
|
89
|
+
end
|
90
|
+
|
91
|
+
it_should_behave_like 'git repository for hashing'
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'with an ssh-type scheme' do
|
95
|
+
before(:each) do
|
96
|
+
@repo = RightScraper::Repositories::Base.from_hash(:display_name => 'test repo',
|
97
|
+
:repo_type => :git,
|
98
|
+
:url => "foo@bar.baz.quux:/%20CBLAH",
|
99
|
+
:tag => 'foo',
|
100
|
+
:first_credential => "foo:b/ar")
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should have a checkout hash' do
|
104
|
+
@repo.checkout_hash.should ==
|
105
|
+
Digest::SHA1.hexdigest("1\000git\000foo@bar.baz.quux:/%20CBLAH\000foo")
|
106
|
+
end
|
107
|
+
|
108
|
+
it_should_behave_like 'git repository for hashing'
|
109
|
+
end
|
110
|
+
end
|