Git 'dashed' commands are deprecated and no longer available with new installs from...
[git-blog.git] / lib / git-blog.rb
blob12822c0914a975338a5b53ae7a48f6403a18ff26
1 require 'fileutils'
2 include FileUtils
4 require 'git-blog/core'
5 require 'haml'
7 desc 'Setup the blog repository'
8 task :initialize do
9   path = File.expand_path '.'
10   
11   # Will create the repo if it doesn't exist
12   until (blog = Git.open path rescue false)
13     Git.init path
14   end
15   
16   cd path
17   mkdir 'posts'
18   mkdir 'design'
19   cp GitBlog::Scope / :prepped / '.gitignore', '.'
20   %w(welcome_to_your_git_blog.markdown .gitignore).each do |file|
21     cp GitBlog::Scope / :prepped / :posts / file, 'posts'
22   end
23   %w(main.css post.haml index.haml).each do |file|
24     cp GitBlog::Scope / :prepped / :design / file, 'design'
25   end
26   
27   Dir['**/**'].each do |file|
28     if File.directory? file
29       chmod 0775, file
30     else
31       chmod 0664, file
32     end
33   end
34   chmod 0755, '.git'
35   chmod 0664, '.gitignore'
36   chmod 0664, :posts / '.gitignore'
37   
38   blog.add
39   blog.commit_all("A bird... no, a plane... no, a git-blog!")
40 end
42 desc 'Attach the blog to a GitHub repository - can also clone an existing git-blog repository here'
43 task :github, :user_name, :repo_name do |_, params|
44   path = File.expand_path '.'
45   user_name = params[:user_name].nil? ? %x(whoami).chomp : params[:user_name]
46   repo_name = params[:repo_name].nil? ? File.basename(path) : params[:repo_name]
47   
48   github_url = "git@github.com:#{user_name.downcase}/#{repo_name.downcase}.git"
49   
50   if File.directory? File.join(path, 'posts') and
51     (blog = Git.open path rescue false)
52     
53     github = blog.add_remote 'github', github_url
54     blog.push github
55   else
56     system "git init"
57     system "git remote add -f github #{github_url}"
58     system "git checkout -b master github/master"
59   end
60 end
62 desc 'Prepare the blog to be served (configures hooks)'
63 task :servable do
64   should_be_initialized File.expand_path('.')
65   
66   mv '.git' / :hooks / 'post-receive', '.git' / :hooks / 'post-receive.old'
67   cp GitBlog::Scope / :prepped / 'post-receive.hook', '.git' / :hooks / 'post-receive'
68   chmod 0775, '.git' / :hooks / 'post-receive'
69   
70   puts '** git-blog is prepared for serving (git post-recieve hook prepared)'
71 end
73 desc 'Create and open for editing a new post'
74 task :post do
75   @resume = false
76   temporary_post = :post_in_progress.markdown
77   
78   should_be_initialized File.expand_path('.')
79   
80   if File.file? temporary_post
81     puts '** You have an unfinished post from before,'
82     puts 'do you want to r)esume it or overwrite it with a n)ew one? '
83     case STDIN.gets
84     when /r/i
85       @resume = true
86     when /n/i
87       # do nothing, go on to overwriting it
88     else
89       raise 'Invalid entry, exiting out'
90     end
91   end
92   
93   unless @resume
94     File.open temporary_post, File::RDWR|File::TRUNC|File::CREAT, 0664 do |post|
95       post.puts  'Replace this text with your title!'
96       post.puts  '=================================='
97       post.print "\n"; post.close
98     end
99   end
100   
101   system "#{ENV['VISUAL']} #{temporary_post}"
102   
103   first_line = File.open(temporary_post, File::RDONLY).gets.chomp
104   markup = case first_line
105     when /^\</        then 'xhtml'
106     when /^\%/        then 'haml'
107     when /^\#|h\d\./  then 'textile'
108     else                   'markdown'
109   end
111   title = (first_line.match GitBlog::TitleRegexen[markup])[1]
112   path = :posts / title.slugize.send(markup.to_sym)
113   mv temporary_post, path
114   
115   blog = Git.open File.expand_path('.')
116   blog.add path
117   blog.commit "New post: #{title}"
118   
119   puts "Post '#{title.slugize}' comitted."
122 desc 'Push changes'
123 task :push, :remote_name do |_, params|
124   should_be_initialized File.expand_path('.')
125   
126   remote_name = params[:remote_name].nil? ? 'github' : params[:remote_name]
127   blog = Git.open '.'
128   remote = blog.remote remote_name
129   blog.push remote
130   puts "Changes pushed to #{remote_name}."
133 desc 'Remove all generated xhtml'
134 task :clobber do
135   Dir['posts/*.xhtml'].each do |path|
136     rm_f path
137   end
140 # desc 'Invisible task, generates index.xhtml'
141 task :index do
142   path = File.expand_path('.')
143   repo = should_be_initialized path
144   
145   commits = repo.log.select {|c| c.message =~ /New post: /}
146   posts = []
147   commits.map do |commit|
148     title = commit.message.match(/New post: (.*)$/)[1]
149     posts << {:title => title, :slug => title.slugize}
150   end
151   
152   template = IO.read :design / :index.haml
153   
154   completed = Haml::Engine.new(template, :filename => :design / :index.haml).
155     to_html Object.new, :posts => posts
156   
157   destination = :index.xhtml
158   file = File.open destination, File::RDWR|File::TRUNC|File::CREAT, 0664
159   file.puts completed
160   file.close
161   puts "index.xhtml compiled"
164 desc 'Generate xhtml files from posts and design'
165 task :deploy => [:clobber, :index] do
166   should_be_initialized File.expand_path('.')
167   
168   Dir['posts/*.*'].each do |path|
169     markup = File.extname(path).downcase.gsub(/^\./,'')
170     content = IO.read path
171     first_line = content.match(/^(.*)\n/)[1]
172     
173     post_title = (first_line.match GitBlog::TitleRegexen[markup])[1]
174     parsed = begin
175       require "git-blog/parser/#{markup.downcase}"
176       parser = GitBlog::Parsers.const_get(markup.gsub(/\b\w/){$&.upcase})
177       parser.send :parse, content
178     end
179     
180     template = IO.read :design / :post.haml
181     
182     completed = Haml::Engine.new(template, :filename => :design / :post.haml).
183       to_html Object.new, {:content => parsed, :title => post_title}
184     
185     completed = GitBlog::Parsers::fix_pres(completed)
186     
187     destination = path.gsub /.#{markup}$/, '.xhtml'
188     file = File.open destination, File::RDWR|File::TRUNC|File::CREAT, 0664
189     file.puts completed
190     file.close
191     puts "#{path} -> #{destination} (as #{markup})"
192   end
196 # desc 'Invisible task, forces checkout (for the post-receive hook)'
197 task :force_checkout do
198   puts 'Forcing update of working copy...'
199   system 'git checkout -f master'
202 # desc 'Invisible task, run as the post-receive hook'
203 task :post_receive => [:force_checkout, :deploy]
205 def should_be_initialized path
206   raise "** You haven't used `rake initialize` yet." unless
207     File.directory? File.join(path, 'posts') and
208     (blog = Git.open path rescue false)
209   blog