right_scraper 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,6 +39,10 @@ module RightScale
39
39
  # Not used for 'download' repositories
40
40
  attr_accessor :tag
41
41
 
42
+ # (Array) List of directories containing cookbooks in repository
43
+ # Root directory is used if this is nil or empty
44
+ attr_accessor :cookbooks_path
45
+
42
46
  # (String) Optional, SVN username or git private SSH key content
43
47
  attr_accessor :first_credential
44
48
 
@@ -33,10 +33,24 @@ module RightScale
33
33
  # false:: Otherwise
34
34
  def incremental_update?
35
35
  return false unless File.directory?(@current_repo_dir)
36
- Dir.chdir(@current_repo_dir) do
37
- info = `svn info`
38
- $?.success? && info =~ (/^URL: (.*)$/) && $1 == @repo.url
36
+ inc = false
37
+ cookbooks_path = repo.cookbooks_path || []
38
+ cookbooks_path = [ cookbooks_path ] unless cookbooks_path.is_a?(Array)
39
+ if cookbooks_path.empty?
40
+ Dir.chdir(@current_repo_dir) do
41
+ info = `svn info`
42
+ inc = $?.success? && info =~ (/^URL: (.*)$/) && $1 == @repo.url
43
+ end
44
+ else
45
+ cookbooks_path.each do |path|
46
+ Dir.chdir(File.join(@current_repo_dir, path)) do
47
+ info = `svn info`
48
+ inc = $?.success? && info =~ (/^URL: (.*)$/) && $1 == File.join(@repo.url, path)
49
+ break unless inc
50
+ end
51
+ end
39
52
  end
53
+ inc
40
54
  end
41
55
 
42
56
  # Scrape SVN repository, see RightScale::Scraper#scrape
@@ -47,27 +61,57 @@ module RightScale
47
61
  msg = @incremental ? "Updating " : "Checking out "
48
62
  msg += "SVN repository '#{@repo.display_name}'"
49
63
  @callback.call(msg, is_step=true) if @callback
64
+ cookbooks_path = repo.cookbooks_path || []
65
+ cookbooks_path = [ cookbooks_path ] unless cookbooks_path.is_a?(Array)
50
66
  if @incremental
51
67
  svn_cmd = "svn update --no-auth-cache --non-interactive --quiet" +
52
68
  (@repo.first_credential ? " --username #{@repo.first_credential}" : '') +
53
69
  (@repo.second_credential ? " --password #{@repo.second_credential}" : '') +
54
70
  ' 2>&1'
55
- Dir.chdir(@current_repo_dir) do
56
- res = @watcher.launch_and_watch(svn_cmd, @current_repo_dir)
57
- handle_watcher_result(res, 'SVN update', update=true)
71
+ if cookbooks_path.empty?
72
+ Dir.chdir(@current_repo_dir) do
73
+ res = @watcher.launch_and_watch(svn_cmd, @current_repo_dir)
74
+ handle_watcher_result(res, 'SVN update', update=true)
75
+ end
76
+ else
77
+ cookbooks_path.each do |path|
78
+ break unless succeeded?
79
+ full_path = File.join(@current_repo_dir, path)
80
+ Dir.chdir(full_path) do
81
+ res = @watcher.launch_and_watch(svn_cmd, @current_repo_dir)
82
+ handle_watcher_result(res, 'SVN update', update=true)
83
+ end
84
+ end
58
85
  end
59
86
  end
60
87
  if !@incremental && succeeded?
61
- svn_cmd = "svn checkout \"#{@repo.url}\" \"#{@current_repo_dir}\" --no-auth-cache --non-interactive --quiet" +
62
- (!@repo.tag.nil? && !@repo.tag.empty? ? " --revision #{@repo.tag}" : '') +
63
- (@repo.first_credential ? " --username #{@repo.first_credential}" : '') +
64
- (@repo.second_credential ? " --password #{@repo.second_credential}" : '') +
65
- ' 2>&1'
66
- res = @watcher.launch_and_watch(svn_cmd, @current_repo_dir)
67
- handle_watcher_result(res, 'SVN checkout', update=false)
88
+ if cookbooks_path.empty?
89
+ res = @watcher.launch_and_watch(svn_checkout_cmd, @current_repo_dir)
90
+ handle_watcher_result(res, 'SVN checkout', update=false)
91
+ else
92
+ cookbooks_path.each do |path|
93
+ break unless succeeded?
94
+ res = @watcher.launch_and_watch(svn_checkout_cmd(path), @current_repo_dir)
95
+ handle_watcher_result(res, 'SVN checkout', update=false)
96
+ end
97
+ end
68
98
  end
69
99
  true
70
100
  end
71
101
 
102
+ # SVN checkout command using current repo definition and given path into it
103
+ #
104
+ # === Parameters
105
+ # path(String):: Relative path inside repo that should be checked out
106
+ #
107
+ # === Return
108
+ # svn_cmd(String):: Corresponding SVN command line
109
+ def svn_checkout_cmd(path='')
110
+ svn_cmd = "svn checkout \"#{File.join(@repo.url, path)}\" \"#{File.join(@current_repo_dir, path)}\" --no-auth-cache --non-interactive --quiet" +
111
+ (!@repo.tag.nil? && !@repo.tag.empty? ? " --revision #{@repo.tag}" : '') +
112
+ (@repo.first_credential ? " --username #{@repo.first_credential}" : '') +
113
+ (@repo.second_credential ? " --password #{@repo.second_credential}" : '') +
114
+ ' 2>&1'
115
+ end
72
116
  end
73
117
  end
@@ -82,7 +82,7 @@ module RightScale
82
82
 
83
83
  # Run external process and monitor it in a new thread, platform specific
84
84
  pid = monitor.spawn(cmd) do |data|
85
- output << data[:output] if data.include?(:output)
85
+ output << data[:output] if data[:output]
86
86
  exit_code = data[:exit_code] if data.include?(:exit_code)
87
87
  end
88
88
 
@@ -23,7 +23,7 @@ require 'rubygems'
23
23
 
24
24
  spec = Gem::Specification.new do |spec|
25
25
  spec.name = 'right_scraper'
26
- spec.version = '1.0.11'
26
+ spec.version = '1.0.12'
27
27
  spec.authors = ['Raphael Simon']
28
28
  spec.email = 'raphael@rightscale.com'
29
29
  spec.homepage = 'https://github.com/rightscale/right_scraper'
@@ -70,6 +70,7 @@ describe RightScale::DownloadScraper do
70
70
  @repo = RightScale::Repository.from_hash(:display_name => 'test repo',
71
71
  :repo_type => :download,
72
72
  :url => "file:///#{@download_file}")
73
+ FileUtils.rm_rf(RightScale::ScraperBase.repo_dir(@repo_path, @repo))
73
74
  end
74
75
 
75
76
  after(:all) do
@@ -82,7 +83,7 @@ describe RightScale::DownloadScraper do
82
83
  puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
83
84
  @scraper.succeeded?.should be_true
84
85
  messages.size.should == 1
85
- File.directory?(@scraper.current_repo_dir.should be_true)
86
+ File.directory?(@scraper.current_repo_dir).should be_true
86
87
  extract_file_layout(@scraper.current_repo_dir).should == @repo_content
87
88
  end
88
89
 
@@ -75,6 +75,7 @@ describe RightScale::GitScraper do
75
75
  @repo = RightScale::Repository.from_hash(:display_name => 'test repo',
76
76
  :repo_type => :git,
77
77
  :url => @origin_path)
78
+ FileUtils.rm_rf(RightScale::ScraperBase.repo_dir(@repo_path, @repo))
78
79
  end
79
80
 
80
81
  after(:all) do
@@ -87,7 +88,7 @@ describe RightScale::GitScraper do
87
88
  puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
88
89
  @scraper.succeeded?.should be_true
89
90
  messages.size.should == 1
90
- File.directory?(@scraper.current_repo_dir.should be_true)
91
+ File.directory?(@scraper.current_repo_dir).should be_true
91
92
  extract_file_layout(@scraper.current_repo_dir, [ '.git', '.ssh' ]).should == @repo_content
92
93
  end
93
94
 
@@ -100,7 +101,7 @@ describe RightScale::GitScraper do
100
101
  puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
101
102
  @scraper.succeeded?.should be_true
102
103
  messages.size.should == 1
103
- File.directory?(@scraper.current_repo_dir.should be_true)
104
+ File.directory?(@scraper.current_repo_dir).should be_true
104
105
  extract_file_layout(@scraper.current_repo_dir, [ '.git', '.ssh' ]).should == @repo_content
105
106
  end
106
107
 
@@ -37,7 +37,9 @@ describe RightScale::SvnScraper do
37
37
  def setup_svn_repo
38
38
  @svn_repo_path = File.expand_path(File.join(File.dirname(__FILE__), '__svn_repo'))
39
39
  @repo_path = File.join(File.dirname(__FILE__), '__repo')
40
- @repo_content = [ 'file1', { 'folder1' => [ 'file2', 'file3' ] }, { 'folder2' => [ { 'folder3' => [ 'file4' ] } ] } ]
40
+ @repo_content = [ 'file1', { 'folder1' => [ 'file2', 'file3' ] },
41
+ { 'folder2' => [ { 'folder3' => [ 'file4' ] },
42
+ { 'folder5' => [ 'file6' ] } ] } ]
41
43
  FileUtils.rm_rf(@svn_repo_path)
42
44
  res, status = exec("svnadmin create \"#{@svn_repo_path}\"")
43
45
  raise "Failed to initialize SVN repository: #{res}" unless status.success?
@@ -73,6 +75,7 @@ describe RightScale::SvnScraper do
73
75
  @repo = RightScale::Repository.from_hash(:display_name => 'test repo',
74
76
  :repo_type => :svn,
75
77
  :url => "#{file_prefix}#{@svn_repo_path}")
78
+ FileUtils.rm_rf(RightScale::ScraperBase.repo_dir(@repo_path, @repo))
76
79
  end
77
80
 
78
81
  after(:all) do
@@ -85,7 +88,7 @@ describe RightScale::SvnScraper do
85
88
  puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
86
89
  @scraper.succeeded?.should be_true
87
90
  messages.size.should == 1
88
- File.directory?(@scraper.current_repo_dir.should be_true)
91
+ File.directory?(@scraper.current_repo_dir).should be_true
89
92
  extract_file_layout(@scraper.current_repo_dir, [ '.svn' ]).should == @repo_content
90
93
  end
91
94
 
@@ -99,10 +102,36 @@ describe RightScale::SvnScraper do
99
102
  puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
100
103
  @scraper.succeeded?.should be_true
101
104
  messages.size.should == 1
102
- File.directory?(@scraper.current_repo_dir.should be_true)
105
+ File.directory?(@scraper.current_repo_dir).should be_true
103
106
  extract_file_layout(@scraper.current_repo_dir, [ '.svn' ]).should == @repo_content
104
107
  end
105
108
 
109
+ it 'should only scrape cookbooks directories' do
110
+ messages = []
111
+ @repo.cookbooks_path = [ 'folder1', File.join('folder2', 'folder3') ]
112
+ @scraper.scrape(@repo) { |m, progress| messages << m if progress }
113
+ puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
114
+ @scraper.succeeded?.should be_true
115
+ messages.size.should == 1
116
+ File.directory?(@scraper.current_repo_dir).should be_true
117
+ extract_file_layout(@scraper.current_repo_dir, [ '.svn' ]).should == [ { 'folder1' => [ 'file2', 'file3' ] }, { 'folder2' => ['folder3' => [ 'file4' ] ] } ]
118
+ end
119
+
120
+ it 'should only scrape cookbooks directories incrementally' do
121
+ pending "File URLs comparison on Windows is tricky" if RUBY_PLATFORM=~/mswin/
122
+ @repo.cookbooks_path = [ 'folder1', File.join('folder2', 'folder3') ]
123
+ @scraper.scrape(@repo)
124
+ puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
125
+ @scraper.incremental_update?.should be_true
126
+ messages = []
127
+ @scraper.scrape(@repo) { |m, progress| messages << m if progress }
128
+ puts "\n **ERRORS: #{@scraper.errors.join("\n")}\n" unless @scraper.succeeded?
129
+ @scraper.succeeded?.should be_true
130
+ messages.size.should == 1
131
+ File.directory?(@scraper.current_repo_dir).should be_true
132
+ extract_file_layout(@scraper.current_repo_dir, [ '.svn' ]).should == [ { 'folder1' => [ 'file2', 'file3' ] }, { 'folder2' => ['folder3' => [ 'file4' ] ] } ]
133
+ end
134
+
106
135
  end
107
136
 
108
137
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: right_scraper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.11
4
+ version: 1.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Raphael Simon
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-28 00:00:00 -08:00
12
+ date: 2010-03-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15