Fixed a bunch of permissions errors. Making the entire blog group-writable by default
[git-blog.git] / lib / git-blog.rb
blob78ea4c913828c8380ad896d104f51ebb4e6aed0d
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   cp GitBlog::Location / :prepped / '.gitignore', '.'
19   %w(welcome_to_your_git_blog.markdown .gitignore).each do |file|
20     cp GitBlog::Location / :prepped / :posts / file, 'posts'
21   end
22   %w(main.css post.haml index.haml).each do |file|
23     cp GitBlog::Location / :prepped / :design / file, 'design'
24   end
25   
26   Dir['**/**'].each do |file|
27     if File.directory? file
28       chmod 0775, file
29     else
30       chmod 0664, file
31     end
32   end
33   
34   blog.add
35   blog.commit_all("A bird... no, a plane... no, a git-blog!")
36 end
38 desc 'Attach the blog to a GitHub repository - can also clone an existing git-blog repository here'
39 task :github, :user_name, :repo_name do |_, params|
40   path = File.expand_path '.'
41   user_name = params[:user_name].nil? ? %x(whoami).chomp : params[:user_name]
42   repo_name = params[:repo_name].nil? ? File.basename(path) : params[:repo_name]
43   
44   github_url = "git@github.com:#{user_name.downcase}/#{repo_name.downcase}.git"
45   
46   if File.directory? File.join(path, 'posts') and
47     (blog = Git.open path rescue false)
48     
49     github = blog.add_remote 'github', github_url
50     blog.push github
51   else
52     system "git-init"
53     system "git-remote add -f github #{github_url}"
54     system "git checkout -b master github/master"
55   end
56 end
58 desc 'Prepare the blog to be served (configures hooks)'
59 task :servable do
60   should_be_initialized File.expand_path('.')
61   mv_f '.git' / :hooks / 'post-receive', '.git' / :hooks / 'post-receive.old'
62   cp GitBlog::Location / :prepped / 'post-receive.hook', '.git' / :hooks / 'post-receive'
63   chmod 0775, '.git' / :hooks / 'post-receive'
64   puts '** git-blog is prepared for serving (git post-recieve hook prepared)'
65 end
67 desc 'Create and open for editing a new post'
68 task :post do
69   @resume = false
70   temporary_post = :post_in_progress.markdown
71   
72   should_be_initialized File.expand_path('.')
73   
74   if File.file? temporary_post
75     puts '** You have an unfinished post from before,'
76     puts 'do you want to r)esume it or overwrite it with a n)ew one? '
77     case STDIN.gets
78     when /r/i
79       @resume = true
80     when /n/i
81       # do nothing, go on to overwriting it
82     else
83       raise 'Invalid entry, exiting out'
84     end
85   end
86   
87   unless @resume
88     File.open temporary_post, File::RDWR|File::TRUNC|File::CREAT, 0664 do |post|
89       post.puts  'Replace this text with your title!'
90       post.puts  '=================================='
91       post.print "\n"; post.close
92     end
93   end
94   
95   system "#{ENV['VISUAL']} #{temporary_post}"
96   
97   first_line = File.open(temporary_post, File::RDONLY).gets.chomp
98   markup = case first_line
99     when /^\</        then 'xhtml'
100     when /^\%/        then 'haml'
101     when /^\#|h\d\./  then 'textile'
102     else                   'markdown'
103   end
105   title = (first_line.match GitBlog::TitleRegexen[markup])[1]
106   path = :posts / title.slugize.send(markup.to_sym)
107   mv temporary_post, path
108   
109   blog = Git.open File.expand_path('.')
110   blog.add path
111   blog.commit "New post: #{title}"
112   
113   puts "Post '#{title.slugize}' comitted."
116 desc 'Push changes'
117 task :push, :remote_name do |_, params|
118   should_be_initialized File.expand_path('.')
119   
120   remote_name = params[:remote_name].nil? ? 'github' : params[:remote_name]
121   blog = Git.open '.'
122   remote = blog.remote remote_name
123   blog.push remote
124   puts "Changes pushed to #{remote_name}."
127 desc 'Remove all generated xhtml'
128 task :clobber do
129   Dir['posts/*.xhtml'].each do |path|
130     rm_f path
131   end
134 desc 'Generate xhtml files from posts and design'
135 task :deploy => :clobber do
136   should_be_initialized File.expand_path('.')
137   
138   Dir['posts/*.*'].each do |path|
139     markup = File.extname(path).downcase.gsub(/^\./,'')
140     content = IO.read path
141     first_line = content.match(/^(.*)\n/)[1]
142     
143     post_title = (first_line.match GitBlog::TitleRegexen[markup])[1]
144     parsed = begin
145       parser = GitBlog::Parsers.const_get(markup.gsub(/\b\w/){$&.upcase})
146       out = parser.send :parse, content
147       out
148     end
149     
150     template = IO.read :design / :post.haml
151     
152     completed = Haml::Engine.new(template, :filename => :design / :post.haml).
153       to_html(Object.new, {:content => parsed, :title => post_title})
154     
155     destination = path.gsub /.#{markup}$/, '.xhtml'
156     file = File.open destination, File::RDWR|File::TRUNC|File::CREAT, 0664
157     file.puts completed
158     file.close
159     puts "#{path} -> #{destination} (as #{markup})"
160   end
163 def should_be_initialized path
164   raise "** You haven't used `rake initialize` yet." unless
165     File.directory? File.join(path, 'posts') and
166     (blog = Git.open path rescue false)