dandelion 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -44,7 +44,7 @@ Optional: `path`, `exclude`
44
44
  **FTP**: `scheme: ftp`
45
45
 
46
46
  Required: `host`, `username`, `password`
47
- Optional: `path`, `exclude`
47
+ Optional: `path`, `exclude`, `passive` (defaults to true)
48
48
 
49
49
  **Amazon S3**: `scheme: s3`
50
50
 
@@ -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? config['scheme']
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 temp, file
33
+ @ftp.putbinaryfile(temp, file)
34
34
  rescue Net::FTPPermError => e
35
- mkdir_p File.dirname(file)
36
- @ftp.putbinaryfile temp, file
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 file
44
- cleanup File.dirname(file)
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? dir
58
- @ftp.rmdir dir
59
- cleanup File.dirname(dir)
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 dir
71
+ @ftp.mkdir(dir)
72
72
  rescue Net::FTPPermError => e
73
- mkdir_p File.dirname(dir)
74
- @ftp.mkdir dir
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
@@ -16,18 +16,18 @@ module Dandelion
16
16
 
17
17
  def read(file)
18
18
  s3connect!
19
- raise MissingFileError unless AWS::S3::S3Object.exists? path(file), @bucket_name
20
- AWS::S3::S3Object.value path(file), @bucket_name
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 path(file), data, @bucket_name
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 path(file), @bucket_name
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! temp, path(file)
30
+ @sftp.upload!(temp, path(file))
31
31
  rescue Net::SFTP::StatusException => e
32
32
  raise unless e.code == 2
33
- mkdir_p File.dirname(path(file))
34
- @sftp.upload! temp, path(file)
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! path(file)
42
- cleanup File.dirname(path(file))
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? dir
61
- @sftp.rmdir! dir
62
- cleanup File.dirname(dir)
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! dir
73
+ @sftp.mkdir!(dir)
74
74
  rescue Net::SFTP::StatusException => e
75
75
  raise unless e.code == 2
76
- mkdir_p File.dirname(dir)
77
- retry
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 @config['path'], file
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 @global, args
23
+ order(@global, args)
24
24
  command = args.shift
25
25
  if command and @commands[command]
26
- order @commands[command], args
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 args
111
+ @command = @options.parse(args)
112
112
 
113
113
  validate_files
114
- @config = YAML.load_file(File.expand_path @options.config_file)
115
- @repo = Git::Repo.new(File.expand_path @options[:repo])
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
- deployment = Deployment::Deployment.create(@repo, backend, @config['exclude'])
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? File.expand_path File.join(@options[:repo], '.git')
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 @options.config_file)
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
@@ -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 @repo.git.native(:remote, {:raise => true}, 'show', remote) =~ /fast-forward/i
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 = parse_diff @repo.git.native(:diff, {:name_status => true, :raise => true}, from_revision, to_revision)
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 parse_diff(diff)
43
+ def parse(diff)
40
44
  files = {}
41
45
  diff.split("\n").each do |line|
42
46
  status, file = line.split("\t")
@@ -1,3 +1,3 @@
1
1
  module Dandelion
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
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.1
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-19 00:00:00.000000000 -04:00
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: &2161286340 !ruby/object:Gem::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: *2161286340
25
+ version_requirements: *2157532620
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: mocha
28
- requirement: &2161285840 !ruby/object:Gem::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: *2161285840
36
+ version_requirements: *2157532120
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: net-sftp
39
- requirement: &2161285380 !ruby/object:Gem::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: *2161285380
47
+ version_requirements: *2157531660
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: aws-s3
50
- requirement: &2161284920 !ruby/object:Gem::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: *2161284920
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.1
138
+ summary: dandelion-0.2.2
139
139
  test_files:
140
140
  - test/fixtures/diff
141
141
  - test/fixtures/ls_tree