capistrano_rsync_with_remote_cache 2.3.4 → 2.3.5

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.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ /pkg/
2
+ /doc/
3
+ /coverage/
4
+ *.gem
5
+ .yardoc
data/README.rdoc CHANGED
@@ -6,9 +6,9 @@ This gem provides a deployment strategy for Capistrano which combines rsync with
6
6
 
7
7
  This gem requires Capistrano 2.0.0 or higher. Git support requires Capistrano 2.1.0 or higher.
8
8
 
9
- This gem has only been tested with Subversion and Git. It is unlikely to be supported for other SCM systems.
9
+ This gem supports Subversion, Git, Mercurial and Bazaar. Only Subversion and Git have been extensively tested. This gem is unlikely to be supported for other SCM systems.
10
10
 
11
- This gem requires <tt>rsync</tt> command line utilities on the local and remote hosts. It also requires either <tt>svn</tt> or <tt>git</tt> on the local host, but not the remote host.
11
+ This gem requires <tt>rsync</tt> command line utilities on the local and remote hosts. It also requires either <tt>svn</tt>, <tt>git</tt>, <tt>hg</tt> or <hg>bzr</hg> on the local host, but not the remote host.
12
12
 
13
13
  This gem is tested on Mac OS X and Linux. Windows is not tested or supported.
14
14
 
data/Rakefile CHANGED
@@ -12,18 +12,21 @@ begin
12
12
  gem.authors = ["Mark Cornick"]
13
13
  gem.rubyforge_project = "viget"
14
14
  gem.add_dependency 'capistrano', '>= 2.0'
15
-
16
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
16
  end
17
+
18
+ Jeweler::RubyforgeTasks.new do |rubyforge|
19
+ rubyforge.doc_task = "yardoc"
20
+ end
18
21
  rescue LoadError
19
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
22
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
20
23
  end
21
24
 
22
25
  require 'rake/testtask'
23
26
  Rake::TestTask.new(:test) do |test|
24
27
  test.libs << 'lib' << 'test'
25
28
  test.pattern = 'test/**/*_test.rb'
26
- test.verbose = false
29
+ test.verbose = true
27
30
  end
28
31
 
29
32
  begin
@@ -36,50 +39,42 @@ begin
36
39
  end
37
40
  rescue LoadError
38
41
  task :rcov do
39
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
42
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install relevance-rcov"
40
43
  end
41
44
  end
42
45
 
43
-
44
- task :default => :test
45
-
46
- require 'rake/rdoctask'
47
- Rake::RDocTask.new do |rdoc|
48
- if File.exist?('VERSION.yml')
49
- config = YAML.load(File.read('VERSION.yml'))
50
- version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
51
- else
52
- version = ""
46
+ begin
47
+ require 'reek/rake_task'
48
+ Reek::RakeTask.new do |t|
49
+ t.fail_on_error = true
50
+ t.verbose = false
51
+ t.source_files = 'lib/**/*.rb'
52
+ end
53
+ rescue LoadError
54
+ task :reek do
55
+ abort "Reek is not available. In order to run reek, you must: sudo gem install reek"
53
56
  end
54
-
55
- rdoc.rdoc_dir = 'rdoc'
56
- rdoc.title = "capistrano_rsync_with_remote_cache #{version}"
57
- rdoc.rdoc_files.include('README*')
58
- rdoc.rdoc_files.include('lib/**/*.rb')
59
57
  end
60
58
 
61
59
  begin
62
- require 'rake/contrib/sshpublisher'
63
- namespace :rubyforge do
64
-
65
- desc "Release gem and RDoc documentation to RubyForge"
66
- task :release => ["rubyforge:release:gem"]
67
-
68
- namespace :release do
69
- desc "Publish RDoc to RubyForge."
70
- task :docs => [:rdoc] do
71
- config = YAML.load(
72
- File.read(File.expand_path('~/.rubyforge/user-config.yml'))
73
- )
60
+ require 'roodi'
61
+ require 'roodi_task'
62
+ RoodiTask.new do |t|
63
+ t.verbose = false
64
+ end
65
+ rescue LoadError
66
+ task :roodi do
67
+ abort "Roodi is not available. In order to run roodi, you must: sudo gem install roodi"
68
+ end
69
+ end
74
70
 
75
- host = "#{config['username']}@rubyforge.org"
76
- remote_dir = "/var/www/gforge-projects/capistrano_rsync_with_remote_cache/"
77
- local_dir = 'rdoc'
71
+ task :default => :test
78
72
 
79
- Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
80
- end
81
- end
82
- end
73
+ begin
74
+ require 'yard'
75
+ YARD::Rake::YardocTask.new
83
76
  rescue LoadError
84
- puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
77
+ task :yardoc do
78
+ abort "Yard is not available. In order to run yardoc, you must: sudo gem install yard"
79
+ end
85
80
  end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.3.5
@@ -0,0 +1,55 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{capistrano_rsync_with_remote_cache}
8
+ s.version = "2.3.5"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Mark Cornick"]
12
+ s.date = %q{2009-08-07}
13
+ s.description = %q{A deployment strategy for Capistrano 2.0 which combines rsync with a remote cache, allowing fast deployments from SCM servers behind firewalls.}
14
+ s.email = %q{mark@viget.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "capistrano_rsync_with_remote_cache.gemspec",
27
+ "lib/capistrano/recipes/deploy/strategy/exceptions.reek",
28
+ "lib/capistrano/recipes/deploy/strategy/rsync_with_remote_cache.rb",
29
+ "test/capistrano_rsync_with_remote_cache_test.rb",
30
+ "test/test_helper.rb"
31
+ ]
32
+ s.homepage = %q{http://github.com/vigetlabs/capistrano_rsync_with_remote_cache}
33
+ s.rdoc_options = ["--charset=UTF-8"]
34
+ s.require_paths = ["lib"]
35
+ s.rubyforge_project = %q{viget}
36
+ s.rubygems_version = %q{1.3.4}
37
+ s.summary = %q{rsync_with_remote_cache strategy for Capistrano}
38
+ s.test_files = [
39
+ "test/capistrano_rsync_with_remote_cache_test.rb",
40
+ "test/test_helper.rb"
41
+ ]
42
+
43
+ if s.respond_to? :specification_version then
44
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
+ s.specification_version = 3
46
+
47
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
48
+ s.add_runtime_dependency(%q<capistrano>, [">= 2.0"])
49
+ else
50
+ s.add_dependency(%q<capistrano>, [">= 2.0"])
51
+ end
52
+ else
53
+ s.add_dependency(%q<capistrano>, [">= 2.0"])
54
+ end
55
+ end
@@ -0,0 +1,15 @@
1
+ ---
2
+ Duplication:
3
+ exclude:
4
+ - check!
5
+ - command
6
+ - deploy!
7
+ - rsync_host
8
+ - remove_cache_if_repo_changed
9
+
10
+ FeatureEnvy:
11
+ exclude:
12
+ - check!
13
+
14
+ LongMethod:
15
+ max_statements: 10
@@ -6,13 +6,20 @@ module Capistrano
6
6
  module Strategy
7
7
  class RsyncWithRemoteCache < Remote
8
8
 
9
+ INFO_COMMANDS = {
10
+ :subversion => "svn info . | sed -n \'s/URL: //p\'",
11
+ :git => "git config remote.origin.url",
12
+ :mercurial => "hg showconfig paths.default",
13
+ :bzr => "bzr info | grep parent | sed \'s/^.*parent branch: //\'"
14
+ }
15
+
9
16
  # The deployment method itself, in three major steps: update the local cache, update the remote
10
17
  # cache, and copy the remote cache into place.
11
18
  def deploy!
12
19
 
13
20
  # Step 1: Update the local cache.
14
21
  system(command)
15
- File.open(File.join(local_cache, "REVISION"), "w") { |f| f.puts(revision) }
22
+ File.open(File.join(local_cache, "REVISION"), "w") { |file| file.puts(revision) }
16
23
 
17
24
  # Step 2: Update the remote cache.
18
25
  logger.trace "copying local cache to remote"
@@ -28,10 +35,10 @@ module Capistrano
28
35
  # on the local end, and rsync on both ends. Note that the SCM command is not needed on the
29
36
  # remote end.
30
37
  def check!
31
- super.check do |d|
32
- d.local.command(source.command)
33
- d.local.command('rsync')
34
- d.remote.command('rsync')
38
+ super.check do |check|
39
+ check.local.command(source.command)
40
+ check.local.command('rsync')
41
+ check.remote.command('rsync')
35
42
  end
36
43
  end
37
44
 
@@ -63,41 +70,34 @@ module Capistrano
63
70
  end
64
71
  end
65
72
 
66
- # Command to get source from SCM on the local side. If the local_cache directory exists,
67
- # we check to see if it's an SCM checkout that matches the currently configured repository.
68
- # If it matches, we update it. If it doesn't match (either it's for another repository or
69
- # not a checkout at all), we remove the directory and recreate it with a fresh SCM checkout.
70
- # If the directory doesn't exist, we create it with a fresh SCM checkout.
73
+ # Remove the local cache (so it can be recreated) if the repository URL has changed
74
+ # since the last deployment.
71
75
  # TODO: punt in some sensible way if local_cache exists but is a regular file.
72
- def command
73
- case configuration[:scm].to_s
74
- when 'subversion'
75
- info_command = "svn info #{local_cache} | sed -n 's/URL: //p'"
76
- when 'git'
77
- info_command = "cd #{local_cache} && git config remote.origin.url"
78
- else
79
- # an effective no-op
80
- info_command = "echo #{configuration[:repository]}"
81
- end
82
- cache_info = IO.popen(info_command)
83
-
84
- cached_repository = cache_info.gets
85
- cache_info.close
86
- if cached_repository && cached_repository.chomp != configuration[:repository]
87
- logger.trace "repository has changed; removing old local cache"
88
- FileUtils.rm_rf local_cache
76
+ def remove_cache_if_repo_changed
77
+ if INFO_COMMANDS[configuration[:scm]] && File.directory?(local_cache)
78
+ info_command = "cd #{local_cache} && #{INFO_COMMANDS[configuration[:scm]]}"
79
+ cached_repo_url = IO.popen(info_command){|pipe| pipe.readline}.chomp
80
+ if cached_repo_url != configuration[:repository]
81
+ logger.trace "repository has changed; removing old local cache"
82
+ FileUtils.rm_rf(local_cache)
83
+ end
89
84
  end
85
+ end
90
86
 
87
+ # Command to get source from SCM on the local side. The local cache is either created,
88
+ # updated, or destroyed and recreated depending on whether it exists and is a cache of
89
+ # the right repository.
90
+ def command
91
+ remove_cache_if_repo_changed
91
92
  if File.exists?(local_cache) && File.directory?(local_cache)
92
93
  logger.trace "updating local cache to revision #{revision}"
93
- cmd = source.sync(revision, local_cache)
94
+ return source.sync(revision, local_cache)
94
95
  else
95
96
  logger.trace "creating local cache with revision #{revision}"
96
97
  File.delete(local_cache) if File.exists?(local_cache)
97
98
  Dir.mkdir(File.dirname(local_cache)) unless File.directory?(File.dirname(local_cache))
98
- cmd = source.checkout(revision, local_cache)
99
+ return source.checkout(revision, local_cache)
99
100
  end
100
- cmd
101
101
  end
102
102
  end
103
103
  end
@@ -9,20 +9,9 @@ class CapistranoRsyncWithRemoteCacheTest < Test::Unit::TestCase
9
9
  @rwrc.expects(:configuration).at_least_once.returns(hash)
10
10
  end
11
11
 
12
- def stub_creation_of_new_local_cache
13
- File.expects(:exists?).with('.rsync_cache').times(2).returns(false)
14
- File.expects(:directory?).with(File.dirname('.rsync_cache')).returns(false)
15
- Dir.expects(:mkdir).with(File.dirname('.rsync_cache'))
16
- source_stub = stub()
17
- source_stub.expects(:checkout)
18
- @rwrc.expects(:source).returns(source_stub)
19
- end
20
-
21
- def stub_detection_of_changed_local_cache(command, returns)
22
- cache_info_stub = stub()
23
- cache_info_stub.expects(:gets).returns(returns)
24
- cache_info_stub.expects(:close)
25
- IO.expects(:popen).with(command).returns(cache_info_stub)
12
+ def stub_detection_of_changed_local_cache(command, returned)
13
+ File.expects(:directory?).with('.rsync_cache').returns(true)
14
+ IO.expects(:popen).with(command).returns(returned)
26
15
  end
27
16
 
28
17
  context 'RsyncWithRemoteCache' do
@@ -123,56 +112,66 @@ class CapistranoRsyncWithRemoteCacheTest < Test::Unit::TestCase
123
112
  end
124
113
  end
125
114
 
126
- context 'command' do
115
+ context 'remove_cache_if_repo_changed' do
127
116
  should 'purge local cache if it detects subversion info has changed' do
128
- stub_configuration(:scm => :subversion, :repository => 'repository')
129
- stub_detection_of_changed_local_cache("svn info .rsync_cache | sed -n 's/URL: //p'", "URL: url\n")
117
+ stub_configuration(:scm => :subversion, :repository => 'repository')
118
+ stub_detection_of_changed_local_cache("cd .rsync_cache && svn info . | sed -n 's/URL: //p'", "URL: url\n")
130
119
  FileUtils.expects(:rm_rf).with('.rsync_cache')
131
- stub_creation_of_new_local_cache
132
-
133
- @rwrc.send(:command)
120
+ @rwrc.send(:remove_cache_if_repo_changed)
134
121
  end
135
122
 
136
123
  should 'purge local cache if it detects git info has changed' do
137
- stub_configuration(:scm => :git, :repository => 'repository')
124
+ stub_configuration(:scm => :git, :repository => 'repository')
138
125
  stub_detection_of_changed_local_cache("cd .rsync_cache && git config remote.origin.url", "beep\n")
139
126
  FileUtils.expects(:rm_rf).with('.rsync_cache')
140
- stub_creation_of_new_local_cache
127
+ @rwrc.send(:remove_cache_if_repo_changed)
128
+ end
141
129
 
142
- @rwrc.send(:command)
130
+ should 'purge local cache if it detects hg info has changed' do
131
+ stub_configuration(:scm => :mercurial, :repository => 'repository')
132
+ stub_detection_of_changed_local_cache("cd .rsync_cache && hg showconfig paths.default", "beep\n")
133
+ FileUtils.expects(:rm_rf).with('.rsync_cache')
134
+ @rwrc.send(:remove_cache_if_repo_changed)
135
+ end
136
+
137
+ should 'purge local cache if it detects bzr info has changed' do
138
+ stub_configuration(:scm => :bzr, :repository => 'repository')
139
+ stub_detection_of_changed_local_cache("cd .rsync_cache && bzr info | grep parent | sed 's/^.*parent branch: //'", "beep\n")
140
+ FileUtils.expects(:rm_rf).with('.rsync_cache')
141
+ @rwrc.send(:remove_cache_if_repo_changed)
143
142
  end
144
143
 
145
144
  should 'not attempt to purge local cache that does not exist' do
146
- stub_configuration(:scm => :subversion, :repository => 'repository')
147
- stub_detection_of_changed_local_cache("svn info .rsync_cache | sed -n 's/URL: //p'", nil)
145
+ stub_configuration(:scm => :subversion, :repository => 'repository')
146
+ File.expects(:directory?).with('.rsync_cache').returns(false)
148
147
  FileUtils.expects(:rm_rf).with('.rsync_cache').never
149
- stub_creation_of_new_local_cache
150
-
151
- @rwrc.send(:command)
148
+ @rwrc.send(:remove_cache_if_repo_changed)
152
149
  end
153
150
 
154
151
  should 'not attempt to purge local cache if the scm is not supported by this gem' do
155
- stub_configuration(:scm => :bzr, :repository => 'repository')
156
- stub_detection_of_changed_local_cache("echo repository", "repository\n")
152
+ stub_configuration(:scm => :cvs, :repository => 'repository')
157
153
  FileUtils.expects(:rm_rf).with('.rsync_cache').never
158
- stub_creation_of_new_local_cache
159
-
160
- @rwrc.send(:command)
154
+ @rwrc.send(:remove_cache_if_repo_changed)
161
155
  end
156
+ end
162
157
 
158
+ context 'command' do
163
159
  should 'update local cache if it exists' do
164
160
  File.expects(:exists?).with('.rsync_cache').returns(true)
165
161
  File.expects(:directory?).with('.rsync_cache').returns(true)
166
162
  source_stub = stub()
167
163
  source_stub.expects(:sync)
168
164
  @rwrc.expects(:source).returns(source_stub)
169
-
170
165
  @rwrc.send(:command)
171
166
  end
172
167
 
173
168
  should 'create local cache if it does not exist' do
174
- stub_creation_of_new_local_cache
175
-
169
+ File.expects(:exists?).with('.rsync_cache').times(2).returns(false)
170
+ File.expects(:directory?).with(File.dirname('.rsync_cache')).returns(false)
171
+ Dir.expects(:mkdir).with(File.dirname('.rsync_cache'))
172
+ source_stub = stub()
173
+ source_stub.expects(:checkout)
174
+ @rwrc.expects(:source).returns(source_stub)
176
175
  @rwrc.send(:command)
177
176
  end
178
177
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano_rsync_with_remote_cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.4
4
+ version: 2.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Cornick
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-19 00:00:00 -04:00
12
+ date: 2009-08-07 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,10 +32,14 @@ extra_rdoc_files:
32
32
  - LICENSE
33
33
  - README.rdoc
34
34
  files:
35
+ - .document
36
+ - .gitignore
35
37
  - LICENSE
36
38
  - README.rdoc
37
39
  - Rakefile
38
- - VERSION.yml
40
+ - VERSION
41
+ - capistrano_rsync_with_remote_cache.gemspec
42
+ - lib/capistrano/recipes/deploy/strategy/exceptions.reek
39
43
  - lib/capistrano/recipes/deploy/strategy/rsync_with_remote_cache.rb
40
44
  - test/capistrano_rsync_with_remote_cache_test.rb
41
45
  - test/test_helper.rb
@@ -63,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
67
  requirements: []
64
68
 
65
69
  rubyforge_project: viget
66
- rubygems_version: 1.3.2
70
+ rubygems_version: 1.3.4
67
71
  signing_key:
68
72
  specification_version: 3
69
73
  summary: rsync_with_remote_cache strategy for Capistrano
data/VERSION.yml DELETED
@@ -1,4 +0,0 @@
1
- ---
2
- :major: 2
3
- :minor: 3
4
- :patch: 4