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 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