091ef1c6 |
require "rubygems" |
8698a276 |
require "bundler/setup" |
35a158dd |
require "stringex" |
091ef1c6 |
|
a2ab1d48 |
## -- Rsync Deploy config -- ##
# Be sure your public key is listed in your server's ~/.ssh/authorized_keys file |
9b52d40a |
ssh_user = "user@domain.com" |
a4177e14 |
ssh_port = "22" |
9b52d40a |
document_root = "~/website.com/" |
ea349cdf |
deploy_default = "rsync"
# This will be configured for you when you run config_deploy
deploy_branch = "gh-pages" |
a2ab1d48 |
|
59521e3d |
## -- Misc Configs -- ## |
a2ab1d48 |
|
59521e3d |
public_dir = "public" # compiled site directory
source_dir = "source" # source file directory
blog_index_dir = 'source' # directory for your blog's index page (if you put your index in source/blog/index.html, set this to 'source/blog')
deploy_dir = "_deploy" # deploy directory (for Github pages deployment)
stash_dir = "_stash" # directory to stash posts for speedy generation
posts_dir = "_posts" # directory for blog files
themes_dir = ".themes" # directory for blog files
new_post_ext = "markdown" # default new post file extension when using the new_post task
new_page_ext = "markdown" # default new page file extension when using the new_page task
server_port = "4000" # port for preview server eg. localhost:4000 |
399fe77f |
|
cc8985df |
|
17c59fb1 |
desc "Initial setup for Octopress: copies the default theme into the path of Jekyll's generator. Rake install defaults to rake install[classic] to install a different theme run rake install[some_theme_name]" |
d8b796ac |
task :install, :theme do |t, args| |
f03c4cdb |
if File.directory?(source_dir) || File.directory?("sass")
abort("rake aborted!") if ask("A theme is already installed, proceeding will overwrite existing files. Are you sure?", ['y', 'n']) == 'n'
end |
d8b796ac |
# copy theme into working Jekyll directories
theme = args.theme || 'classic' |
17c59fb1 |
puts "## Copying "+theme+" theme into ./#{source_dir} and ./sass" |
9e6a9518 |
mkdir_p source_dir
cp_r "#{themes_dir}/#{theme}/source/.", source_dir
mkdir_p "sass"
cp_r "#{themes_dir}/#{theme}/sass/.", "sass"
mkdir_p "#{source_dir}/#{posts_dir}"
mkdir_p public_dir |
d8b796ac |
end
|
14ba4cfd |
#######################
# Working with Jekyll #
####################### |
eefe29e5 |
|
a128d499 |
desc "Generate jekyll site"
task :generate do |
b38b6139 |
raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) |
a128d499 |
puts "## Generating Site with Jekyll" |
3ad77159 |
system "compass compile --css-dir #{source_dir}/stylesheets" |
a128d499 |
system "jekyll"
end
|
14ba4cfd |
desc "Watch the site and regenerate when it changes"
task :watch do |
b38b6139 |
raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) |
35a158dd |
puts "Starting to watch source with Jekyll and Compass." |
86c72a4c |
system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css") |
f1ebf358 |
jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll --auto") |
7c1c24f8 |
compassPid = Process.spawn("compass watch") |
35a158dd |
trap("INT") { |
56564830 |
[jekyllPid, compassPid].each { |pid| Process.kill(9, pid) rescue Errno::ESRCH }
exit 0 |
35a158dd |
}
|
56564830 |
[jekyllPid, compassPid].each { |pid| Process.wait(pid) } |
af719fb4 |
end
|
14ba4cfd |
desc "preview the site in a web browser"
task :preview do |
b38b6139 |
raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) |
35a158dd |
puts "Starting to watch source with Jekyll and Compass. Starting Rack on port #{server_port}" |
86c72a4c |
system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css") |
f1ebf358 |
jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll --auto") |
7c1c24f8 |
compassPid = Process.spawn("compass watch")
rackupPid = Process.spawn("rackup --port #{server_port}") |
35a158dd |
trap("INT") { |
56564830 |
[jekyllPid, compassPid, rackupPid].each { |pid| Process.kill(9, pid) rescue Errno::ESRCH }
exit 0 |
35a158dd |
}
|
56564830 |
[jekyllPid, compassPid, rackupPid].each { |pid| Process.wait(pid) } |
145f8104 |
end
|
4a403231 |
# usage rake new_post[my-new-post] or rake new_post['my new post'] or rake new_post (defaults to "new-post") |
ce662172 |
desc "Begin a new post in #{source_dir}/#{posts_dir}" |
4a403231 |
task :new_post, :title do |t, args| |
b38b6139 |
raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) |
ebd5fb00 |
mkdir_p "#{source_dir}/#{posts_dir}" |
4a403231 |
args.with_defaults(:title => 'new-post')
title = args.title |
35a158dd |
filename = "#{source_dir}/#{posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}" |
3f076772 |
if File.exist?(filename) |
b812500f |
abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' |
3f076772 |
end |
4a403231 |
puts "Creating new post: #{filename}"
open(filename, 'w') do |post| |
a6262dcb |
post.puts "---" |
e4c2d579 |
post.puts "layout: post" |
4b87a2fb |
post.puts "title: \"#{title.gsub(/&/,'&')}\"" |
4a403231 |
post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
post.puts "comments: true" |
17c59fb1 |
post.puts "categories: " |
a6262dcb |
post.puts "---"
end
end
|
4a403231 |
# usage rake new_page[my-new-page] or rake new_page[my-new-page.html] or rake new_page (defaults to "new-page.markdown") |
9189548e |
desc "Create a new page in #{source_dir}/(filename)/index.#{new_page_ext}" |
4a403231 |
task :new_page, :filename do |t, args| |
b38b6139 |
raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) |
4a403231 |
args.with_defaults(:filename => 'new-page')
page_dir = source_dir |
cc1cfa56 |
if args.filename =~ /(^.+\/)?([\w_-]+)(\.)?(.+)?/ |
6006ac8a |
page_dir += $4 ? "/#{$1}" : "/#{$1}#{$2}/"
name = $4 ? $2 : "index"
extension = $4 || "#{new_page_ext}" |
4a403231 |
filename = "#{name}.#{extension}"
mkdir_p page_dir
file = page_dir + filename |
3f076772 |
if File.exist?(file) |
b812500f |
abort("rake aborted!") if ask("#{file} already exists. Do you want to overwrite?", ['y', 'n']) == 'n' |
3f076772 |
end |
4a403231 |
puts "Creating new page: #{file}"
open(file, 'w') do |page|
page.puts "---"
page.puts "layout: page" |
4b87a2fb |
page.puts "title: \"#{$2.gsub(/[-_]/, ' ')}\"" |
4a403231 |
page.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
page.puts "comments: true"
page.puts "sharing: true"
page.puts "footer: true"
page.puts "---"
end
else
puts "Syntax error: #{args.filename} contains unsupported characters"
end
end
|
2f415171 |
# usage rake isolate[my-post]
desc "Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much quicker."
task :isolate, :filename do |t, args| |
b9b9eb09 |
stash_dir = "#{source_dir}/#{stash_dir}" |
2f415171 |
FileUtils.mkdir(stash_dir) unless File.exist?(stash_dir) |
b9b9eb09 |
Dir.glob("#{source_dir}/#{posts_dir}/*.*") do |post| |
2f415171 |
FileUtils.mv post, stash_dir unless post.include?(args.filename)
end
end
desc "Move all stashed posts back into the posts directory, ready for site generation."
task :integrate do |
b9b9eb09 |
FileUtils.mv Dir.glob("#{source_dir}/#{stash_dir}/*.*"), "#{source_dir}/#{posts_dir}/" |
2f415171 |
end
|
f6bf8943 |
desc "Clean out caches: .pygments-cache, .gist-cache, .sass-cache" |
21813059 |
task :clean do |
f6bf8943 |
rm_rf [".pygments-cache/**", ".gist-cache/**", ".sass-cache/**", "source/stylesheets/screen.css"] |
21813059 |
end
|
19df7e84 |
desc "Move sass to sass.old, install sass theme updates, replace sass/custom with sass.old/custom"
task :update_style, :theme do |t, args|
theme = args.theme || 'classic' |
6244feae |
if File.directory?("sass.old")
puts "removed existing sass.old directory" |
35a158dd |
rm_r "sass.old", :secure=>true |
6244feae |
end |
35a158dd |
mv "sass", "sass.old" |
19df7e84 |
puts "## Moved styles into sass.old/" |
35a158dd |
cp_r "#{themes_dir}/"+theme+"/sass/", "sass" |
19df7e84 |
cp_r "sass.old/custom/.", "sass/custom"
puts "## Updated Sass ##"
end
desc "Move source to source.old, install source theme updates, replace source/_includes/navigation.html with source.old's navigation"
task :update_source, :theme do |t, args|
theme = args.theme || 'classic' |
6244feae |
if File.directory?("#{source_dir}.old") |
724fd1db |
puts "## Removed existing #{source_dir}.old directory" |
35a158dd |
rm_r "#{source_dir}.old", :secure=>true |
6244feae |
end |
09057190 |
mkdir "#{source_dir}.old" |
724fd1db |
cp_r "#{source_dir}/.", "#{source_dir}.old"
puts "## Copied #{source_dir} into #{source_dir}.old/"
cp_r "#{themes_dir}/"+theme+"/source/.", source_dir, :remove_destination=>true
cp_r "#{source_dir}.old/_includes/custom/.", "#{source_dir}/_includes/custom/", :remove_destination=>true |
bdf904ad |
cp "#{source_dir}.old/favicon.png", source_dir |
35a158dd |
mv "#{source_dir}/index.html", "#{blog_index_dir}", :force=>true if blog_index_dir != source_dir |
09057190 |
cp "#{source_dir}.old/index.html", source_dir if blog_index_dir != source_dir && File.exists?("#{source_dir}.old/index.html") |
19df7e84 |
puts "## Updated #{source_dir} ##"
end
|
14ba4cfd |
##############
# Deploying #
##############
|
ea349cdf |
desc "Default deploy task" |
960a57c2 |
task :deploy do |
92ff4a9c |
Rake::Task[:copydot].invoke(source_dir, public_dir)
Rake::Task["#{deploy_default}"].execute |
04973e09 |
end
desc "Generate website and deploy" |
92ff4a9c |
task :gen_deploy => [:integrate, :generate, :deploy] do |
35a158dd |
end
desc "copy dot files for deployment" |
92ff4a9c |
task :copydot, :source, :dest do |t, args| |
5c275542 |
exclusions = [".", "..", ".DS_Store"] |
92ff4a9c |
Dir["#{args.source}/**/.*"].each do |file| |
1a562b95 |
if !File.directory?(file) && !exclusions.include?(File.basename(file)) |
92ff4a9c |
cp(file, file.gsub(/#{args.source}/, "#{args.dest}")); |
35a158dd |
end
end |
ea349cdf |
end
|
14ba4cfd |
desc "Deploy website via rsync" |
ea349cdf |
task :rsync do |
d8b796ac |
puts "## Deploying website via Rsync" |
af1f2af4 |
ok_failed system("rsync -avze 'ssh -p #{ssh_port}' --delete #{public_dir}/ #{ssh_user}:#{document_root}") |
82d0251d |
end
|
b9b9eb09 |
desc "deploy public directory to github pages" |
35a158dd |
multitask :push do |
b9b9eb09 |
puts "## Deploying branch to Github Pages "
(Dir["#{deploy_dir}/*"]).each { |f| rm_rf(f) } |
92ff4a9c |
Rake::Task[:copydot].invoke(public_dir, deploy_dir)
puts "\n## copying #{public_dir} to #{deploy_dir}" |
ffa68a1f |
cp_r "#{public_dir}/.", deploy_dir |
b9b9eb09 |
cd "#{deploy_dir}" do
system "git add ."
system "git add -u"
puts "\n## Commiting: Site updated at #{Time.now.utc}"
message = "Site updated at #{Time.now.utc}" |
31adeee1 |
system "git commit -m \"#{message}\"" |
b9b9eb09 |
puts "\n## Pushing generated #{deploy_dir} website" |
aa1abd08 |
system "git push origin #{deploy_branch} --force" |
b9b9eb09 |
puts "\n## Github Pages deploy complete"
end |
54766a0c |
end
|
1f9b596b |
desc "Update configurations to support publishing to root or sub directory"
task :set_root_dir, :dir do |t, args|
puts ">>> !! Please provide a directory, eg. rake config_dir[publishing/subdirectory]" unless args.dir
if args.dir
if args.dir == "/"
dir = ""
else
dir = "/" + args.dir.sub(/(\/*)(.+)/, "\\2").sub(/\/$/, '');
end
rakefile = IO.read(__FILE__)
rakefile.sub!(/public_dir(\s*)=(\s*)(["'])[\w\-\/]*["']/, "public_dir\\1=\\2\\3public#{dir}\\3")
File.open(__FILE__, 'w') do |f|
f.write rakefile
end
compass_config = IO.read('config.rb')
compass_config.sub!(/http_path(\s*)=(\s*)(["'])[\w\-\/]*["']/, "http_path\\1=\\2\\3#{dir}/\\3")
compass_config.sub!(/http_images_path(\s*)=(\s*)(["'])[\w\-\/]*["']/, "http_images_path\\1=\\2\\3#{dir}/images\\3")
compass_config.sub!(/http_fonts_path(\s*)=(\s*)(["'])[\w\-\/]*["']/, "http_fonts_path\\1=\\2\\3#{dir}/fonts\\3")
compass_config.sub!(/css_dir(\s*)=(\s*)(["'])[\w\-\/]*["']/, "css_dir\\1=\\2\\3public#{dir}/stylesheets\\3")
File.open('config.rb', 'w') do |f|
f.write compass_config
end
jekyll_config = IO.read('_config.yml')
jekyll_config.sub!(/^destination:.+$/, "destination: public#{dir}") |
12aed03e |
jekyll_config.sub!(/^subscribe_rss:\s*\/.+$/, "subscribe_rss: #{dir}/atom.xml")
jekyll_config.sub!(/^root:.*$/, "root: /#{dir.sub(/^\//, '')}") |
1f9b596b |
File.open('_config.yml', 'w') do |f|
f.write jekyll_config
end |
12aed03e |
rm_rf public_dir
mkdir_p "#{public_dir}#{dir}"
puts "## Site's root directory is now '/#{dir.sub(/^\//, '')}' ##" |
1f9b596b |
end
end
|
4efb2939 |
desc "Set up _deploy folder and deploy branch for Github Pages deployment" |
4d491494 |
task :setup_github_pages do |
4efb2939 |
repo_url = get_stdin("Enter the read/write url for your repository: ")
user = repo_url.match(/:([^\/]+)/)[1] |
35ebe0d6 |
branch = (repo_url.match(/\/[\w-]+.github.com/).nil?) ? 'gh-pages' : 'master' |
4efb2939 |
project = (branch == 'gh-pages') ? repo_url.match(/\/([^\.]+)/)[1] : ''
unless `git remote -v`.match(/origin.+?octopress.git/).nil?
# If octopress is still the origin remote (from cloning) rename it to octopress
system "git remote rename origin octopress"
if branch == 'master'
# If this is a user/organization pages repository, add the correct origin remote
# and checkout the source branch for committing changes to the blog source.
system "git remote add origin #{repo_url}"
puts "Added remote #{repo_url} as origin"
system "git config branch.master.remote origin"
puts "Set origin as default remote"
system "git branch -m master source"
puts "Master branch renamed to 'source' for committing your blog source files"
else
unless !public_dir.match("#{project}").nil?
system "rake set_root_dir[#{project}]"
end
end
end
url = "http://#{user}.github.com"
url += "/#{project}" unless project == ''
jekyll_config = IO.read('_config.yml')
jekyll_config.sub!(/^url:.*$/, "url: #{url}")
File.open('_config.yml', 'w') do |f|
f.write jekyll_config
end
rm_rf deploy_dir
mkdir deploy_dir |
6f4c842b |
cd "#{deploy_dir}" do |
4efb2939 |
system "git init" |
ce662172 |
system "echo 'My Octopress Page is coming soon …' > index.html" |
a128d499 |
system "git add ." |
31adeee1 |
system "git commit -m \"Octopress init\"" |
4efb2939 |
system "git branch -m gh-pages" unless branch == 'master'
system "git remote add origin #{repo_url}" |
ea349cdf |
rakefile = IO.read(__FILE__) |
4efb2939 |
rakefile.sub!(/deploy_branch(\s*)=(\s*)(["'])[\w-]*["']/, "deploy_branch\\1=\\2\\3#{branch}\\3") |
ea349cdf |
rakefile.sub!(/deploy_default(\s*)=(\s*)(["'])[\w-]*["']/, "deploy_default\\1=\\2\\3push\\3")
File.open(__FILE__, 'w') do |f|
f.write rakefile
end |
a128d499 |
end |
4efb2939 |
puts "\n---\n## Now you can deploy to #{url} with `rake deploy` ##" |
a128d499 |
end |
82d0251d |
|
a128d499 |
def ok_failed(condition)
if (condition)
puts "OK"
else
puts "FAILED"
end
end |
82d0251d |
|
f03c4cdb |
def get_stdin(message)
print message
STDIN.gets.chomp
end
def ask(message, valid_options)
if valid_options
answer = get_stdin("#{message} #{valid_options.to_s.gsub(/"/, '').gsub(/, /,'/')} ") while !valid_options.include?(answer)
else
answer = get_stdin(message)
end
answer
end
|
14ba4cfd |
desc "list tasks"
task :list do |
a817f997 |
puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:list]]).join(', ')}" |
14ba4cfd |
puts "(type rake -T for more detail)\n\n" |
9bd71339 |
end |