octopress-deploy 1.0.0.alpha.1 → 1.0.0.alpha.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 10f414864560fd38076f95cf3ac0b16400794a6c
4
- data.tar.gz: 5ee9dd24d6a7df9ffc0215377cbdc99562138c57
3
+ metadata.gz: 170e6e1991b426a98b1638fb45687b7016a9fc53
4
+ data.tar.gz: 9b9a154ac981bc45b2e01c7c46d171176f7f61de
5
5
  SHA512:
6
- metadata.gz: c251e5f0f1ceb90e2a29964cd73f1ba9fea345512a839c0f61d39bcefa78bd522101cc47c843c0b8707dea95b65bcc9ccb0745f44343e294c4823b056af4b753
7
- data.tar.gz: 332ec18880beaa38605ca0c362cf2a5290d315a7a869c0592f12dc23074af4574bb2e8f5b64509714d0cb15afe588c5ff8a81281006457769d1f6dc6c55cf4bc
6
+ metadata.gz: e6a9439fa388b44668239362ad0ccb3fab3cfb878a17f355f90bed8c5c92258fabd25321f81dcd06dc47bf0f89daf484b8b133ed7ed4f6b4c784c46878574641
7
+ data.tar.gz: 17df7f348642dbb83c89b563390fa1b2e8cd8ab778e5d0a9e36682e9ba5669d6fa21e1281928971339268e7d527f1b8da5dfaa787d6dfc5511e7c5e9d0cff0d9
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Octopress Deploy
2
2
 
3
- Deployment tools for Octopress and Jekyll blogs.
3
+ Deployment tools for Octopress and Jekyll blogs (or really any static site).
4
+
5
+ Currently this supports deploying through Git and Rsync. Requests for other
6
+ deployment methods are welcome.
4
7
 
5
8
  ## Installation
6
9
 
@@ -14,47 +17,61 @@ And then execute:
14
17
 
15
18
  Or install it yourself as:
16
19
 
17
- $ gem install octopress-deploy-git
18
-
19
- ## Deploying with Git
20
-
21
- This is a generic git deployment system, it should work for GitHub, Heroku and other similar hosts.
22
-
23
- #### 1. Add a configuration file
20
+ $ gem install octopress-deploy
24
21
 
25
- Create a file named `_deploy.yml` in your project root.
22
+ ## Set up
26
23
 
27
- For GitHub user pages, the url should be something like: `git@github.com:username.github.io` and the branch should be master.
28
- For project pages, the url should be the path to the project repo and the branch should be `gh-pages`.
24
+ To deploy your site run:
29
25
 
30
- ```yml
31
- site: _site
32
- git:
33
- url:
34
- branch: master
26
+ ```ruby
27
+ Octopress::Deploy.push()
35
28
  ```
36
29
 
37
- #### 2. From Ruby run
30
+ This will read from your configuration file `_deploy.yml` and deploy your site. If your site has no configuration file, you will be asked if you want to generate one and what deployment method you want to use.
31
+
32
+ You can also generate a configuration by running:
38
33
 
39
34
  ```ruby
40
- Octopress::Deploy::Git.new().push
35
+ Octopress::Deploy.init_cofig('git') # or 'rsync'
41
36
  ```
42
37
 
43
- If you do not have a config file set up yet, this will offer to create a default one for you.
38
+ This will generate a '_deploy.yml' file in your current directory.
44
39
 
45
- ### Options
40
+ ### Configuration options
46
41
 
47
- It is recommended that you configure using the `deploy.yml`, but you can also pass configuration as options.
42
+ Configurations should be added to a `_deploy.yml` file in your project's root directory. You can pass options as a hash directy to the `push` method as well. Passed options will override options set in the config file.
48
43
 
49
44
  | option | Description | Default
50
45
  |:--------------|:-------------------------------------------------|:---------------|
51
46
  | `config_file` | Path to the config file. | _config.yml |
52
47
  | `site_dir` | Path to comipled site files. | _site |
48
+
49
+
50
+ ### Git options
51
+
52
+ Only git_url is required. Other options will default as shown below.
53
+
54
+ | option | Description | Default
55
+ |:--------------|:-------------------------------------------------|:---------------|
53
56
  | `git_url` | Url for remote git repository. | |
54
57
  | `git_branch` | Deployment branch for git repository. | master |
55
58
  | `deploy_dir` | Directory where deployment files are staged. | .deploy |
56
59
  | `remote` | Name of git remote. | deploy |
57
60
 
61
+ ### Rsync options
62
+
63
+ Only `remote_path` is required. If `user` is not present, Rsync will sync between two locally available directories. Do this if your site root is mounted locally.
64
+
65
+ | option | Description | Default
66
+ |:---------------|:--------------------------------------------------|:---------------|
67
+ | `user` | ssh user, e.g user@host.com | |
68
+ | `port` | ssh port | 22 |
69
+ | `remote_path` | Remote destination's document root. | |
70
+ | `exclude_file` | Path to a file containing rsync exclusions. | |
71
+ | `exclude` | Inline list of rsync exclusions. | |
72
+ | `include` | Inline list of inclusions to override exclusions. | |
73
+ | `delete` | Delete files in destination not found in source | false |
74
+
58
75
  ## Contributing
59
76
 
60
77
  1. Fork it
@@ -0,0 +1,45 @@
1
+ class Hash
2
+ # Merges self with another hash, recursively.
3
+ #
4
+ # This code was lovingly stolen from some random gem:
5
+ # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
6
+ #
7
+ # Thanks to whoever made it.
8
+ def deep_merge(hash)
9
+ target = dup
10
+ hash.keys.each do |key|
11
+ if hash[key].is_a? Hash and self[key].is_a? Hash
12
+ target[key] = target[key].deep_merge(hash[key])
13
+ next
14
+ end
15
+ target[key] = hash[key]
16
+ end
17
+
18
+ target
19
+ end
20
+
21
+ def to_symbol_keys
22
+ inject({}) do |memo, (k, v)|
23
+ if v.is_a? Hash
24
+ memo[k.to_sym] = v.to_symbol_keys
25
+ else
26
+ memo[k.to_sym] = v
27
+ end
28
+
29
+ memo
30
+ end
31
+ end
32
+
33
+ def to_string_keys
34
+ inject({}) do |memo, (k, v)|
35
+ if v.is_a? Hash
36
+ memo[k.to_s] = v.to_string_keys
37
+ else
38
+ memo[k.to_s] = v
39
+ end
40
+
41
+ memo
42
+ end
43
+ end
44
+ end
45
+
@@ -1,37 +1,15 @@
1
1
  module Octopress
2
2
  module Deploy
3
3
  class Git
4
- def initialize(options={})
5
- @config_file = options[:config_file] || '_deploy.yml'
6
- if !File.exists? @config_file
7
- init_config if ask_bool("Deployment config file not found. Create #{@config_file}?")
8
- else
9
- config = YAML.load(File.open(@config_file))
10
- @site_dir = options[:site_dir] || config['site']
11
- @repo = options[:git_url] || config['git']['url']
12
- @branch = options[:git_branch] || config['git']['branch']
13
- @deploy_dir = options[:deploy_dir] || config['git']['deploy_dir'] || '.deploy'
14
- @remote = options[:remote] || config['git']['remote'] || 'deploy'
15
-
16
- abort "Deploy Failed: You must provide a repository URL before deploying. Check your #{@config_file}.".red if @repo.nil?
17
- end
18
- end
19
4
 
20
- # Create a config file
21
- #
22
- def init_config
23
- config = <<-FILE
24
- site: _site
25
- git:
26
- url:
27
- branch: master
28
- FILE
29
- File.open(@config_file, 'w') { |f| f.write(config) }
30
- puts "File #{@config_file} created.".green
31
- puts "------------------"
32
- puts config
33
- puts "------------------"
34
- puts "Please update it with your settings."
5
+ def initialize(options={})
6
+ @options = options
7
+ @repo = @options[:git_url]
8
+ @branch = @options[:git_branch]
9
+ @site_dir = @options[:site_dir]
10
+ @remote = @options[:remote] || 'deploy'
11
+ @deploy_dir = @options[:deploy_dir] || '.deploy'
12
+ abort "Deploy Failed: You must provide a repository URL before deploying. Check your #{@options[:config_file]}.".red if @repo.nil?
35
13
  end
36
14
 
37
15
  # Initialize, pull, copy and deploy.
@@ -53,6 +31,12 @@ FILE
53
31
  end
54
32
  end
55
33
 
34
+ def self.default_config(options={})
35
+ config = <<-CONFIG
36
+ git_url: #{options[:git_url]}
37
+ git_branch: #{options[:git_branch] || 'master'}
38
+ CONFIG
39
+ end
56
40
 
57
41
  # If necessary create deploy directory and initialize it with deployment remote
58
42
  #
@@ -64,6 +48,7 @@ FILE
64
48
  # Attempt to clone from the remote
65
49
  #
66
50
  cmd = "git clone #{@repo} --origin #{@remote} --branch #{@branch} ."
51
+ puts cmd
67
52
  Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
68
53
  exit_status = wait_thr.value
69
54
 
@@ -102,30 +87,6 @@ FILE
102
87
  `git add --all :/; git commit -m '#{message}'`
103
88
  end
104
89
  end
105
-
106
- def ask_bool(message)
107
- ask(message, ['y','n']) == 'y'
108
- end
109
-
110
- def ask(message, valid_options)
111
- if valid_options
112
- options = valid_options.join '/'
113
- answer = get_stdin("#{message} [#{options}]: ").downcase.strip
114
- if valid_options.map{|o| o.downcase}.include?(answer)
115
- return answer
116
- else
117
- return false
118
- end
119
- else
120
- answer = get_stdin("#{message}: ")
121
- end
122
- answer
123
- end
124
-
125
- def get_stdin(message)
126
- print message
127
- STDIN.gets.chomp
128
- end
129
90
  end
130
91
  end
131
92
  end
@@ -0,0 +1,55 @@
1
+ module Octopress
2
+ module Deploy
3
+ class Rsync
4
+
5
+ def initialize(options)
6
+ @user = options[:user]
7
+ @port = options[:port] || "22"
8
+ @local = options[:site_dir]
9
+ @remote = options[:remote_path]
10
+ @exclude = options[:exclude]
11
+ @exclude_file = options[:exclude_file]
12
+ @include = options[:include]
13
+ @delete = options[:delete]
14
+ end
15
+
16
+ def push
17
+ cmd = "rsync -avz"
18
+ if @exclude || @exclude_file
19
+ cmd << "e"
20
+ if @exclude_file
21
+ cmd << " --exclude-from #{@exclude_file}"
22
+ else
23
+ cmd << " --exclude #{@exclude}"
24
+ end
25
+ end
26
+ if @include
27
+ cmd << " --include #{@include}"
28
+ end
29
+ if @user
30
+ cmd << " ssh -p #{@port}"
31
+ end
32
+ if @delete
33
+ cmd << " --delete"
34
+ end
35
+ cmd += " #{File.join(@local, '')} "
36
+ if @user
37
+ cmd << "#{@user}:"
38
+ end
39
+ cmd << "#{@remote}"
40
+
41
+ system cmd
42
+ end
43
+
44
+ def self.default_config(options={})
45
+ config = <<-CONFIG
46
+ user: #{options[:user]}
47
+ port: #{options[:port] || '22'}
48
+ remote_path: #{options[:remote_path]}
49
+ delete: #{options[:delete]}
50
+ CONFIG
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -1,5 +1,5 @@
1
1
  module Octopress
2
2
  module Deploy
3
- VERSION = "1.0.0.alpha.1"
3
+ VERSION = "1.0.0.alpha.2"
4
4
  end
5
5
  end
@@ -1,10 +1,103 @@
1
1
  require "octopress-deploy/version"
2
+ require "octopress-deploy/core_ext"
2
3
  require "YAML"
3
4
  require 'colorator'
4
5
  require 'open3'
5
6
 
7
+
6
8
  module Octopress
7
9
  module Deploy
8
- autoload :Git, 'octopress-deploy/git'
10
+ autoload :Git, 'octopress-deploy/git'
11
+ autoload :Rsync, 'octopress-deploy/rsync'
12
+
13
+ METHODS = {
14
+ 'git'=> Git,
15
+ 'rsync'=> Rsync
16
+ }
17
+
18
+ def self.push(options={})
19
+ init_options(options)
20
+ if !File.exists? @options[:config_file]
21
+ init_config if ask_bool("Deployment config file not found. Create #{@options[:config_file]}?")
22
+ else
23
+ parse_options
24
+ deploy_method.new(@options).push()
25
+ end
26
+ end
27
+
28
+ def self.parse_options
29
+ config = YAML.load(File.open(@options[:config_file])).to_symbol_keys
30
+ @options = @options.to_symbol_keys
31
+ @options = config.deep_merge(@options)
32
+ end
33
+
34
+ def self.init_options(options={})
35
+ @options ||= options
36
+ @options[:config_file] ||= '_deploy.yml'
37
+ @options[:site_dir] ||= site_dir
38
+ end
39
+
40
+ def self.deploy_method
41
+ METHODS[@options[:method].downcase]
42
+ end
43
+
44
+ def self.site_dir
45
+ @options[:site_dir] || if File.exist? '_config.yml'
46
+ YAML.load(File.open('_config.yml'))['destination'] || '_site'
47
+ else
48
+ '_site'
49
+ end
50
+ end
51
+
52
+ # Create a config file
53
+ #
54
+ def self.init_config(method=nil, options={})
55
+ init_options unless @options
56
+ @options ||= options
57
+ @options[:method] ||= method
58
+ unless @options[:method]
59
+ @options[:method] = ask("How would you like to deploy your site?", METHODS.keys)
60
+ end
61
+ config = <<-FILE
62
+ method: #{@options[:method]}
63
+ site_dir: #{@options[:site_dir]}
64
+ FILE
65
+ config += deploy_method.default_config(options)
66
+
67
+ if File.exist? @options[:config_file]
68
+ unless ask_bool("A config file already exists at #{@options[:config_file]}. Overwrite?")
69
+ abort "No config file written."
70
+ end
71
+ end
72
+ File.open(@options[:config_file], 'w') { |f| f.write(config) }
73
+ puts "File #{@options[:config_file]} created.".green
74
+ puts "------------------"
75
+ puts "#{config.yellow}------------------"
76
+ puts "Please add your configurations to this file."
77
+ end
78
+
79
+ def self.ask_bool(message)
80
+ ask(message, ['y','n']) == 'y'
81
+ end
82
+
83
+ def self.ask(message, valid_options)
84
+ if valid_options
85
+ options = valid_options.join '/'
86
+ answer = get_stdin("#{message} [#{options}]: ").downcase.strip
87
+ if valid_options.map{|o| o.downcase}.include?(answer)
88
+ return answer
89
+ else
90
+ return false
91
+ end
92
+ else
93
+ answer = get_stdin("#{message}: ")
94
+ end
95
+ answer
96
+ end
97
+
98
+ def self.get_stdin(message)
99
+ print message
100
+ STDIN.gets.chomp
101
+ end
9
102
  end
10
103
  end
data/test/_deploy.yml CHANGED
@@ -1,4 +1,4 @@
1
- site: _site
2
- git:
3
- url:
4
- branch: master
1
+ method: git
2
+ site_dir: _site
3
+ git_url: /Users/imathis/workspace/octodev/deploy/test/deploy_target
4
+ git_branch: master
data/test/test.rb CHANGED
@@ -1,9 +1,22 @@
1
1
  require 'octopress-deploy'
2
2
 
3
- FileUtils.mkdir 'deploy_target'
4
- FileUtils.cd 'deploy_target' do
5
- system 'git init --bare'
3
+ def test_git
4
+ FileUtils.mkdir 'deploy_target'
5
+ FileUtils.cd 'deploy_target' do
6
+ system 'git init --bare'
7
+ end
8
+ Octopress::Deploy.init_config('git', git_url: File.expand_path("deploy_target"))
9
+ Octopress::Deploy.push()
10
+ FileUtils.rm_r 'deploy_target'
6
11
  end
7
12
 
8
- Octopress::Deploy::Git.new({git_url: File.expand_path('deploy_target')}).push
9
- FileUtils.rm_r 'deploy_target'
13
+ def test_rsync
14
+ FileUtils.mkdir_p "deploy-rsync"
15
+ Octopress::Deploy.init_config('rsync', remote_path: '.deploy')
16
+ Octopress::Deploy.push()
17
+ FileUtils.rm_r 'deploy-rsync'
18
+ end
19
+
20
+ test_git
21
+ test_rsync
22
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octopress-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.1
4
+ version: 1.0.0.alpha.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mathis
@@ -65,7 +65,9 @@ files:
65
65
  - README.md
66
66
  - Rakefile
67
67
  - lib/octopress-deploy.rb
68
+ - lib/octopress-deploy/core_ext.rb
68
69
  - lib/octopress-deploy/git.rb
70
+ - lib/octopress-deploy/rsync.rb
69
71
  - lib/octopress-deploy/version.rb
70
72
  - octopress-deploy.gemspec
71
73
  - test/Gemfile