octopress-deploy 1.0.0.alpha.3 → 1.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e4a09550ef9b0543cffbf51047b99ef82efa4c9
4
- data.tar.gz: 8bebda9735365b81fc5bd5feb7171bd91ffec4fe
3
+ metadata.gz: 3335ecc6a5982dd61e353698ee6ed3521a65b62f
4
+ data.tar.gz: 6b5fc858d82ed0290ea6553f2950f9741718a883
5
5
  SHA512:
6
- metadata.gz: 868c3859731c91f5cfefeb0507564d2c9bfda7d6c51209901aa8f6cffa7cd4099aa9a5c79074090deb395b3aad587f98a3cb92f03c62469e0184af393f5453ff
7
- data.tar.gz: a887ef627c3c0f4d8e90d8594670b4bb32686a4406192b5ca19a423aede8840539912a1845c487ec6a3713592d5f84fc0e5383674be3042624737872a49294d3
6
+ metadata.gz: 23b4efe0fd05a85e1a68b75a04e1b3397654b6d0ab0f245d4a69fe77355d81a75ad6936496babc3764e9cf703396a61839de8056f7030a1dc43abdd11740f997
7
+ data.tar.gz: 5ba60aa87c352378fe530213d068e54e6e0b23db48f994cfc644cf4c258e65da58a857967d68d2d64e8a7d785e58dbd0ebf8805b7564193a2758d532f867f37c
data/README.md CHANGED
@@ -2,8 +2,7 @@
2
2
 
3
3
  Deployment tools for Octopress and Jekyll blogs (or really any static site).
4
4
 
5
- Currently this supports deploying through S3, Git and Rsync. Requests for other
6
- deployment methods are welcome.
5
+ Currently this supports deploying through S3, Git and Rsync. Pull request to support other deployment methods are welcome.
7
6
 
8
7
  ## Installation
9
8
 
@@ -21,94 +20,129 @@ Or install it yourself as:
21
20
 
22
21
  ## Set up
23
22
 
24
- To deploy your site run:
23
+ First set up a configuration file for your deployment method.
25
24
 
26
- ```bash
27
- $ octopress deploy
25
+ ```sh
26
+ $ octopress deploy init git # or rsync, s3
28
27
  ```
29
28
 
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.
29
+ This will generate a `_deploy.yml` file in your current
30
+ directory which you can edit to add any necessary configuration.
31
+ **Remember to add your configuration to `.gitignore` to be sure
32
+ you never commit sensitive information to your repository.**
33
+
34
+ ## Deploying
31
35
 
32
- You can also generate a `./_deploy.yml` configuration file by running:
36
+ Deployment is tailored to work with Jekyll, but it will work for
37
+ any static site. Simply make sure your configuration points to
38
+ the root directory of your static site (For Jekyll, that's
39
+ probably `_site`) then tell Octopress to deploy it.
33
40
 
34
- ```bash
35
- $ octopress deploy --init git # or 'rsync' or 's3'
41
+ ```sh
42
+ $ octopress deploy
36
43
  ```
37
44
 
38
- Once you've deployed your site, you can also pull it back down into a local directory. This is mostly useful for checking the results of a deploy. This will create the directory if it doesn't already exist.
45
+ This will read your `_deploy.yml` configuration and deploy your
46
+ site. If you like, you can specify a configuration file.
39
47
 
40
- ```ruby
41
- Octopress::Deploy.pull('some_directory')
48
+ ```sh
49
+ $ octopress deploy --config _staging.yml
42
50
  ```
43
51
 
44
- ### Configuration options
52
+ ## Pull down your site
45
53
 
46
- 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.
54
+ With the `pull` command, you can pull your site down into a local directory.
47
55
 
48
- | Config | Description | Default
49
- |:--------------|:-------------------------------------------------|:---------------|
50
- | `config_file` | Path to the config file. | _config.yml |
51
- | `site_dir` | Path to comipled site files. | _site |
56
+ ```sh
57
+ octopress deploy pull <DIRECTORY>
58
+ ```
59
+
60
+ Mainly you'd do this if you're troubleshooting deployment and you want to see if it's working how you expected.
52
61
 
62
+ ## Amazon S3 Deployment Configuration
53
63
 
54
- #### Amazon S3
64
+ To deploy with Amazon S3 you will need to install the [aws-sdk gem](https://rubygems.org/gems/aws-sdk).
55
65
 
56
- Important: when using S3, you must add your _deploy.yml to your .gitignore to prevent accidentally sharing
57
- account access information. Octopress Deploy will offer to do it for you. If you don't, you won't be able to deploy.`
66
+ Important: when using S3, you must add your `_deploy.yml` to your .gitignore to prevent accidentally sharing
67
+ account access information.
58
68
 
59
- | Config | Description | Default
60
- |:--------------------|:-----------------------------------------|:-------------|
61
- | `bucket_name` | S3 bucket name | |
62
- | `access_key_id` | AWS access key | |
63
- | `secret_access_key` | AWS secret key | |
64
- | `remote_path` | Directory files should be synced to. | / |
65
- | `delete` | Delete files to create a 1:1 file sync. | false |
66
- | `verbose` | Display all file actions during deploy. | true |
67
- | `region` | Region for your AWS bucket | us-east-1 |
69
+ | Config | Description | Default
70
+ |:--------------------|:------------------------------------------------------|:-------------|
71
+ | `method` | Deployment method, in this case use 's3' | |
72
+ | `site_dir` | Path to static site files | _site |
73
+ | `bucket_name` | S3 bucket name | |
74
+ | `access_key_id` | AWS access key | |
75
+ | `secret_access_key` | AWS secret key | |
76
+ | `remote_path` | Directory files should be synced to. | / |
77
+ | `verbose` | [optional] Display all file actions during deploy. | true |
78
+ | `region` | [optional] Region for your AWS bucket | us-east-1 |
79
+ | `delete` | Delete files in `remote_path` not found in `site_dir` | false |
68
80
 
69
81
  If you choose a bucket which doesn't yet exist, Octopress Deploy will offer to create it for you, and offer to configure it as a static website.
70
82
 
71
- ##### ENV config
83
+ If you configure Octopress to delete files, all files found in the `remote_path` on S3 bucket will be removed unless they match local site files.
84
+ If `remote_path` is a subdirectory, only files in that subdirectory will be evaluated for deletion.
85
+
86
+ ### AWS config via ENV
72
87
 
73
- For the following configurations you can set environment vars instead of adding items to your config file.
88
+ If you prefer, you can store AWS access credentials in environment variables instead of a conifiguration file.
74
89
 
75
90
  | Config | ENV var |
76
91
  |:--------------------|:-------------------------------|
77
92
  | `access_key_id` | AWS_ACCESS_KEY_ID |
78
93
  | `secret_access_key` | AWS_SECRET_ACCESS_KEY |
79
- | `region` | AWS_DEFAULT_REGIONS |
80
94
 
95
+ Note: configurations in `_deploy.yml` will override environment variables so be sure to remove those if you decide to use environment variables.
81
96
 
82
- ##### Deleting files from S3
97
+ ### Add a new bucket
83
98
 
84
- If the `delete` option is true, files in the `remote_path` on the bucket will be removed if they do not match local site files.
85
- If `remote_path` is a subdirectory, only files in that subdirectory will be evaluated for deletion.
99
+ If your AWS credentials are properly configured, you can add a new bucket with this command.
100
+
101
+ ```sh
102
+ octopress deploy add_bucket
103
+ ```
86
104
 
87
- #### Git
105
+ This will connect to AWS, create a new S3 bucket, and configure it for static website hosting. This command can use the settings in your deployment configuration or you can pass options to override those settings.
106
+
107
+ | Option | Description | Default
108
+ |:--------------|:-------------------------------------------------|:---------------|
109
+ | `--name` | Override the `bucket_name` configuration | |
110
+ | `--region` | Override the `region` configuration | |
111
+ | `--index` | Specify an index page for your site | index.html |
112
+ | `--error` | Specify an error page for your site | error.html |
113
+ | `--config` | Use a custom configuration file | _deploy.yml |
114
+
115
+ You'll only need to pass options if you want to override settings in your deploy config file.
116
+
117
+ ## Git Deployment Configuration
88
118
 
89
119
  Only `git_url` is required. Other options will default as shown below.
90
120
 
91
121
  | Config | Description | Default
92
122
  |:--------------|:-------------------------------------------------|:---------------|
93
- | `git_url` | Url for remote git repository. | |
94
- | `git_branch` | Deployment branch for git repository. | master |
95
- | `deploy_dir` | Directory where deployment files are staged. | .deploy |
96
- | `remote` | Name of git remote. | deploy |
123
+ | `method` | Deployment method, in this case use 'git' | |
124
+ | `site_dir` | Path to static site files | _site |
125
+ | `git_url` | Url for remote git repository | |
126
+ | `git_branch` | Deployment branch for git repository | master |
127
+ | `deploy_dir` | Directory where deployment files are staged | .deploy |
128
+ | `remote` | Name of git remote | deploy |
97
129
 
98
- #### Rsync
99
-
100
- 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.
130
+ ## Rsync Deployment Configuration
101
131
 
102
132
  | Config | Description | Default
103
133
  |:---------------|:--------------------------------------------------|:---------------|
134
+ | `method` | Deployment method, in this case use 'rsync' | |
135
+ | `site_dir` | Path to static site files | _site |
104
136
  | `user` | ssh user, e.g user@host.com | |
105
137
  | `port` | ssh port | 22 |
106
- | `remote_path` | Remote destination's document root. | |
107
- | `exclude_file` | Path to a file containing rsync exclusions. | |
108
- | `exclude` | Inline list of rsync exclusions. | |
109
- | `include` | Inline list of inclusions to override exclusions. | |
138
+ | `remote_path` | Remote destination's document root | |
139
+ | `exclude_file` | Path to a file containing rsync exclusions | |
140
+ | `exclude` | Inline list of rsync exclusions | |
141
+ | `include` | Inline list of inclusions to override exclusions | |
110
142
  | `delete` | Delete files in destination not found in source | false |
111
143
 
144
+ You can rsync to a local directory by configuring `remote_path` and leaving off `user` and `port`.
145
+
112
146
  ## Contributing
113
147
 
114
148
  1. Fork it
@@ -1,14 +1,12 @@
1
1
  $LOAD_PATH.unshift File.expand_path("../", __FILE__)
2
-
3
- require 'octopress-deploy/version'
4
- require 'octopress-deploy/core_ext'
2
+ #
5
3
  require 'colorator'
6
4
  require 'yaml'
7
- require 'pathname'
5
+ require 'octopress'
8
6
 
9
- if defined? Octopress::Command
10
- require 'octopress-deploy/commands'
11
- end
7
+ require 'octopress-deploy/version'
8
+ require 'octopress-deploy/core_ext'
9
+ require 'octopress-deploy/commands'
12
10
 
13
11
 
14
12
  module Octopress
@@ -18,34 +16,44 @@ module Octopress
18
16
  autoload :S3, 'octopress-deploy/s3'
19
17
 
20
18
  METHODS = {
21
- 'git'=> Git,
22
- 'rsync'=> Rsync,
23
- 's3'=> S3
19
+ 'git' => Git,
20
+ 'rsync' => Rsync,
21
+ 's3' => S3
24
22
  }
25
23
 
26
24
  def self.push(options={})
27
25
  init_options(options)
28
26
  if !File.exists? @options[:config_file]
29
- init_config if ask_bool("Deployment config file not found. Create #{@options[:config_file]}?")
27
+ abort "File not found: #{@options[:config_file]}. Create a deployment config file with `octopress deploy init <METHOD>`."
30
28
  else
31
29
  parse_options
32
30
  deploy_method.new(@options).push()
33
31
  end
34
32
  end
35
33
 
36
- def self.pull(dir='site-pull', options={})
34
+ def self.pull(options={})
37
35
  init_options(options)
38
36
  if !File.exists? @options[:config_file]
39
- init_config if ask_bool("Deployment config file not found. Create #{@options[:config_file]}?")
37
+ abort "No deployment config found. Create one with: octopress deploy init #{@options[:config_file]}"
40
38
  else
41
39
  parse_options
42
- if !File.exists? @options[:pull_dir] = dir
43
- FileUtils.mkdir_p @options[:pull_dir]
40
+ if !File.exists? @options[:dir]
41
+ FileUtils.mkdir_p @options[:dir]
44
42
  end
45
43
  deploy_method.new(@options).pull()
46
44
  end
47
45
  end
48
46
 
47
+ def self.add_bucket(options={})
48
+ init_options(options)
49
+ if !File.exists? @options[:config_file]
50
+ abort "File not found: #{@options[:config_file]}. Create a deployment config file with `octopress deploy init <METHOD>`."
51
+ else
52
+ parse_options
53
+ deploy_method.new(@options).add_bucket()
54
+ end
55
+ end
56
+
49
57
  def self.parse_options
50
58
  config = YAML.load(File.open(@options[:config_file])).to_symbol_keys
51
59
  @options = @options.to_symbol_keys
@@ -53,9 +61,9 @@ module Octopress
53
61
  end
54
62
 
55
63
  def self.init_options(options={})
56
- @options = options.to_symbol_keys
64
+ @options = options.to_symbol_keys
57
65
  @options[:config_file] ||= '_deploy.yml'
58
- @options[:site_dir] ||= site_dir
66
+ @options[:site_dir] ||= site_dir
59
67
  end
60
68
 
61
69
  def self.deploy_method
@@ -72,26 +80,21 @@ module Octopress
72
80
 
73
81
  # Create a config file
74
82
  #
75
- def self.init_config(method=nil, options=nil)
76
- if options
77
- options[:method] = method
78
- init_options(options)
79
- end
83
+ def self.init_config(options={})
84
+ options = options.to_symbol_keys
80
85
 
81
- unless @options[:method]
82
- @options[:method] = ask("How would you like to deploy your site?", METHODS.keys)
86
+ if !options[:method]
87
+ abort "Please provide a deployment method. e.g. #{METHODS.keys}"
83
88
  end
84
89
 
90
+ init_options(options)
85
91
  write_config
86
92
  check_gitignore
87
93
  end
88
94
 
89
95
  def self.write_config
90
- if !@options[:force_write_config]
91
- if File.exist?(@options[:config_file]) &&
92
- !ask_bool("A config file already exists at #{@options[:config_file]}. Overwrite?")
93
- return puts "No config file written."
94
- end
96
+ if File.exist?(@options[:config_file]) && !@options[:force]
97
+ abort "A config file already exists at #{@options[:config_file]}. Use --force to overwrite."
95
98
  end
96
99
 
97
100
  config = get_config.strip
@@ -100,71 +103,31 @@ module Octopress
100
103
  puts "------------------"
101
104
  puts "#{config.yellow}"
102
105
  puts "------------------"
103
- puts "Please add your configurations to this file."
106
+ puts "Modify these configurations as necessary."
104
107
  end
105
108
 
106
109
  def self.get_config
107
110
  <<-FILE
108
- method: #{@options[:method]}
109
- site_dir: #{@options[:site_dir]}
111
+ #{"method: #{@options[:method]}".ljust(40)} # How do you want to deploy? git, rsync or s3.
112
+ #{"site_dir: #{@options[:site_dir]}".ljust(40)} # Location of your your static site files.
113
+
110
114
  #{deploy_method.default_config(@options)}
111
115
  FILE
112
116
  end
113
117
 
118
+ # Checks the repository's .gitignore for the config file
119
+ #
120
+ # returns: Boolean - whether it is present or not.
121
+ #
114
122
  def self.check_gitignore
115
123
  gitignore = File.join(`git rev-parse --show-toplevel`.strip, ".gitignore")
116
- if !File.exist?(gitignore) ||
117
- Pathname.new(gitignore).read.match(/^#{@options[:config_file]}/i).nil?
118
- if ask_bool("Do you want to add #{@options[:config_file]} to your .gitignore?")
119
- git_ignore_config_file gitignore
120
- return true
121
- end
122
- else
123
- return true
124
- end
125
- end
126
-
127
- def self.git_ignore_config_file(gitignore)
128
- File.open(gitignore, 'a') { |f| f.write(@options[:config_file]) }
129
- end
130
-
131
- def self.ask_bool(message)
132
- ask_or_default(true, message) do
133
- ask(message, ['y','n']) == 'y'
134
- end
135
- end
136
124
 
137
- def self.ask(message, valid_options)
138
- ask_or_default(false, message) do
139
- if valid_options
140
- options = valid_options.join '/'
141
- answer = get_stdin("#{message} [#{options}]: ").downcase.strip
142
- if valid_options.map{|o| o.downcase}.include?(answer)
143
- return answer
144
- else
145
- return false
146
- end
147
- else
148
- answer = get_stdin("#{message}: ")
149
- end
150
- answer
151
- end
152
- end
153
-
154
- def self.get_stdin(message)
155
- print message
156
- STDIN.gets.chomp
157
- end
158
-
159
- def self.should_ask?
160
- !ENV['NO_ASK']
161
- end
162
-
163
- def self.ask_or_default(default, message)
164
- if should_ask?
165
- yield
125
+ if !File.exist?(gitignore) ||
126
+ File.open(gitignore).read.match(/^#{@options[:config_file]}/i).nil?
127
+ puts "Remember to add #{@options[:config_file]} to your .gitignore."
128
+ false
166
129
  else
167
- puts "Assuming '#{default}' for '#{message}'."
130
+ true
168
131
  end
169
132
  end
170
133
  end
@@ -3,20 +3,47 @@ module Octopress
3
3
  class Commands < Octopress::Command
4
4
  def self.init_with_program(p)
5
5
  p.command(:deploy) do |c|
6
- c.syntax "octopress deploy [options]"
6
+ c.syntax "deploy [options]"
7
7
  c.description "Deploy your Octopress site."
8
- c.option "using", "--using METHOD", "Define the push method to use, overriding your configuration file's setting"
9
8
  c.option "config_file", "--config FILE", "The path to your config file (default: _deploy.yml)"
10
- c.option "init", "--init METHOD", "Initialize a config file with the options for the given method."
11
- c.option "pull", "--pull DIRECTORY", "Pull down the published copy of your site into a directory (default: ./site-pull)"
12
9
 
13
- c.action do |_, options|
14
- if options["init"] and options["init"].is_a?(String)
15
- Octopress::Deploy.init_config(options["init"], options)
16
- elsif options["pull"] and options["pull"].is_a?(String)
17
- Octopress::Deploy.pull(options["pull"], options)
18
- else
19
- Octopress::Deploy.push(options)
10
+ c.action do |args, options|
11
+ Octopress::Deploy.push(options)
12
+ end
13
+
14
+ c.command(:pull) do |c|
15
+ c.syntax "pull <DIRECTORY>"
16
+ c.description "Pull down the published copy of your site into a directory (default: ./site-pull)"
17
+ c.option "config_file", "--config FILE", "The path to your config file (default: _deploy.yml)"
18
+
19
+ c.action do |args, options|
20
+ options['dir'] = args.first
21
+ Octopress::Deploy.pull(options)
22
+ end
23
+ end
24
+
25
+ c.command(:init) do |c|
26
+ c.syntax 'init <METHOD> [options]'
27
+ c.description "Create a configuration file for a deployment method (#{Deploy::METHODS.keys.join(', ')})."
28
+ c.option 'force', '--force', 'Initialize a config file even if it already exists.'
29
+
30
+ c.action do |args, options|
31
+ options['method'] = args.first
32
+ Octopress::Deploy.init_config(options)
33
+ end
34
+ end
35
+
36
+ c.command(:add_bucket) do |c|
37
+ c.syntax 'add_bucket [options]'
38
+ c.description "Add a new S3 bucket and configure it for static websites."
39
+ c.option 'bucket_name','--name NAME','Choose a bucket name. (Defaults: to bucket_name in config file)'
40
+ c.option 'region','--region REGION','Choose a region. (Defaults: to region in config file)'
41
+ c.option 'index_page','--index PAGE','Specify an index page. (Default: index.html)'
42
+ c.option 'error_page','--error PAGE','Specify an error page. (Default: 404.html)'
43
+ c.option "config_file", "--config FILE", "The path to your config file (default: _deploy.yml)"
44
+
45
+ c.action do |args, options|
46
+ Octopress::Deploy.add_bucket(options)
20
47
  end
21
48
  end
22
49
  end
@@ -5,13 +5,13 @@ module Octopress
5
5
  def initialize(options={})
6
6
  @options = options
7
7
  @repo = @options[:git_url]
8
- @branch = @options[:git_branch]
8
+ @branch = @options[:git_branch] || 'master'
9
9
  @remote = @options[:remote] || 'deploy'
10
10
  @remote_path = @options[:remote_path] || ''
11
11
  @remote_path = @remote_path.sub(/^\//,'') #remove leading slash
12
- @site_dir = File.expand_path(@options[:site_dir])
12
+ @site_dir = File.expand_path(@options[:site_dir]) || '_site'
13
13
  @deploy_dir = File.expand_path(@options[:deploy_dir] || '.deploy')
14
- @pull_dir = @options[:pull_dir]
14
+ @pull_dir = @options[:dir]
15
15
  abort "Deploy Failed: Configure a git_url in #{@options[:config_file]} before deploying.".red if @repo.nil?
16
16
  end
17
17
 
@@ -44,8 +44,14 @@ module Octopress
44
44
 
45
45
  def self.default_config(options={})
46
46
  <<-CONFIG
47
- git_url: #{options[:git_url]}
48
- git_branch: #{options[:git_branch] || 'master'}
47
+ #{"git_url: #{options[:git_url]}".ljust(40)} # remote repository url, e.g. git@github.com:username/repo_name
48
+ #{"git_branch: #{options[:git_branch] || 'master'}".ljust(40)} # Git branch where static site files are commited
49
+
50
+ # Note on git_branch:
51
+ # If using GitHub project pages, set the branch to 'gh-pages'.
52
+ # For GitHub user/organization pages or Heroku, set the branch to 'master'.
53
+
54
+ #{"# remote_path: #{options[:remote_path]}".ljust(40)} # Destination directory
49
55
  CONFIG
50
56
  end
51
57
 
@@ -12,9 +12,11 @@ module Octopress
12
12
  @exclude_file = @options[:exclude_file]
13
13
  @exclude_file = File.expand_path(@exclude_file) if @exclude_file
14
14
  @include = @options[:include]
15
- @delete = @options[:delete]
15
+ @exclude_file = @options[:include_file]
16
+ @exclude_file = File.expand_path(@include_file) if @include_file
17
+ @delete = @options[:delete] || false
16
18
  @remote_path = @remote_path.sub(/^\//,'') #remove leading slash
17
- @pull_dir = @options[:pull_dir]
19
+ @pull_dir = @options[:dir]
18
20
  end
19
21
 
20
22
  def push
@@ -35,6 +37,7 @@ module Octopress
35
37
  cmd << " -e " if @exclude_file || @exclude
36
38
  cmd << " --exclude-from #{@exclude_file} " if @exclude_file
37
39
  cmd << " --exclude #{@exclude} " if @exclude
40
+ cmd << " --include-from #{@include_file} " if @include_file
38
41
  cmd << " --include #{@include} " if @include
39
42
  cmd << " --rsh='ssh -p#{@port}' " if @user && @port
40
43
  cmd << " --delete " if @delete
@@ -52,10 +55,16 @@ module Octopress
52
55
 
53
56
  def self.default_config(options={})
54
57
  <<-CONFIG
55
- user: #{options[:user]}
56
- port: #{options[:port]}
57
- remote_path: #{options[:remote_path]}
58
- delete: #{options[:delete]}
58
+ #{"user: #{options[:user]}".ljust(40)} # The user for your host, e.g. user@host.com
59
+ #{"remote_path: #{options[:remote_path]}".ljust(40)} # Destination directory
60
+ #{"delete: #{options[:delete]}".ljust(40)} # Remove files from destination which don't match files in source
61
+
62
+ #{"# port: #{options[:port]}".ljust(40)} # If your host requires a non standard port
63
+ #{"# exclude: ".ljust(40)} # Path to file containing list of files to exclude
64
+ #{"# exclude-file: ".ljust(40)} # Path to file containing list of files to exclude
65
+ #{"# include: ".ljust(40)} # Path to file containing list of files to include
66
+ #{"# include-file: ".ljust(40)} # Path to file containing list of files to include
67
+
59
68
  CONFIG
60
69
  end
61
70
 
@@ -1,12 +1,17 @@
1
1
  require 'find'
2
2
  require 'fileutils'
3
- require 'aws-sdk'
4
3
 
5
4
  module Octopress
6
5
  module Deploy
7
6
  class S3
8
7
 
9
8
  def initialize(options)
9
+ begin
10
+ require 'aws-sdk'
11
+ rescue LoadError
12
+ abort "Please install the aws-sdk gem first."
13
+ end
14
+ @options = options
10
15
  @local = options[:site_dir]
11
16
  @bucket_name = options[:bucket_name]
12
17
  @access_key = options[:access_key_id] || ENV['AWS_ACCESS_KEY_ID']
@@ -16,40 +21,48 @@ module Octopress
16
21
  @verbose = options[:verbose] || true
17
22
  @delete = options[:delete]
18
23
  @remote_path = @remote_path.sub(/^\//,'') # remove leading slash
19
- @pull_dir = options[:pull_dir]
24
+ @pull_dir = options[:dir]
20
25
  connect
21
26
  end
22
27
 
23
28
  def push
24
- abort "Seriously, you should. Quitting..." unless Deploy.check_gitignore
25
- puts "Syncing #{@local} files to #{@bucket_name} on S3."
26
- write_files
27
- delete_files if delete_files?
28
- status_message
29
+ #abort "Seriously, you should. Quitting..." unless Deploy.check_gitignore
30
+ @bucket = @s3.buckets[@bucket_name]
31
+ if !@bucket.exists?
32
+ abort "Bucket not found: '#{@bucket_name}'. Check your configuration or create a bucket using: `octopress deploy add_bucket`"
33
+ else
34
+ puts "Syncing #{@local} files to #{@bucket_name} on S3."
35
+ write_files
36
+ delete_files if delete_files?
37
+ status_message
38
+ end
29
39
  end
30
40
 
31
41
  def pull
32
- puts "Syncing #{@bucket_name} files to #{@pull_dir} on S3."
33
- @bucket.objects.each do |object|
34
- path = File.join(@pull_dir, object.key)
35
- dir = File.dirname(path)
36
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
37
- File.open(path, 'w') { |f| f.write(object.read) }
42
+ @bucket = @s3.buckets[@bucket_name]
43
+ if !@bucket.exists?
44
+ abort "Bucket not found: '#{@bucket_name}'. Check your configuration or create a bucket using: `octopress deploy add_bucket`"
45
+ else
46
+ puts "Syncing #{@bucket_name} files to #{@pull_dir} on S3."
47
+ @bucket.objects.each do |object|
48
+ path = File.join(@pull_dir, object.key)
49
+ dir = File.dirname(path)
50
+ FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
51
+ File.open(path, 'w') { |f| f.write(object.read) }
52
+ end
38
53
  end
39
54
  end
40
55
 
41
56
  # Connect to S3 using the AWS SDK
42
57
  # Retuns an aws bucket
58
+ #
43
59
  def connect
44
60
  AWS.config(access_key_id: @access_key, secret_access_key: @secret_key, region: @region)
45
- s3 = AWS.s3
46
- @bucket = s3.buckets[@bucket_name]
47
- unless @bucket.exists? || create_bucket(s3.buckets)
48
- abort "No bucket created. Change your config to point to an existing bucket."
49
- end
61
+ @s3 = AWS.s3
50
62
  end
51
63
 
52
64
  # Write site files to the selected bucket
65
+ #
53
66
  def write_files
54
67
  puts "Writing #{pluralize('file', site_files.size)}:" if @verbose
55
68
  site_files.each do |file|
@@ -64,6 +77,7 @@ module Octopress
64
77
  end
65
78
 
66
79
  # Delete files from the bucket, to ensure a 1:1 match with site files
80
+ #
67
81
  def delete_files
68
82
  if deletable_files.size > 0
69
83
  puts "Deleting #{pluralize('file', deletable_files.size)}:" if @verbose
@@ -78,30 +92,24 @@ module Octopress
78
92
  end
79
93
  end
80
94
 
81
- def create_bucket(buckets)
82
-
83
- if Deploy.ask_bool("S3 bucket '#{@bucket_name}' not found. Create one in region #{@region}?")
84
- @bucket = buckets.create(@bucket_name)
85
- puts "Created new bucket #{@bucket_name} in region #{@region}."
86
-
87
- configure_bucket
88
- true
89
- end
95
+ # Create a new S3 bucket
96
+ #
97
+ def add_bucket
98
+ puts @bucket_name
99
+ @bucket = @s3.buckets.create(@bucket_name)
100
+ puts "Created new bucket '#{@bucket_name}' in region '#{@region}'."
101
+ configure_bucket
90
102
  end
91
103
 
92
104
  def configure_bucket
93
- error_page = remote_path('404.html')
94
- index_page = remote_path('index.html')
105
+ error_page = @options['error_page'] || remote_path('404.html')
106
+ index_page = @options['index_page'] || remote_path('index.html')
95
107
 
96
- if Deploy.ask_bool("Bucket is not currently configured as a static websites. Configure it with index_page: #{index_page} and error_page: #{error_page}?")
97
- config = @bucket.configure_website do |cfg|
98
- cfg.index_document_suffix = index_page
99
- cfg.error_document_key = error_page
100
- end
101
- puts "Bucket configured with index_document: #{index_page} and error_document: #{error_page}."
102
- else
103
- puts "You'll want to configure your new bucket using the AWS management console."
108
+ config = @bucket.configure_website do |cfg|
109
+ cfg.index_document_suffix = index_page
110
+ cfg.error_document_key = error_page
104
111
  end
112
+ puts "Bucket configured with index_document: #{index_page} and error_document: #{error_page}."
105
113
  end
106
114
 
107
115
  def delete_files?
@@ -161,13 +169,14 @@ module Octopress
161
169
  # Return default configuration options for this deployment type
162
170
  def self.default_config(options={})
163
171
  <<-CONFIG
164
- bucket_name: #{options[:bucket_name]}
165
- access_key_id: #{options[:access_key_id]}
166
- secret_access_key: #{options[:secret_access_key]}
167
- region: #{options[:region] || 'us-east-1'}
168
- remote_path: #{options[:remote_path] || '/'}
169
- delete: #{options[:delete] || 'false'}
170
- verbose: #{options[:verbose] || 'true'}
172
+ #{"bucket_name: #{options[:bucket_name]}".ljust(40)} # Name of the S3 bucket where these files will be stored.
173
+ #{"access_key_id: #{options[:access_key_id]}".ljust(40)} # Get this from your AWS console at aws.amazon.com.
174
+ #{"secret_access_key: #{options[:secret_access_key]}".ljust(40)} # Keep it safe; keep it secret. Keep this file in your .gitignore.
175
+ #{"remote_path: #{options[:remote_path] || '/'}".ljust(40)} # relative path on bucket where files should be copied.
176
+
177
+ #{"# region: #{options[:region] || 'us-east-1'}".ljust(40)} # Region where your bucket is located.
178
+ #{"# delete: #{options[:delete] || 'true'}".ljust(40)} # Remove files from destination which do not match source files.
179
+ #{"# verbose: #{options[:verbose] || 'true'}".ljust(40)} # Print out all file operations.
171
180
  CONFIG
172
181
  end
173
182
 
@@ -1,5 +1,5 @@
1
1
  module Octopress
2
2
  module Deploy
3
- VERSION = "1.0.0.alpha.3"
3
+ VERSION = "1.0.0.rc.1"
4
4
  end
5
5
  end
@@ -17,8 +17,8 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_runtime_dependency "octopress", "~> 3.0.0.rc.1"
20
21
  spec.add_runtime_dependency "colorator"
21
- spec.add_runtime_dependency "aws-sdk"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
data/test/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "octopress", '~> 3.0.0.alpha.5'
4
3
  gem "octopress-deploy", path: "../"
5
4
  gem "pry-debugger"
6
5
  gem "aws-sdk"
data/test/test.rb CHANGED
@@ -67,9 +67,9 @@ def test_remote_git
67
67
 
68
68
  # Test remote git deployment
69
69
  #
70
- Octopress::Deploy.init_config('git', config_file: config, force_write_config: true, git_branch: 'test_git_deploy', git_url: repo)
70
+ Octopress::Deploy.init_config(method: 'git', config_file: config, force: true, git_branch: 'test_git_deploy', git_url: repo)
71
71
  Octopress::Deploy.push(config_file: config)
72
- Octopress::Deploy.pull('pull-git', config_file: config)
72
+ Octopress::Deploy.pull(dir: 'pull-git', config_file: config)
73
73
  diff_dir('_site', 'pull-git')
74
74
  end
75
75
 
@@ -86,7 +86,7 @@ def test_local_git
86
86
  # Test local git deployment
87
87
  #
88
88
  Octopress::Deploy.push(config_file: config, git_url: File.expand_path(repo), remote_path: 'site')
89
- Octopress::Deploy.pull('pull-git', config_file: config, git_url: File.expand_path(repo), remote_path: 'site')
89
+ Octopress::Deploy.pull(dir: 'pull-git', config_file: config, git_url: File.expand_path(repo), remote_path: 'site')
90
90
  diff_dir('_site', 'pull-git/site')
91
91
  end
92
92
 
@@ -99,9 +99,9 @@ def test_remote_rsync
99
99
 
100
100
  # Test remote git deployment
101
101
  #
102
- Octopress::Deploy.init_config('rsync', config_file: config, force_write_config: true, user: 'imathis@imathis.com', remote_path: '~/octopress-deploy/rsync/')
102
+ Octopress::Deploy.init_config(method: 'rsync', config_file: config, force: true, user: 'imathis@imathis.com', remote_path: '~/octopress-deploy/rsync/')
103
103
  Octopress::Deploy.push(config_file: config)
104
- Octopress::Deploy.pull('pull-rsync', config_file: config)
104
+ Octopress::Deploy.pull(dir: 'pull-rsync', config_file: config)
105
105
  diff_dir('_site', 'pull-rsync')
106
106
 
107
107
  end
@@ -115,9 +115,9 @@ def test_local_rsync
115
115
 
116
116
  # Test local git deployment
117
117
  #
118
- Octopress::Deploy.init_config('rsync', config_file: config, force_write_config: true, remote_path: 'local-rsync')
118
+ Octopress::Deploy.init_config(method: 'rsync', config_file: config, force: true, remote_path: 'local-rsync')
119
119
  Octopress::Deploy.push(config_file: config)
120
- Octopress::Deploy.pull('pull-rsync', config_file: config, user: false, remote_path: 'local-rsync')
120
+ Octopress::Deploy.pull(dir: 'pull-rsync', config_file: config, user: false, remote_path: 'local-rsync')
121
121
  diff_dir('_site', 'pull-rsync')
122
122
  end
123
123
 
@@ -126,7 +126,7 @@ def test_s3
126
126
  config = "_s3_deploy.yml"
127
127
  `rm -rf pull-s3`
128
128
  Octopress::Deploy.push(config_file: config)
129
- Octopress::Deploy.pull('pull-s3', config_file: config)
129
+ Octopress::Deploy.pull(dir: 'pull-s3', config_file: config)
130
130
  diff_dir('_site', 'pull-s3')
131
131
  end
132
132
 
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octopress-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha.3
4
+ version: 1.0.0.rc.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mathis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-20 00:00:00.000000000 Z
11
+ date: 2014-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: colorator
14
+ name: octopress
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 3.0.0.rc.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 3.0.0.rc.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: aws-sdk
28
+ name: colorator
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '>='
@@ -75,7 +75,6 @@ extra_rdoc_files: []
75
75
  files:
76
76
  - .gitignore
77
77
  - Gemfile
78
- - History.markdown
79
78
  - LICENSE.txt
80
79
  - README.md
81
80
  - Rakefile
data/History.markdown DELETED
@@ -1,13 +0,0 @@
1
- ## HEAD
2
-
3
- ### Major Enhancements
4
-
5
- ### Minor Enhancements
6
-
7
- * Ask user if they would like to ignore the `_deploy.yml` file & automate (#7)
8
-
9
- ### Bug Fixes
10
-
11
- * Symbolize all incoming keys to `Octopress::Deploy.init_config` (#4)
12
-
13
- ### Development Fixes