dandelion 0.2.1 → 0.2.2
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/README.md +1 -1
- data/lib/dandelion/backend.rb +1 -1
- data/lib/dandelion/backend/ftp.rb +16 -12
- data/lib/dandelion/backend/s3.rb +4 -4
- data/lib/dandelion/backend/sftp.rb +12 -12
- data/lib/dandelion/cli.rb +28 -22
- data/lib/dandelion/deployment.rb +10 -4
- data/lib/dandelion/git.rb +6 -2
- data/lib/dandelion/version.rb +1 -1
- metadata +11 -11
data/README.md
CHANGED
data/lib/dandelion/backend.rb
CHANGED
@@ -19,7 +19,7 @@ module Dandelion
|
|
19
19
|
|
20
20
|
def create(config)
|
21
21
|
Dir.glob(File.join(File.dirname(__FILE__), 'backend', '*.rb')) { |file| require file }
|
22
|
-
raise UnsupportedSchemeError unless @@backends.include?
|
22
|
+
raise UnsupportedSchemeError unless @@backends.include?(config['scheme'])
|
23
23
|
begin
|
24
24
|
@@backends[config['scheme']].new(config)
|
25
25
|
rescue LoadError
|
@@ -9,7 +9,7 @@ module Dandelion
|
|
9
9
|
require 'net/ftp'
|
10
10
|
@config = config
|
11
11
|
@ftp = Net::FTP.open(@config['host'], @config['username'], @config['password'])
|
12
|
-
@ftp.passive = true
|
12
|
+
@ftp.passive = @config['passive'].nil? ? true : to_b(@config['passive'])
|
13
13
|
@ftp.chdir(@config['path']) if @config['path']
|
14
14
|
end
|
15
15
|
|
@@ -30,18 +30,18 @@ module Dandelion
|
|
30
30
|
def write(file, data)
|
31
31
|
temp(file, data) do |temp|
|
32
32
|
begin
|
33
|
-
@ftp.putbinaryfile
|
33
|
+
@ftp.putbinaryfile(temp, file)
|
34
34
|
rescue Net::FTPPermError => e
|
35
|
-
mkdir_p
|
36
|
-
@ftp.putbinaryfile
|
35
|
+
mkdir_p(File.dirname(file))
|
36
|
+
@ftp.putbinaryfile(temp, file)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
41
|
def delete(file)
|
42
42
|
begin
|
43
|
-
@ftp.delete
|
44
|
-
cleanup
|
43
|
+
@ftp.delete(file)
|
44
|
+
cleanup(File.dirname(file))
|
45
45
|
rescue Net::FTPPermError => e
|
46
46
|
end
|
47
47
|
end
|
@@ -54,9 +54,9 @@ module Dandelion
|
|
54
54
|
|
55
55
|
def cleanup(dir)
|
56
56
|
unless dir == File.dirname(dir)
|
57
|
-
if empty?
|
58
|
-
@ftp.rmdir
|
59
|
-
cleanup
|
57
|
+
if empty?(dir)
|
58
|
+
@ftp.rmdir(dir)
|
59
|
+
cleanup(File.dirname(dir))
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -68,13 +68,17 @@ module Dandelion
|
|
68
68
|
def mkdir_p(dir)
|
69
69
|
unless dir == File.dirname(dir)
|
70
70
|
begin
|
71
|
-
@ftp.mkdir
|
71
|
+
@ftp.mkdir(dir)
|
72
72
|
rescue Net::FTPPermError => e
|
73
|
-
mkdir_p
|
74
|
-
@ftp.mkdir
|
73
|
+
mkdir_p(File.dirname(dir))
|
74
|
+
@ftp.mkdir(dir)
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
78
|
+
|
79
|
+
def to_b(value)
|
80
|
+
return [true, 'true', 1, '1', 'T', 't'].include?(value.class == String ? value.downcase : value)
|
81
|
+
end
|
78
82
|
end
|
79
83
|
end
|
80
84
|
end
|
data/lib/dandelion/backend/s3.rb
CHANGED
@@ -16,18 +16,18 @@ module Dandelion
|
|
16
16
|
|
17
17
|
def read(file)
|
18
18
|
s3connect!
|
19
|
-
raise MissingFileError unless AWS::S3::S3Object.exists?
|
20
|
-
AWS::S3::S3Object.value
|
19
|
+
raise MissingFileError unless AWS::S3::S3Object.exists?(path(file), @bucket_name)
|
20
|
+
AWS::S3::S3Object.value(path(file), @bucket_name)
|
21
21
|
end
|
22
22
|
|
23
23
|
def write(file, data)
|
24
24
|
s3connect!
|
25
|
-
AWS::S3::S3Object.store
|
25
|
+
AWS::S3::S3Object.store(path(file), data, @bucket_name)
|
26
26
|
end
|
27
27
|
|
28
28
|
def delete(file)
|
29
29
|
s3connect!
|
30
|
-
AWS::S3::S3Object.delete
|
30
|
+
AWS::S3::S3Object.delete(path(file), @bucket_name)
|
31
31
|
end
|
32
32
|
|
33
33
|
def to_s
|
@@ -27,19 +27,19 @@ module Dandelion
|
|
27
27
|
def write(file, data)
|
28
28
|
temp(file, data) do |temp|
|
29
29
|
begin
|
30
|
-
@sftp.upload!
|
30
|
+
@sftp.upload!(temp, path(file))
|
31
31
|
rescue Net::SFTP::StatusException => e
|
32
32
|
raise unless e.code == 2
|
33
|
-
mkdir_p
|
34
|
-
@sftp.upload!
|
33
|
+
mkdir_p(File.dirname(path(file)))
|
34
|
+
@sftp.upload!(temp, path(file))
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def delete(file)
|
40
40
|
begin
|
41
|
-
@sftp.remove!
|
42
|
-
cleanup
|
41
|
+
@sftp.remove!(path(file))
|
42
|
+
cleanup(File.dirname(path(file)))
|
43
43
|
rescue Net::SFTP::StatusException => e
|
44
44
|
raise unless e.code == 2
|
45
45
|
end
|
@@ -57,9 +57,9 @@ module Dandelion
|
|
57
57
|
|
58
58
|
def cleanup(dir)
|
59
59
|
unless cleanpath(dir) == cleanpath(@config['path']) or dir == File.dirname(dir)
|
60
|
-
if empty?
|
61
|
-
@sftp.rmdir!
|
62
|
-
cleanup
|
60
|
+
if empty?(dir)
|
61
|
+
@sftp.rmdir!(dir)
|
62
|
+
cleanup(File.dirname(dir))
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -70,17 +70,17 @@ module Dandelion
|
|
70
70
|
|
71
71
|
def mkdir_p(dir)
|
72
72
|
begin
|
73
|
-
@sftp.mkdir!
|
73
|
+
@sftp.mkdir!(dir)
|
74
74
|
rescue Net::SFTP::StatusException => e
|
75
75
|
raise unless e.code == 2
|
76
|
-
mkdir_p
|
77
|
-
|
76
|
+
mkdir_p(File.dirname(dir))
|
77
|
+
@sftp.mkdir!(dir)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
81
|
def path(file)
|
82
82
|
if @config['path'] and !@config['path'].empty?
|
83
|
-
File.join
|
83
|
+
File.join(@config['path'], file)
|
84
84
|
else
|
85
85
|
file
|
86
86
|
end
|
data/lib/dandelion/cli.rb
CHANGED
@@ -20,10 +20,10 @@ module Dandelion
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def parse(args)
|
23
|
-
order
|
23
|
+
order(@global, args)
|
24
24
|
command = args.shift
|
25
25
|
if command and @commands[command]
|
26
|
-
order
|
26
|
+
order(@commands[command], args)
|
27
27
|
end
|
28
28
|
|
29
29
|
if @commands.key? command
|
@@ -108,11 +108,11 @@ module Dandelion
|
|
108
108
|
|
109
109
|
def initialize(args)
|
110
110
|
@options = Options.new
|
111
|
-
@command = @options.parse
|
111
|
+
@command = @options.parse(args)
|
112
112
|
|
113
113
|
validate_files
|
114
|
-
@config = YAML.load_file(File.expand_path
|
115
|
-
@repo = Git::Repo.new(File.expand_path
|
114
|
+
@config = YAML.load_file(File.expand_path(@options.config_file))
|
115
|
+
@repo = Git::Repo.new(File.expand_path(@options[:repo]))
|
116
116
|
end
|
117
117
|
|
118
118
|
def log
|
@@ -120,9 +120,26 @@ module Dandelion
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def execute
|
123
|
+
deployment = deployment()
|
124
|
+
log.info("Remote revision: #{deployment.remote_revision || '---'}")
|
125
|
+
log.info("Local revision: #{deployment.local_revision}")
|
126
|
+
|
127
|
+
if @command == 'status'
|
128
|
+
exit
|
129
|
+
elsif @command == 'deploy'
|
130
|
+
validate_deployment(deployment)
|
131
|
+
deployment.deploy
|
132
|
+
log.info("Deployment complete")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
def backend
|
123
139
|
begin
|
124
140
|
backend = Backend::Backend.create(@config)
|
125
141
|
log.info("Connecting to: #{backend}")
|
142
|
+
backend
|
126
143
|
rescue Backend::MissingDependencyError => e
|
127
144
|
log.fatal("The '#{@config['scheme']}' scheme requires additional gems:")
|
128
145
|
log.fatal(' ' + e.gems.join("\n ") + "\n")
|
@@ -132,29 +149,18 @@ module Dandelion
|
|
132
149
|
log.fatal("Unsupported scheme: #{@config['scheme']}")
|
133
150
|
exit
|
134
151
|
end
|
135
|
-
|
152
|
+
end
|
153
|
+
|
154
|
+
def deployment
|
136
155
|
begin
|
137
|
-
|
156
|
+
Deployment::Deployment.create(@repo, backend, @config['exclude'])
|
138
157
|
rescue Git::DiffError
|
139
158
|
log.fatal('Error: could not generate diff')
|
140
159
|
log.fatal('Try merging remote changes before running dandelion again')
|
141
160
|
exit
|
142
161
|
end
|
143
|
-
|
144
|
-
log.info("Remote revision: #{deployment.remote_revision || '---'}")
|
145
|
-
log.info("Local revision: #{deployment.local_revision}")
|
146
|
-
|
147
|
-
if @command == 'status'
|
148
|
-
exit
|
149
|
-
elsif @command == 'deploy'
|
150
|
-
validate_deployment deployment
|
151
|
-
deployment.deploy
|
152
|
-
log.info("Deployment complete")
|
153
|
-
end
|
154
162
|
end
|
155
163
|
|
156
|
-
private
|
157
|
-
|
158
164
|
def validate_deployment(deployment)
|
159
165
|
begin
|
160
166
|
@repo.remote_list.each do |remote|
|
@@ -171,11 +177,11 @@ module Dandelion
|
|
171
177
|
end
|
172
178
|
|
173
179
|
def validate_files
|
174
|
-
unless File.exists?
|
180
|
+
unless File.exists?(File.expand_path(File.join(@options[:repo], '.git')))
|
175
181
|
log.fatal("Not a git repository: #{@options[:repo]}")
|
176
182
|
exit
|
177
183
|
end
|
178
|
-
unless File.exists?(File.expand_path
|
184
|
+
unless File.exists?(File.expand_path(@options.config_file))
|
179
185
|
log.fatal("Could not find file: #{@options.config_file}")
|
180
186
|
exit
|
181
187
|
end
|
data/lib/dandelion/deployment.rb
CHANGED
@@ -7,11 +7,11 @@ module Dandelion
|
|
7
7
|
|
8
8
|
class Deployment
|
9
9
|
class << self
|
10
|
-
def create(repo, backend, exclude)
|
10
|
+
def create(repo, backend, exclude = nil, revision = 'HEAD')
|
11
11
|
begin
|
12
|
-
DiffDeployment.new(repo, backend, exclude)
|
12
|
+
DiffDeployment.new(repo, backend, exclude, revision)
|
13
13
|
rescue RemoteRevisionError
|
14
|
-
FullDeployment.new(repo, backend, exclude)
|
14
|
+
FullDeployment.new(repo, backend, exclude, revision)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -37,7 +37,7 @@ module Dandelion
|
|
37
37
|
|
38
38
|
def validate_state(remote = nil)
|
39
39
|
begin
|
40
|
-
if remote and
|
40
|
+
if remote and fast_forwardable(remote)
|
41
41
|
raise FastForwardError
|
42
42
|
end
|
43
43
|
rescue Grit::Git::CommandFailed
|
@@ -53,6 +53,12 @@ module Dandelion
|
|
53
53
|
def exclude_file?(file)
|
54
54
|
return @exclude.map { |e| file.start_with?(e) }.any?
|
55
55
|
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def fast_forwardable(remote)
|
60
|
+
@repo.git.native(:remote, {:raise => true}, 'show', remote) =~ /fast-forward/i
|
61
|
+
end
|
56
62
|
end
|
57
63
|
|
58
64
|
class DiffDeployment < Deployment
|
data/lib/dandelion/git.rb
CHANGED
@@ -20,7 +20,7 @@ module Dandelion
|
|
20
20
|
@from_revision = from_revision
|
21
21
|
@to_revision = to_revision
|
22
22
|
begin
|
23
|
-
@files =
|
23
|
+
@files = parse(diff)
|
24
24
|
rescue Grit::Git::CommandFailed
|
25
25
|
raise DiffError
|
26
26
|
end
|
@@ -35,8 +35,12 @@ module Dandelion
|
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
38
|
+
|
39
|
+
def diff
|
40
|
+
@repo.git.native(:diff, {:name_status => true, :raise => true}, from_revision, to_revision)
|
41
|
+
end
|
38
42
|
|
39
|
-
def
|
43
|
+
def parse(diff)
|
40
44
|
files = {}
|
41
45
|
diff.split("\n").each do |line|
|
42
46
|
status, file = line.split("\t")
|
data/lib/dandelion/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dandelion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-05-
|
12
|
+
date: 2011-05-25 00:00:00.000000000 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: grit
|
17
|
-
requirement: &
|
17
|
+
requirement: &2157532620 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 2.4.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2157532620
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: mocha
|
28
|
-
requirement: &
|
28
|
+
requirement: &2157532120 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.9.12
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2157532120
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: net-sftp
|
39
|
-
requirement: &
|
39
|
+
requirement: &2157531660 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 2.0.5
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2157531660
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: aws-s3
|
50
|
-
requirement: &
|
50
|
+
requirement: &2157531200 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: 0.6.0
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2157531200
|
59
59
|
description: Incremental Git repository deployment
|
60
60
|
email:
|
61
61
|
- scottbnel@gmail.com
|
@@ -135,7 +135,7 @@ rubyforge_project:
|
|
135
135
|
rubygems_version: 1.6.2
|
136
136
|
signing_key:
|
137
137
|
specification_version: 3
|
138
|
-
summary: dandelion-0.2.
|
138
|
+
summary: dandelion-0.2.2
|
139
139
|
test_files:
|
140
140
|
- test/fixtures/diff
|
141
141
|
- test/fixtures/ls_tree
|