dandelion 0.3.15 → 0.4.0.beta2

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +11 -0
  5. data/LICENSE +1 -1
  6. data/README.md +15 -26
  7. data/Rakefile +4 -8
  8. data/bin/dandelion +4 -3
  9. data/dandelion.gemspec +23 -20
  10. data/lib/dandelion.rb +26 -10
  11. data/lib/dandelion/adapter.rb +45 -0
  12. data/lib/dandelion/{backend → adapter}/ftp.rb +22 -17
  13. data/lib/dandelion/adapter/noop.rb +14 -0
  14. data/lib/dandelion/{backend → adapter}/s3.rb +14 -15
  15. data/lib/dandelion/{backend → adapter}/sftp.rb +29 -16
  16. data/lib/dandelion/change.rb +11 -0
  17. data/lib/dandelion/changeset.rb +49 -0
  18. data/lib/dandelion/cli.rb +127 -0
  19. data/lib/dandelion/command.rb +26 -92
  20. data/lib/dandelion/command/deploy.rb +54 -41
  21. data/lib/dandelion/command/status.rb +14 -13
  22. data/lib/dandelion/config.rb +36 -0
  23. data/lib/dandelion/deployer.rb +53 -0
  24. data/lib/dandelion/diff.rb +62 -0
  25. data/lib/dandelion/tree.rb +22 -0
  26. data/lib/dandelion/utils.rb +13 -0
  27. data/lib/dandelion/version.rb +2 -2
  28. data/lib/dandelion/workspace.rb +71 -0
  29. data/spec/dandelion/adapter_spec.rb +42 -0
  30. data/spec/dandelion/change_spec.rb +17 -0
  31. data/spec/dandelion/changeset_spec.rb +73 -0
  32. data/spec/dandelion/command/deploy_spec.rb +111 -0
  33. data/spec/dandelion/command/status_spec.rb +4 -0
  34. data/spec/dandelion/command_spec.rb +70 -0
  35. data/spec/dandelion/config_spec.rb +15 -0
  36. data/spec/dandelion/deployer_spec.rb +65 -0
  37. data/spec/dandelion/diff_spec.rb +54 -0
  38. data/spec/dandelion/tree_spec.rb +15 -0
  39. data/spec/dandelion/workspace_spec.rb +77 -0
  40. data/{test/test_git.git → spec/fixtures/repo.git}/HEAD +0 -0
  41. data/{test/test_git.git → spec/fixtures/repo.git}/config +1 -0
  42. data/{test/test_git.git → spec/fixtures/repo.git}/description +0 -0
  43. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/applypatch-msg.sample +0 -0
  44. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/commit-msg.sample +0 -0
  45. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/post-update.sample +0 -0
  46. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/pre-applypatch.sample +0 -0
  47. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/pre-commit.sample +6 -2
  48. data/spec/fixtures/repo.git/hooks/pre-push.sample +53 -0
  49. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/pre-rebase.sample +0 -0
  50. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/prepare-commit-msg.sample +0 -0
  51. data/{test/test_git.git → spec/fixtures/repo.git}/hooks/update.sample +1 -1
  52. data/{test/test_git.git → spec/fixtures/repo.git}/info/exclude +0 -0
  53. data/spec/fixtures/repo.git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99 +0 -0
  54. data/spec/fixtures/repo.git/objects/34/e64fe350f3ea80c989cdac7a99c2adb8574fca +0 -0
  55. data/spec/fixtures/repo.git/objects/3d/9b743acb4a84dd99002d2c6f3fcf1a47e9f06b +0 -0
  56. data/spec/fixtures/repo.git/objects/4e/44973d41d33bf5342037f56497efe0a9604d25 +0 -0
  57. data/{test/test_git.git → spec/fixtures/repo.git}/objects/57/16ca5987cbf97d6bb54920bea6adde242d87e6 +0 -0
  58. data/spec/fixtures/repo.git/objects/6c/a0f54491390579ce9438ec89c64c6b3499683a +0 -0
  59. data/spec/fixtures/repo.git/objects/8a/e33865a630c5d141c8a498f0c0166ff240b433 +0 -0
  60. data/{test/test_git.git → spec/fixtures/repo.git}/objects/90/2dce0535b19f0c15ac8407fc4468256ad672d7 +0 -0
  61. data/spec/fixtures/repo.git/objects/c3/9af82404cc4267b1ba5f4b4437a511e0776abb +0 -0
  62. data/spec/fixtures/repo.git/objects/c8/85b3f693ed6e2926971ef75680f41b318072ae +0 -0
  63. data/spec/fixtures/repo.git/objects/d8/7cbcba0e2ede0752bdafc5938da35546803ba5 +0 -0
  64. data/spec/fixtures/repo.git/objects/e2/89ff1e2729839759dbd6fe99b6e35880910c7c +0 -0
  65. data/{test/test_git.git → spec/fixtures/repo.git}/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  66. data/{test/test_git.git → spec/fixtures/repo.git}/objects/ea/41dba10b54a794284e0be009a11f0ff3716a28 +0 -0
  67. data/spec/fixtures/repo.git/objects/ee/314a31b622b027c10981acaed7903a3607dbd4 +0 -0
  68. data/spec/fixtures/repo.git/objects/f6/66b137794d56880bab05e8fd256713a8fccf92 +0 -0
  69. data/spec/fixtures/repo.git/refs/heads/master +1 -0
  70. data/spec/spec_helper.rb +28 -0
  71. metadata +119 -127
  72. data/lib/dandelion/application.rb +0 -73
  73. data/lib/dandelion/backend.rb +0 -54
  74. data/lib/dandelion/deployment.rb +0 -173
  75. data/lib/dandelion/git.rb +0 -123
  76. data/test/fixtures/diff +0 -3
  77. data/test/fixtures/ls_tree +0 -5
  78. data/test/test_diff_deployment.rb +0 -122
  79. data/test/test_ftp.rb +0 -49
  80. data/test/test_git.git/hooks/post-commit.sample +0 -8
  81. data/test/test_git.git/hooks/post-receive.sample +0 -15
  82. data/test/test_git.git/objects/0c/a605e9f0f1d42ce8193ac36db11ec3cc9efc08 +0 -0
  83. data/test/test_git.git/objects/11/bada4e36fd065c8d1d3ca97b8dffa496c8e021 +0 -0
  84. data/test/test_git.git/objects/88/d4480861346093048e08ce8dcc577d8aa69379 +0 -1
  85. data/test/test_git.git/objects/a6/394b3e8a82b76b0dd5b6b317f489dfe22426a6 +0 -0
  86. data/test/test_git.git/objects/a6/5140d5ec9f47064f614ecf8e43776baa5c0c11 +0 -0
  87. data/test/test_git.git/objects/f5/5f3c44c89e5d215fbaaef9d33563117fe0b61b +0 -1
  88. data/test/test_git.git/objects/ff/1f1d4bd0c99e1c9cca047c46b2194accf89504 +0 -4
  89. data/test/test_git.git/refs/heads/master +0 -1
  90. data/test/test_git.rb +0 -50
  91. data/test/test_sftp.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15da8ebaa65f3365b4aae08f6725564913aa4cba
4
- data.tar.gz: 7f9ef8588e9f43540238e4204b149cf165f03602
3
+ metadata.gz: 0db6d6a95dd6dd735cef40b26ee73e674c17060a
4
+ data.tar.gz: a78f497fa3447eaa7e2049aa45ebbaec0238095b
5
5
  SHA512:
6
- metadata.gz: 805d13b4368ff596aa1bb3be6888d9373a560d67a35c164bcaf19ba7fa50eeaf3c78629b5a575c137720862d36101f6f4eb365016c87565ec70ef20593bf9b35
7
- data.tar.gz: f581ace941d46f3d55c3082c648fe375f9ba39a39ecb8466a46507d6c6b55c70b9aef4c48dd4219829dbc0644e057fe1ab61f85ffe72b72f2194320b357b56d8
6
+ metadata.gz: ef112d609e8e09b892039db536142f4d5ee270ec78aa90b29cfa3ecd15f2250a8e2919a081b757b97fce41b66b17579b08644ee433801710fb26fe9b2e0c0bc4
7
+ data.tar.gz: b16bfa52c5b20874e17454175b076ec3d3ae905e99b6853ae239a59e8810d507a5ef4c375a042c33ec45728e07507cf1801dda1d62473a7ba62ff899ae59524b
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
data/Gemfile CHANGED
@@ -1,2 +1,13 @@
1
1
  source "http://rubygems.org"
2
+
2
3
  gemspec
4
+
5
+ group :development, :test do
6
+ gem 'rake'
7
+ gem 'rspec', '>= 2.0'
8
+ end
9
+
10
+ group :development do
11
+ gem 'net-sftp'
12
+ gem 'aws-s3'
13
+ end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2011 Scott Nelson
1
+ Copyright (C) 2014 Scott Nelson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,24 +1,19 @@
1
1
  Dandelion
2
2
  =========
3
3
  [![Gem Version](https://badge.fury.io/rb/dandelion.png)](http://badge.fury.io/rb/dandelion)
4
+ [![Build Status](https://travis-ci.org/scttnlsn/dandelion.png)](https://travis-ci.org/scttnlsn/dandelion)
4
5
  [![Dependency Status](https://gemnasium.com/scttnlsn/dandelion.png)](https://gemnasium.com/scttnlsn/dandelion)
5
6
  [![Code Climate](https://codeclimate.com/github/scttnlsn/dandelion.png)](https://codeclimate.com/github/scttnlsn/dandelion)
6
7
 
7
- Incremental Git repository deployment for OS X and Linux.
8
+ Incremental Git repository deployment.
8
9
 
9
10
  Install
10
11
  -------
11
12
 
12
- Ensure that Ruby is installed, then run:
13
+ Ensure that Ruby >= 1.9 is installed, then run:
13
14
 
14
15
  $ gem install dandelion
15
16
 
16
- Alternatively, you can build the gem yourself:
17
-
18
- $ git clone git://github.com/scttnlsn/dandelion.git
19
- $ cd dandelion
20
- $ rake install
21
-
22
17
  Config
23
18
  ------
24
19
 
@@ -28,7 +23,7 @@ Git repository is searched for a file named `dandelion.yml`).
28
23
  Example:
29
24
 
30
25
  ```yaml
31
- scheme: sftp
26
+ adapter: sftp
32
27
  host: example.com
33
28
  username: user
34
29
  password: pass
@@ -40,14 +35,12 @@ exclude:
40
35
  - folder/
41
36
 
42
37
  additional:
43
- - public/css/print.css
44
- - public/css/screen.css
45
- - public/js/main.js
38
+ - config/auth.yml
46
39
  ```
47
40
 
48
41
  Required:
49
42
 
50
- * `scheme` (the file transfer scheme, see below)
43
+ * `adapter` (alias: `scheme`, the file transfer adapter)
51
44
 
52
45
  Optional:
53
46
 
@@ -57,16 +50,16 @@ Optional:
57
50
  * `additional` (additional list of files from your working directory that will be deployed)
58
51
  * `revision_file` (remote file in which revision SHA is stored, defaults to .revision)
59
52
 
60
- Each scheme also has additional required and optional configuration parameters (see below).
53
+ Each adapter also has additional required and optional configuration parameters (see below).
61
54
 
62
- Schemes
63
- -------
55
+ Adapters
56
+ --------
64
57
 
65
- There is support for multiple backend file transfer schemes. The configuration
66
- must specify one of these schemes and the set of additional parameters required
67
- by the given scheme.
58
+ There is support for multiple backend file transfer adapters. The configuration
59
+ must specify one of these adapters and the set of additional parameters required
60
+ by the given adapter.
68
61
 
69
- **SFTP**: `scheme: sftp`
62
+ **SFTP**: `adapter: sftp`
70
63
 
71
64
  Required:
72
65
 
@@ -79,7 +72,7 @@ Optional:
79
72
  * `port` (defaults to 22)
80
73
  * `preserve_permissions` (defaults to true)
81
74
 
82
- **FTP**: `scheme: ftp`
75
+ **FTP**: `adapter: ftp`
83
76
 
84
77
  Required:
85
78
 
@@ -92,7 +85,7 @@ Optional:
92
85
  * `port` (defaults to 21)
93
86
  * `passive` (defaults to true)
94
87
 
95
- **Amazon S3**: `scheme: s3`
88
+ **Amazon S3**: `adapter: s3`
96
89
 
97
90
  Required:
98
91
 
@@ -100,10 +93,6 @@ Required:
100
93
  * `secret_access_key`
101
94
  * `bucket_name`
102
95
 
103
- Optional:
104
-
105
- * `host` (defaults to s3.amazonaws.com)
106
-
107
96
  Usage
108
97
  -----
109
98
 
data/Rakefile CHANGED
@@ -1,10 +1,6 @@
1
- require 'bundler'
2
- require 'rake/testtask'
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
- Bundler::GemHelper.install_tasks
4
+ RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- Rake::TestTask.new(:test) do |test|
7
- test.libs << 'lib' << 'test'
8
- test.pattern = 'test/**/test_*.rb'
9
- test.verbose = true
10
- end
6
+ task :default => :spec
data/bin/dandelion CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
 
5
- require 'dandelion/application'
6
+ require 'dandelion'
6
7
 
7
- Dandelion::Application.execute(ARGV.dup)
8
+ Dandelion::CLI.new(ARGV.dup).execute!
data/dandelion.gemspec CHANGED
@@ -1,26 +1,29 @@
1
- $:.push File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
2
3
 
3
4
  require 'dandelion/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
- s.name = 'dandelion'
7
- s.version = Dandelion::VERSION
8
- s.platform = Gem::Platform::RUBY
9
- s.authors = ['Scott Nelson']
10
- s.email = ['scottbnel@gmail.com']
11
- s.homepage = 'http://github.com/scttnlsn/dandelion'
12
- s.summary = "dandelion-#{s.version}"
13
- s.description = 'Incremental Git repository deployment'
14
- s.license = 'MIT'
15
-
16
- s.add_dependency 'grit', '>= 2.4.1'
17
-
18
- s.add_development_dependency 'mocha', '>= 0.9.12'
19
- s.add_development_dependency 'net-sftp', '>= 2.0.5'
20
- s.add_development_dependency 'aws-s3', '>= 0.6.0'
7
+ s.name = 'dandelion'
8
+ s.version = Dandelion::VERSION
9
+ s.authors = ['Scott Nelson']
10
+ s.email = ['scott@scttnlsn.com']
11
+ s.summary = 'Incremental Git repository deployment'
12
+ s.homepage = 'https://github.com/scttnlsn/dandelion'
13
+ s.license = 'MIT'
21
14
 
22
- s.files = `git ls-files`.split("\n")
23
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
24
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ s.files = `git ls-files`.split($/)
16
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
25
18
  s.require_paths = ['lib']
26
- end
19
+
20
+ s.post_install_message = <<-MSG
21
+ ! The 'dandelion' gem is installed but you may need to install additional
22
+ ! gems depending on the adapters you intend to use.
23
+ !
24
+ ! Running 'dandelion status' in your project directory will indicate which
25
+ ! additional gems need to be installed.
26
+ MSG
27
+
28
+ s.add_dependency 'rugged', '~> 0.19.0'
29
+ end
data/lib/dandelion.rb CHANGED
@@ -1,20 +1,36 @@
1
+ require 'logger'
2
+ require 'rugged'
3
+ require 'dandelion/adapter'
4
+ require 'dandelion/cli'
5
+ require 'dandelion/change'
6
+ require 'dandelion/changeset'
7
+ require 'dandelion/command'
8
+ require 'dandelion/config'
9
+ require 'dandelion/diff'
10
+ require 'dandelion/deployer'
11
+ require 'dandelion/tree'
12
+ require 'dandelion/version'
13
+ require 'dandelion/workspace'
14
+
1
15
  module Dandelion
2
16
  class << self
3
17
  def logger
4
- return @log if @log
18
+ return @logger if @logger
19
+
5
20
  $stdout.sync = true
6
- @log = Logger.new($stdout)
7
- @log.level = Logger::DEBUG
8
- @log.formatter = formatter
9
- @log
21
+
22
+ @logger = Logger.new($stdout)
23
+ @logger.level = Logger::DEBUG
24
+ @logger.formatter = formatter
25
+ @logger
10
26
  end
11
-
12
- private
13
-
27
+
28
+ private
29
+
14
30
  def formatter
15
- proc do |severity, datetime, progname, msg|
31
+ proc do |severity, datetime, progname, msg|
16
32
  "#{msg}\n"
17
33
  end
18
34
  end
19
35
  end
20
- end
36
+ end
@@ -0,0 +1,45 @@
1
+ module Dandelion
2
+ module Adapter
3
+ class InvalidAdapterError < StandardError; end
4
+
5
+ class MissingDependencyError < StandardError
6
+ attr_reader :gems
7
+
8
+ def initialize(gems)
9
+ @gems = gems
10
+ end
11
+ end
12
+
13
+ class Base
14
+ class << self
15
+ @@adapters = {}
16
+
17
+ def adapter(name)
18
+ @@adapters[name] = self
19
+ end
20
+
21
+ def create_adapter(name, options = {})
22
+ klass = @@adapters[name]
23
+ raise InvalidAdapterError if klass.nil?
24
+ klass.new(options)
25
+ rescue LoadError
26
+ raise MissingDependencyError.new(klass.required_gems)
27
+ end
28
+
29
+ attr_reader :required_gems
30
+
31
+ def requires_gems(*gems)
32
+ @required_gems = gems
33
+ end
34
+ end
35
+
36
+ def initialize(options)
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ require 'dandelion/adapter/noop'
43
+ require 'dandelion/adapter/ftp'
44
+ require 'dandelion/adapter/sftp'
45
+ require 'dandelion/adapter/s3'
@@ -1,31 +1,27 @@
1
- require 'dandelion/backend'
1
+ require 'dandelion/utils'
2
2
 
3
3
  module Dandelion
4
- module Backend
5
- class FTP < Backend::Base
6
- scheme 'ftp'
4
+ module Adapter
5
+ class FTP < Adapter::Base
6
+ include ::Dandelion::Utils
7
+
8
+ adapter 'ftp'
7
9
 
8
10
  def initialize(config)
9
11
  require 'net/ftp'
12
+
10
13
  @config = config
11
- @ftp = Net::FTP.new
12
- @ftp.connect(@config['host'], @config['port'] || Net::FTP::FTP_PORT)
13
- @ftp.login(@config['username'], @config['password'])
14
- @ftp.passive = @config['passive'].nil? ? true : to_b(@config['passive'])
15
- @ftp.chdir(@config['path']) if @config['path']
14
+ @config.defaults(port: Net::FTP::FTP_PORT)
15
+ @config[:passive] = to_b(@config[:passive])
16
+
17
+ @ftp = ftp_client
16
18
  end
17
19
 
18
20
  def read(file)
19
21
  begin
20
- # Implementation of FTP#getbinaryfile differs between 1.8
21
- # and 1.9 so we call FTP#retrbinary directly
22
- content = ''
23
- @ftp.retrbinary("RETR #{file}", 4096) do |data|
24
- content += data
25
- end
26
- content
22
+ @ftp.getbinaryfile(file, nil)
27
23
  rescue Net::FTPPermError => e
28
- raise MissingFileError
24
+ nil
29
25
  end
30
26
  end
31
27
 
@@ -54,6 +50,15 @@ module Dandelion
54
50
 
55
51
  private
56
52
 
53
+ def ftp_client
54
+ ftp = Net::FTP.new
55
+ ftp.connect(@config['host'], @config['port'])
56
+ ftp.login(@config['username'], @config['password'])
57
+ ftp.passive = @config['passive']
58
+ ftp.chdir(@config['path']) if @config['path']
59
+ ftp
60
+ end
61
+
57
62
  def cleanup(dir)
58
63
  unless dir == File.dirname(dir)
59
64
  if empty?(dir)
@@ -0,0 +1,14 @@
1
+ module Dandelion
2
+ module Adapter
3
+ class NoOpAdapter < Adapter::Base
4
+ def read(path)
5
+ end
6
+
7
+ def write(path, data)
8
+ end
9
+
10
+ def delete(path)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,23 +1,22 @@
1
- require 'dandelion/backend'
2
-
3
1
  module Dandelion
4
- module Backend
5
- class S3 < Backend::Base
6
- scheme 's3'
7
- gems 'aws-s3'
2
+ module Adapter
3
+ class S3 < Adapter::Base
4
+ adapter 's3'
5
+ requires_gems 'aws-s3'
8
6
 
9
7
  def initialize(config)
10
8
  require 'aws/s3'
11
- @access_key_id = config['access_key_id']
12
- @secret_access_key = config['secret_access_key']
13
- @bucket_name = config['bucket_name']
14
- @host = config['host']
15
- @path = config['path']
9
+
10
+ @access_key_id = config[:access_key_id]
11
+ @secret_access_key = config[:secret_access_key]
12
+ @bucket_name = config[:bucket_name]
13
+ @host = config[:host]
14
+ @path = config[:path]
16
15
  end
17
16
 
18
17
  def read(file)
19
18
  s3connect!
20
- raise MissingFileError unless AWS::S3::S3Object.exists?(path(file), @bucket_name)
19
+ return nil unless AWS::S3::S3Object.exists?(path(file), @bucket_name)
21
20
  AWS::S3::S3Object.value(path(file), @bucket_name)
22
21
  end
23
22
 
@@ -39,9 +38,9 @@ module Dandelion
39
38
 
40
39
  def s3connect!
41
40
  options = {
42
- :access_key_id => @access_key_id,
43
- :secret_access_key => @secret_access_key,
44
- :use_ssl => true
41
+ access_key_id: @access_key_id,
42
+ secret_access_key: @secret_access_key,
43
+ use_ssl: true
45
44
  }
46
45
 
47
46
  options[:server] = @host if @host