capistrano-strategy-copy-partial 0.0.1
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +17 -0
- data/Rakefile +1 -0
- data/capistrano-strategy-copy-partial.gemspec +21 -0
- data/lib/capistrano-strategy-copy-partial.rb +3 -0
- data/lib/capistrano-strategy-copy-partial/version.rb +3 -0
- data/lib/capistrano/recipes/deploy/strategy/copy_partial.rb +116 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# capistrano-strategy-copy-partial
|
2
|
+
|
3
|
+
capistrano-strategy-copy-partial is [capistrano](https://github.com/capistrano/capistrano) extension that add strategy for deploy only part (subdirectory) of repository
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add to `Gemfile`:
|
8
|
+
|
9
|
+
gem "capistrano-strategy-copy-partial"
|
10
|
+
|
11
|
+
## Configuration
|
12
|
+
|
13
|
+
Use next options:
|
14
|
+
|
15
|
+
set :deploy_via, :copy_partial
|
16
|
+
set :copy_partial, "path/for/deploy"
|
17
|
+
set :copy_strategy, :export
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "capistrano-strategy-copy-partial"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "capistrano-strategy-copy-partial"
|
7
|
+
s.version = CapistranoStrategyCopyPartial::VERSION
|
8
|
+
s.authors = ["Maxim Bondaruk"]
|
9
|
+
s.email = ["maxim.bondaruk@railsware.com"]
|
10
|
+
s.homepage = "http://github.com/railsware/capistrano-strategy-copy-partial"
|
11
|
+
s.summary = %q{Capistrano deploy strategy to transfer subdirectory of repository}
|
12
|
+
|
13
|
+
s.rubyforge_project = "capistrano-strategy-copy-partial"
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_runtime_dependency "capistrano", ">=2.5.5"
|
21
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'capistrano/recipes/deploy/strategy/copy'
|
2
|
+
require 'tempfile' # Dir.tmpdir
|
3
|
+
|
4
|
+
class Capistrano::Deploy::Strategy::CopyPartial < Capistrano::Deploy::Strategy::Copy
|
5
|
+
|
6
|
+
#
|
7
|
+
# set :copy_partial, 'subdir/of/project'
|
8
|
+
#
|
9
|
+
def deploy!
|
10
|
+
if copy_cache
|
11
|
+
if File.exists?(copy_cache)
|
12
|
+
logger.debug "refreshing local cache to revision #{revision} at #{copy_cache}"
|
13
|
+
system(source.sync(revision, copy_cache))
|
14
|
+
else
|
15
|
+
logger.debug "preparing local cache at #{copy_cache}"
|
16
|
+
system(source.checkout(revision, copy_cache))
|
17
|
+
end
|
18
|
+
|
19
|
+
logger.debug "copying cache to deployment staging area #{destination}"
|
20
|
+
Dir.chdir(copy_cache) do
|
21
|
+
FileUtils.mkdir_p(destination)
|
22
|
+
queue = Dir.glob("*", File::FNM_DOTMATCH)
|
23
|
+
while queue.any?
|
24
|
+
item = queue.shift
|
25
|
+
name = File.basename(item)
|
26
|
+
|
27
|
+
next if name == "." || name == ".."
|
28
|
+
next if copy_exclude.any? { |pattern| File.fnmatch(pattern, item) }
|
29
|
+
|
30
|
+
if File.symlink?(item)
|
31
|
+
FileUtils.ln_s(File.readlink(File.join(copy_cache, item)), File.join(destination, item))
|
32
|
+
elsif File.directory?(item)
|
33
|
+
queue += Dir.glob("#{item}/*", File::FNM_DOTMATCH)
|
34
|
+
FileUtils.mkdir(File.join(destination, item))
|
35
|
+
else
|
36
|
+
FileUtils.ln(File.join(copy_cache, item), File.join(destination, item))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
logger.debug "getting (via #{copy_strategy}) revision #{revision} to #{destination}"
|
42
|
+
system(command)
|
43
|
+
|
44
|
+
if copy_exclude.any?
|
45
|
+
logger.debug "processing exclusions..."
|
46
|
+
if copy_exclude.any?
|
47
|
+
copy_exclude.each do |pattern|
|
48
|
+
delete_list = Dir.glob(File.join(destination, pattern), File::FNM_DOTMATCH)
|
49
|
+
# avoid the /.. trap that deletes the parent directories
|
50
|
+
delete_list.delete_if { |dir| dir =~ /\/\.\.$/ }
|
51
|
+
FileUtils.rm_rf(delete_list.compact)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
File.open(File.join(destination_partial, "REVISION"), "w") { |f| f.puts(revision) }
|
58
|
+
|
59
|
+
logger.trace "compressing #{destination_partial} to #{filename}"
|
60
|
+
Dir.chdir(copy_dir) { system(compress(File.basename(destination), File.basename(filename), copy_partial).join(" ")) }
|
61
|
+
|
62
|
+
upload(filename, remote_filename)
|
63
|
+
if compression.partial_command && !copy_partial.empty?
|
64
|
+
run "cd #{configuration[:releases_path]} && mkdir #{File.basename(destination)} && cd #{File.basename(destination)} && #{decompress(remote_filename).join(" ")} && rm #{remote_filename}"
|
65
|
+
else
|
66
|
+
run "cd #{configuration[:releases_path]} && #{decompress(remote_filename).join(" ")} && rm #{remote_filename}"
|
67
|
+
end
|
68
|
+
ensure
|
69
|
+
FileUtils.rm filename rescue nil
|
70
|
+
FileUtils.rm_rf destination rescue nil
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def copy_partial
|
76
|
+
@copy_partial ||= configuration.fetch(:copy_partial, '')
|
77
|
+
end
|
78
|
+
|
79
|
+
def destination_partial
|
80
|
+
@destination_partial ||= File.join(destination, copy_partial)
|
81
|
+
end
|
82
|
+
|
83
|
+
# A struct for representing the specifics of a compression type.
|
84
|
+
# Commands are arrays, where the first element is the utility to be
|
85
|
+
# used to perform the compression or decompression.
|
86
|
+
Compression = Struct.new(:extension, :compress_command, :decompress_command, :partial_command)
|
87
|
+
|
88
|
+
# The compression method to use, defaults to :gzip.
|
89
|
+
def compression
|
90
|
+
type = configuration[:copy_compression] || :gzip
|
91
|
+
case type
|
92
|
+
when :gzip, :gz then Compression.new("tar.gz", %w(tar czf), %w(tar xzf), "-C")
|
93
|
+
when :bzip2, :bz2 then Compression.new("tar.bz2", %w(tar cjf), %w(tar xjf), "-C")
|
94
|
+
when :zip then Compression.new("zip", %w(zip -qr), %w(unzip -q), nil)
|
95
|
+
else raise ArgumentError, "invalid compression type #{type.inspect}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns the command necessary to compress the given directory
|
100
|
+
# into the given file.
|
101
|
+
def compress(directory, file, partial_dir='')
|
102
|
+
if compression.partial_command && !partial_dir.empty?
|
103
|
+
compression.compress_command + [file, compression.partial_command, "#{directory}/#{partial_dir}", './']
|
104
|
+
else
|
105
|
+
compression.compress_command + [file, directory]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the command necessary to decompress the given file,
|
110
|
+
# relative to the current working directory. It must also
|
111
|
+
# preserve the directory structure in the file.
|
112
|
+
def decompress(file)
|
113
|
+
compression.decompress_command + [file]
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-strategy-copy-partial
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Maxim Bondaruk
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-12-20 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: capistrano
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 17
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 5
|
33
|
+
- 5
|
34
|
+
version: 2.5.5
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description:
|
38
|
+
email:
|
39
|
+
- maxim.bondaruk@railsware.com
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files: []
|
45
|
+
|
46
|
+
files:
|
47
|
+
- .gitignore
|
48
|
+
- Gemfile
|
49
|
+
- README.md
|
50
|
+
- Rakefile
|
51
|
+
- capistrano-strategy-copy-partial.gemspec
|
52
|
+
- lib/capistrano-strategy-copy-partial.rb
|
53
|
+
- lib/capistrano-strategy-copy-partial/version.rb
|
54
|
+
- lib/capistrano/recipes/deploy/strategy/copy_partial.rb
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: http://github.com/railsware/capistrano-strategy-copy-partial
|
57
|
+
licenses: []
|
58
|
+
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
hash: 3
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 3
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
version: "0"
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project: capistrano-strategy-copy-partial
|
85
|
+
rubygems_version: 1.6.2
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: Capistrano deploy strategy to transfer subdirectory of repository
|
89
|
+
test_files: []
|
90
|
+
|