From f1ebf358693582d310aac2599870c197a5188e8f Mon Sep 17 00:00:00 2001 From: Frederic Hemberger Date: Wed, 23 Nov 2011 14:37:30 +0100 Subject: [PATCH 1/2] Introduce distinction between preview/productive site generation Posts which contain the YAML attribute `published: false` are usually not generated by Jekyll. With this patch they can be previewed just like published posts on localhost using `rake watch`or `rake preview`. NOTICE: Before pushing to the productive environment, use `rake generate` to update the public directory and remove posts which are flagged not to be published. --- Rakefile | 4 +-- plugins/preview_unpublished.rb | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 plugins/preview_unpublished.rb diff --git a/Rakefile b/Rakefile index 7d7f6d8..c3ad68b 100644 --- a/Rakefile +++ b/Rakefile @@ -59,7 +59,7 @@ task :watch do raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) puts "Starting to watch source with Jekyll and Compass." system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css") - jekyllPid = Process.spawn("jekyll --auto") + jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll --auto") compassPid = Process.spawn("compass watch") trap("INT") { @@ -75,7 +75,7 @@ task :preview do raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir) puts "Starting to watch source with Jekyll and Compass. Starting Rack on port #{server_port}" system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css") - jekyllPid = Process.spawn("jekyll --auto") + jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll --auto") compassPid = Process.spawn("compass watch") rackupPid = Process.spawn("rackup --port #{server_port}") diff --git a/plugins/preview_unpublished.rb b/plugins/preview_unpublished.rb new file mode 100644 index 0000000..20b27d6 --- /dev/null +++ b/plugins/preview_unpublished.rb @@ -0,0 +1,45 @@ +# Monkeypatch for Jekyll +# Introduce distinction between preview/productive site generation +# so posts with YAML attribute `published: false` can be previewed +# on localhost without being published to the productive environment. + +module Jekyll + + class Site + # Read all the files in //_posts and create a new Post + # object with each one. + # + # dir - The String relative path of the directory to read. + # + # Returns nothing. + def read_posts(dir) + base = File.join(self.source, dir, '_posts') + return unless File.exists?(base) + entries = Dir.chdir(base) { filter_entries(Dir['**/*']) } + + # first pass processes, but does not yet render post content + entries.each do |f| + if Post.valid?(f) + post = Post.new(self, self.source, dir, f) + + # Monkeypatch: + # On preview environment (localhost), publish all posts + if ENV.has_key?('OCTOPRESS_ENV') && ENV['OCTOPRESS_ENV'] == 'preview' + post.published = true + end + + if post.published && (self.future || post.date <= self.time) + self.posts << post + post.categories.each { |c| self.categories[c] << post } + post.tags.each { |c| self.tags[c] << post } + end + end + end + + self.posts.sort! + + # limit the posts if :limit_posts option is set + self.posts = self.posts[-limit_posts, limit_posts] if limit_posts + end + end +end \ No newline at end of file From 6714e5c7f5b3a874732e58dd2e6383e184da7019 Mon Sep 17 00:00:00 2001 From: Frederic Hemberger Date: Tue, 29 Nov 2011 15:13:50 +0100 Subject: [PATCH 2/2] Set flag in preview mode and re-generate files before deployment if necessary --- Rakefile | 7 +++++++ plugins/preview_unpublished.rb | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index c3ad68b..ebc386e 100644 --- a/Rakefile +++ b/Rakefile @@ -200,6 +200,13 @@ end desc "Default deploy task" task :deploy do + # Check if preview posts exist, which should not be published + if File.exists?(".preview-mode") + puts "## Found posts in preview mode, regenerating files ..." + File.delete(".preview-mode") + Rake::Task[:generate].execute + end + Rake::Task[:copydot].invoke(source_dir, public_dir) Rake::Task["#{deploy_default}"].execute end diff --git a/plugins/preview_unpublished.rb b/plugins/preview_unpublished.rb index 20b27d6..321ffd6 100644 --- a/plugins/preview_unpublished.rb +++ b/plugins/preview_unpublished.rb @@ -24,8 +24,11 @@ module Jekyll # Monkeypatch: # On preview environment (localhost), publish all posts - if ENV.has_key?('OCTOPRESS_ENV') && ENV['OCTOPRESS_ENV'] == 'preview' + if ENV.has_key?('OCTOPRESS_ENV') && ENV['OCTOPRESS_ENV'] == 'preview' && post.data.has_key?('published') && post.data['published'] == false post.published = true + # Set preview mode flag (if necessary), `rake generate` will check for it + # to prevent pushing preview posts to productive environment + File.open(".preview-mode", "w") {} end if post.published && (self.future || post.date <= self.time)