#!/usr/bin/ruby -rcgi require "rubygems" require "haml" require "sass" class GitWiki attr_accessor :wiki_dir, :main_page, :base_url def initialize(wiki_dir="/home/sbecker/drunkenruby.com/public/wiki/",base_url="drunken.cgi?page=%s",main_page = "DrunkenRuby") @wiki_dir = wiki_dir @main_page = main_page @base_url = base_url end def not_found_message(*args) "Page not found!" end def save_wiki_page(page,data,message = "No Message") `echo "#{data.gsub('"','\"')}" > wiki/#{page} ` e = $?.exitstatus if e == 0 `cd wiki &&git add . && git commit -m "#{message}" ` true else false end end def get_wiki_revision_numbers(page,limit = 5 ) revisions = Array.new sys_rev = `cd wiki && git log --pretty=oneline #{page}` revisions = sys_rev.split("\n").map{|r| r.split[0]} if $?.exitstatus == 0 revisions[1..5] end def get_page(name, revision=nil) t = nil if revision.to_s == "" t = `cat wiki/#{name}` else t = `cd wiki &&git show #{revision}:#{name}` t = "
No rev:#{revision} found

"+ `cat wiki/#{name}` if $?.exitstatus != 0 end t end end begin wiki = GitWiki.new c = CGI.new('html4') n,d = c['page']!='' ? c['page']:wiki.main_page,c['data'] e = nil if d != '' if wiki.save_wiki_page(n,d,c["message"]) print c.header({'Status' => '302 Moved', 'location' => wiki.base_url%"#{n}&save_status=#{e}"}) end e = "There was an error saving." #the save failed else t = wiki.get_page(n,c["rev"]) || wiki.not_found_message revisions = wiki.get_wiki_revision_numbers(n) pages = `ls wiki`.split c.instance_eval{ out{ "#{Haml::Engine.new(File.read(File.join(File.dirname(__FILE__),"..","templates","main.haml"))).render(Object.new,{:pages=>pages,:current_page=>n,:wiki_page=>t,:wiki=>wiki})}" } } end rescue Exception =>e File.open("cow","w+"){|f| f.puts( e.message);f.puts(e.backtrace.join("\n"))} end