Passable post-recieve hook. Needs testing, I can't do so.
[git-blog.git] / lib / git-blog.rb
blob5d49ad469c0f8cd24f524266b70a62a888e932bd
1 require 'fileutils'
2 include FileUtils
4 require 'git-blog/core'
6 desc 'Setup the blog repository'
7 task :initialize do
8   path = File.expand_path '.'
9   
10   # Will create the repo if it doesn't exist
11   until (blog = Git.open path rescue false)
12     Git.init path
13   end
14   
15   cd path
16   mkdir 'posts'
17   mkdir 'design'
18   %w(welcome_to_your_git_blog.markdown .gitignore).each do |file|
19     cp GitBlog::Location / :defaults / file, 'posts'
20   end
21   %w(main.css post.haml index.haml).each do |file|
22     cp GitBlog::Location / :defaults / file, 'design'
23   end
24   
25   blog.add
26   blog.commit_all("A bird... no, a plane... no, a git-blog!")
27 end
29 desc 'Attach the blog to a GitHub repository'
30 task :github, :user_name, :repo_name do |_, params|
31   path = File.expand_path '.'
32   user_name = params[:user_name].nil? ? %x(whoami).chomp : params[:user_name]
33   repo_name = params[:repo_name].nil? ? File.basename(path) : params[:repo_name]
34   
35   is_initialized? path
36   
37   github = blog.add_remote 'github', "git@github.com:#{user_name.downcase}/#{repo_name.downcase}.git"
38   blog.push github
39 end
41 desc 'Prepare the blog to be served (configures hooks)'
42 task :servable do
43   is_initialized? File.expand_path('.')
44   cp GitBlog::Location / :defaults / 'post-recieve', '.git' / :hooks
45 end
47 desc 'Create and open for editing a new post'
48 task :post do
49   @resume = false
50   temporary_post = :post_in_progress.markdown
51   
52   is_initialized? File.expand_path('.')
53   
54   if File.file? temporary_post
55     puts '** You have an unfinished post from before,'
56     puts 'do you want to r)esume it or overwrite it with a n)ew one? '
57     case STDIN.gets
58     when /r/i
59       @resume = true
60     when /n/i
61       # do nothing, go on to overwriting it
62     else
63       raise 'Invalid entry, exiting out'
64     end
65   end
66   
67   unless @resume
68     File.open temporary_post, File::RDWR|File::TRUNC|File::CREAT do |post|
69       post.puts  'Replace this text with your title!'
70       post.puts  '=================================='
71       post.print "\n"; post.close
72     end
73   end
74   
75   system "#{ENV['VISUAL']} #{temporary_post}"
76   
77   first_line = File.open(temporary_post, File::RDWR|File::CREAT).gets.chomp
78   markup = case first_line
79     when /^\</        then 'xhtml'
80     when /^\%/        then 'haml'
81     when /^\#|h\d\./  then 'textile'
82     else                   'markdown'
83   end
85   title = (first_line.match GitBlog::TitleRegexen[markup])[1]
86   path = :posts / title.slugize.send(markup.to_sym)
87   mv temporary_post, path
88   
89   blog = Git.open File.expand_path('.')
90   blog.add path
91   blog.commit "New post: #{title}"
92   
93   puts "Post '#{title.slugize}' comitted."
94 end
96 desc 'Push changes'
97 task :push, :remote_name do |_, params|
98   is_initialized? File.expand_path('.')
99   
100   remote_name = params[:remote_name].nil? ? 'github' : params[:remote_name]
101   blog = Git.open '.'
102   remote = blog.remote remote_name
103   blog.push remote
104   puts "Changes pushed to #{remote_name}."
107 desc 'Remove all generated xhtml'
108 task :clobber do
109   Dir['posts/*.xhtml'].each do |path|
110     rm_f path
111   end
114 desc 'Generate xhtml files from posts and design'
115 task :deploy => :clobber do
116   is_initialized? File.expand_path('.')
117   
118   Dir['posts/*.*'].each do |path|
119     markup = File.extname(path).downcase.gsub(/^\./,'')
120     content = IO.read path
121     first_line = content.match(/^(.*)\n/)[1]
122     
123     post_title = (first_line.match GitBlog::TitleRegexen[markup])[1]
124     parsed = begin
125       parser = GitBlog::Parsers.const_get(markup.gsub(/\b\w/){$&.upcase})
126       out = parser.send :parse, content
127       out
128     end
129     
130     template = IO.read :design / :post.haml
131     
132     completed = Haml::Engine.new(template, :filename => :design / :post.haml).
133       to_html(Object.new, {:content => parsed, :title => post_title})
134     
135     destination = path.gsub /.#{markup}$/, '.xhtml'
136     file = File.open destination, File::RDWR|File::TRUNC|File::CREAT
137     file.puts completed
138     file.close
139     puts "#{path} -> #{destination} (as #{markup})"
140   end
143 def is_initialized?(path)
144   raise "** You haven't used `rake initialize` yet." unless
145     File.directory? File.join(path, 'posts') and
146     (blog = Git.open path rescue false)