<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/test_task_node.rb</filename>
    </added>
    <added>
      <filename>website/javascripts/code_highlighter.js</filename>
    </added>
    <added>
      <filename>website/javascripts/ruby.js</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -11,3 +11,25 @@ require 'lib/capitate/recipes'
 
 require 'erb'
 
+# Test
+task :test_egrep do  
+  role :test, &quot;10.0.6.118&quot;, :user =&gt; &quot;root&quot;
+  
+  found = utils.egrep(&quot;^mail.\\*&quot;, &quot;/etc/syslog.conf&quot;)
+  puts &quot;Found? #{found}&quot;
+  
+  found = utils.egrep(&quot;^fooo&quot;, &quot;/etc/syslog.conf&quot;)
+  puts &quot;Found? #{found}&quot;
+end
+
+task :test_app do  
+  set :application, &quot;sick&quot;
+  set :deploy_to, &quot;/var/www/apps/sick&quot;
+  role :web, &quot;10.0.6.118&quot;, :user =&gt; &quot;root&quot;
+  role :app, &quot;10.0.6.118&quot;, :user =&gt; &quot;root&quot;
+end
+
+task :test_install do
+  load File.dirname(__FILE__) + &quot;/lib/deployment/centos-5.1-64-web/install.rb&quot;
+  role :test, &quot;10.0.6.118&quot;, :user =&gt; &quot;root&quot;
+end</diff>
      <filename>Capfile</filename>
    </modified>
    <modified>
      <diff>@@ -12,13 +12,21 @@ module Capitate
       # establishes connections to them, and then yields that list of
       # servers.
       #
-      # Overriden to handle NoMatchingServersError as NON-FATAL
+      # If you set:
+      #
+      #   set :ignore_missing_roles, true
+      #
+      # Overriden to handle NoMatchingServersError as NON-FATAL.      
       #  
-      def execute_on_servers_with_capitate(options={}, &amp;block)
-        begin
+      def execute_on_servers_with_capitate(options={}, &amp;block)        
+        if exists?(:ignore_missing_roles) &amp;&amp; fetch(:ignore_missing_roles)        
+          begin
+            execute_on_servers_without_capitate(options, &amp;block)
+          rescue Capistrano::NoMatchingServersError =&gt; e
+            logger.important &quot;`#{current_task.fully_qualified_name}' is only run for servers matching #{current_task.options.inspect}, but no servers matched&quot;
+          end
+        else
           execute_on_servers_without_capitate(options, &amp;block)
-        rescue Capistrano::NoMatchingServersError =&gt; e
-          logger.important &quot;`#{current_task.fully_qualified_name}' is only run for servers matching #{current_task.options.inspect}, but no servers matched&quot;
         end
       end
   
@@ -59,7 +67,7 @@ module Capitate
         clear_sessions
       end
   
-      # Yields the previous user.
+      # Perform action as a different user. Yields the previous user to the block.
       #
       # ==== Options
       # +new_user+:: User to become
@@ -81,8 +89,7 @@ module Capitate
         clear_sessions
       end
   
-      # Close all open sessions.
-      # Will force user to re-login.
+      # Close all open sessions, and will force user to re-login.
       def clear_sessions    
         sessions.each do |key, session|
           logger.info &quot;Closing: #{key}&quot;
@@ -91,15 +98,7 @@ module Capitate
         sessions.clear    
         reset_password
       end
-  
-      # Reset the password.
-      # Display the current user that is asking for the password.
-      def reset_password
-        set :password, Proc.new {
-          Capistrano::CLI.password_prompt(&quot;Password (for user: #{user}): &quot;)
-        }  
-      end
-    
+      
     end
   end
 end</diff>
      <filename>lib/capitate/cap_ext/connections.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,8 @@ module Capitate::CapExt::RunVia
   
   # Invoke command with current run_method setting.
   #
+  # Chooses +sudo+ or +run+ based on &lt;tt&gt;:run_method&lt;/tt&gt; setting.
+  #
   # ==== Options
   # +cmd+:: Command to run
   # +options+:: Options (see invoke_command options)</diff>
      <filename>lib/capitate/cap_ext/run_via.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@ module Capitate
         base.send :alias_method, :fetch, :fetch_with_capitate
       end
     
-      # Fetch (alias method chained) variable.
+      # Fetch.
       # Displays usage message from recipe docs if variable not found.
       #
       # See capistrano fetch for usage info.
@@ -72,7 +72,7 @@ module Capitate
         nil        
       end
       
-      # Fetch roles with name and options
+      # Fetch roles with name and options.
       # I don't actually use this.
       #
       # ==== Options</diff>
      <filename>lib/capitate/cap_ext/variables.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,17 +5,16 @@ require 'yaml'
 module Capitate::Plugins::Base
   
   # Project root. Fetch from :project_root, or fall back to RAILS_ROOT.
-  #
   def root
-    if respond_to?(:fetch)
-      return fetch(:project_root)
-    else
-      RAILS_ROOT
-    end
+    return fetch(:project_root) if exists?(:project_root)
+    RAILS_ROOT
   end
     
   # Path relative to project root.
-  # Project root is set via, set :project_root, &quot;path/to/project&quot; in Capfile.
+  #
+  # To set the project root:
+  #
+  #   set :project_root, &quot;path/to/project&quot; in Capfile.
   #
   # ==== Options
   # +path+:: Relative path
@@ -48,7 +47,7 @@ module Capitate::Plugins::Base
   # Usage for current task.
   #
   # ==== Options
-  # +variable+:: Missing variable setting
+  # +variable+:: Missing variable setting (to display as not set)
   #
   # ==== Examples
   #   usage(:gem_list) =&gt; &quot;Description from task definition.&quot;
@@ -86,7 +85,13 @@ module Capitate::Plugins::Base
     s.split(&quot;\n&quot;).collect { |sp| &quot;#{indentation}#{sp}&quot;}.join(&quot;\n&quot;)
   end
   
-  # Unindent, lifted from capistrano bin/capify
+  # Unindent.
+  #
+  # Lifted from capistrano bin/capify
+  #
+  # ==== Options
+  # +string+:: String to unindent
+  #
   def unindent(string)
     return &quot;&quot; if string.blank?
     if string =~ /\A(\s*)/
@@ -96,7 +101,7 @@ module Capitate::Plugins::Base
     string
   end  
   
-  # Load all tasks
+  # Load all tasks into an array.
   def load_all_tasks
     tasks = []
     top.namespaces.each do |namespace|
@@ -105,7 +110,7 @@ module Capitate::Plugins::Base
     tasks
   end
   
-  # Task tree
+  # Build a task tree, consisting of task nodes.  
   def task_tree
     top_node = Capitate::TaskNode.new(&quot;top&quot;)
     
@@ -116,7 +121,7 @@ module Capitate::Plugins::Base
   end
 
 protected
-  
+    
   def load_tasks(namespace, tasks = [])    
     recipe = namespace.last
     </diff>
      <filename>lib/capitate/plugins/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,16 +4,17 @@ module Capitate::Plugins::Build
   #
   # ==== Options
   # +name+:: Name for app
-  # +options+:: Options 
-  # - +build_dest+:: Place to build from, ex. /usr/src, defaults to /tmp/name
-  # - +url+:: URL to download package from
-  # - +configure_options+:: Options for ./configure
-  # - +symlink+:: After install, list of source, dest pairs to symlink 
+  # +options+:: Options (See Make install options)
+  #
+  # ==== Make install options
+  # +build_dest+:: Place to build from, ex. /usr/src, defaults to /tmp/name
+  # +url+:: URL to download package from
+  # +configure_options+:: Options for ./configure
+  # +symlink+:: After install, list of source, dest pairs to symlink 
   #    [ { &quot;/usr/local/sphinx-0.9.8-rc1&quot; =&gt; &quot;/usr/local/sphinx&quot; }, ... ]
   #    ln -s /usr/local/sphinx-0.9.8-rc1 /usr/local/sphinx
-  #
-  # - +unpack_dir+:: Directory that is unpacked from tgz (if not matching the file name)
-  # - +to_log+:: If specified, will redirect output to this path
+  # +unpack_dir+:: Directory that is unpacked from tgz (if not matching the file name)
+  # +to_log+:: If specified, will redirect output to this path
   #
   # ==== Examples (in capistrano task)
   #   build.make_install(&quot;nginx&quot;, { :url =&gt; &quot;http://sysoev.ru/nginx/nginx-0.5.35.tar.gz&quot;, ... })
@@ -44,9 +45,11 @@ module Capitate::Plugins::Build
   # 
   # ==== Options
   # +name+:: Name for app
-  # +options+:: Options
-  # - +build_dest+:: Place to build from, ex. /usr/src, defaults to /tmp/name
-  # - +url+:: URL to download package from
+  # +options+:: Options (see Install options)
+  #
+  # ==== Install options
+  # +build_dest+:: Place to build from, ex. /usr/src, defaults to /tmp/name
+  # +url+:: URL to download package from
   # 
   # ==== Examples (in capistrano task)
   #   script.make(&quot;rubygems&quot;, { :url =&gt; :url =&gt; &quot;http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz&quot; }) do |dir|</diff>
      <filename>lib/capitate/plugins/build.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,10 +16,12 @@ module Capitate::Plugins::Prompt
   #
   # ==== Options
   # +label+:: Label
-  # +options+:: Options
-  # - +verify+:: If true, prompt twice and verify
-  # - +lazy+:: If true, returns a Proc. _Defaults to true_
-  # - +check_hash+:: If present, checks that md5 is same as password md5
+  # +options+:: Options (see Password options)
+  #
+  # ==== Password options
+  # +verify+:: If true, prompt twice and verify
+  # +lazy+:: If true, returns a Proc. _Defaults to true_
+  # +check_hash+:: If present, checks that md5 is same as password md5
   #
   def password(label, options = {})
     
@@ -67,10 +69,6 @@ module Capitate::Plugins::Prompt
     password_prompt.call
   end  
   
-  def check_password_hash(password, hash)
-    MD5.md5()
-  end
-  
 end
 
 Capistrano.plugin :prompt, Capitate::Plugins::Prompt</diff>
      <filename>lib/capitate/plugins/prompt.rb</filename>
    </modified>
    <modified>
      <diff>@@ -36,9 +36,11 @@ module Capitate::Plugins::Script
   # ==== Options
   # +url+:: URL to download
   # +dest+:: Destination directory
-  # +options+::
-  # - +clean+:: If true will remove the unpacked directory. _Defaults to true_
-  # - +unpack_dir+:: Directory that is unpacked from tgz (if not matching the file name)
+  # +options+:: Options (see Unpack options)
+  #
+  # ==== Unpack options
+  # +clean+:: If true will remove the unpacked directory. _Defaults to true_
+  # +unpack_dir+:: Directory that is unpacked from tgz (if not matching the file name)
   #
   # ==== Examples
   #   script.unpack(&quot;http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz&quot;, &quot;/tmp/rubygems&quot;) do
@@ -80,7 +82,7 @@ module Capitate::Plugins::Script
   #
   # ==== Options
   # +cmds+:: Commands (separated by newlines)
-  # +options+:: See invoke_command options
+  # +options+:: See Capistrano invoke_command options
   #
   def run_all(cmds, options = {}, &amp;block)    
     cmds.split(&quot;\n&quot;).each do |cmd|</diff>
      <filename>lib/capitate/plugins/script.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 module Capitate::Plugins::Templates
   
-  # Load template. If extension is erb will be evaluated with binding.
+  # Load template. If the extension is .erb will be evaluated with binding.
   #
   # You can add to the list of places we search for templates by setting:
   #
@@ -17,8 +17,9 @@ module Capitate::Plugins::Templates
   # +override_binding+:: Binding to override, otherwise uses current (task) binding
   #
   # ==== Examples
-  #   template.load(&quot;memcached/memcached.monitrc.erb&quot;)
-  #   put template.load(&quot;memcached/memcached.monitrc.erb&quot;), &quot;/tmp/memcached.monitrc&quot;
+  #   template.load(&quot;memcached/memcached.monitrc.erb&quot;) =&gt; &quot;This is the text of eval'ed template found at ...&quot;
+  #
+  #   put template.load(&quot;memcached/memcached.monitrc.erb&quot;), &quot;/tmp/memcached.monitrc&quot; # Uploads eval'ed template to remote /tmp/ directory
   #
   def load(path, override_binding = nil)
     template_dirs_found = template_dirs.select { |dir| File.exist?(&quot;#{dir}/#{path}&quot;) }
@@ -69,9 +70,16 @@ module Capitate::Plugins::Templates
     
 protected
 
-  # Load all possible places for templates
+  # Load all possible places for templates.
+  #
+  # Returns:
+  # * the &lt;tt&gt;:templates_dirs&lt;/tt&gt; setting (if set)
+  # * the current directory
+  # * the &lt;tt&gt;:project_root&lt;/tt&gt; setting (if set)
+  # * the gem templates path
+  #
   def template_dirs
-    @template_dir ||= begin
+    @template_dirs ||= begin
       template_dirs = []      
       template_dirs += fetch(:templates_dirs) if exists?(:templates_dirs)      
       template_dirs &lt;&lt; &quot;.&quot;
@@ -88,11 +96,12 @@ protected
   
   # Get full template path from relative path.
   #
-  # Something like &lt;tt&gt;monit/monit.cnf =&gt; /usr/lib/..../capitate/lib/templates/monit/monit.cnf&lt;/tt&gt;.
-  #
   # ==== Options 
   # +template_path+:: Relative path
   #
+  # ==== Examples
+  #    gem_template_path(&quot;monit/monit.cnf&quot;) =&gt; /usr/lib/..../capitate/lib/templates/monit/monit.cnf
+  #
   def gem_template_path(template_path)
     File.join(gem_templates_root, template_path)
   end</diff>
      <filename>lib/capitate/plugins/templates.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,12 @@
 module Capitate::Plugins::Upload
   
   # Upload file with source path.
+  #
   # Data is streamed.
   #
   # ==== Options
   # +src_path+:: Source path
-  # +dest_path:: Remote destination path
+  # +dest_path+:: Remote destination path
   # +options+:: Options (see capistrano 'put')
   #
   # ==== Examples</diff>
      <filename>lib/capitate/plugins/upload.rb</filename>
    </modified>
    <modified>
      <diff>@@ -27,12 +27,14 @@ module Capitate::Plugins::Utils
   # ==== Options
   # +template_path+:: Path to template
   # +destination+:: Remote path to evaluated template
-  # +options+::
-  # - +user+:: User to install (-o)
-  # - +mode+:: Mode to install file (-m)
+  # +options+:: Options (see Install template options)
+  #
+  # ==== Install template options
+  # +user+:: User to install (-o)
+  # +mode+:: Mode to install file (-m)
   #
   # ==== Example
-  #   utils.install_template(&quot;monit/memcached.monitrc.erb&quot;, &quot;/etc/monit/memcached.monitrc&quot;)
+  #   utils.install_template(&quot;monit/memcached.monitrc.erb&quot;, &quot;/etc/monit/memcached.monitrc&quot;, :user =&gt; &quot;root&quot;, :mode =&gt; &quot;600&quot;)
   #
   def install_template(template_path, destination, options = {})
     # Truncate extension
@@ -96,7 +98,7 @@ module Capitate::Plugins::Utils
   # ==== Options
   # +path+:: Path to file to append to
   # +data+:: String data to append
-  # +check+:: If not nil, will check to see if egrep matches &quot;^string_to_check&quot; and will not re-append
+  # +check+:: If not nil, will check to see if egrep matches this regex and will not re-append
   # +left_strip+:: If true (default), remove whitespace before lines
   # +should_exist+:: If true (default), raise error if file does not exist
   #</diff>
      <filename>lib/capitate/plugins/utils.rb</filename>
    </modified>
    <modified>
      <diff>@@ -50,13 +50,11 @@ class Capitate::TaskNode
   end
   
   # Get &quot;child&quot; nodes (sorted).
-  #
   def sorted_nodes
     nodes.sort_by(&amp;:name)
   end
   
   # Get tasks (sorted).
-  #
   def sorted_tasks
     tasks.sort_by(&amp;:fully_qualified_name) # { |t| t.name.to_s }
   end
@@ -102,11 +100,16 @@ class Capitate::TaskNode
   # +title+:: Title and h1 for page, defaults to name
   # +options+:: Options
   #
+  # ==== Write doc options
+  # +include_source+:: If true, include source
+  #
   def write_doc(dir, file_name = nil, title = nil, options = {}, &amp;block)
     
     file_name ||= full_name
     title ||= full_name(&quot;:&quot;)
     
+    
+    
     path = &quot;#{dir}/#{file_name}.txt&quot;
     puts &quot;%10s %-30s&quot; % [ &quot;create&quot;, path ]
     
@@ -159,15 +162,26 @@ class Capitate::TaskNode
       unless tasks.empty?
         file.puts &quot;\n\nh2. Task documentation\n\n&quot;        
         sorted_tasks.each do |task|
+          file.puts %{&lt;div class=&quot;recipe&quot;&gt;\n\n}
           file.puts &quot;h3(##{task.fully_qualified_name}). #{task.fully_qualified_name}\n\n&quot;
-          file.puts &quot;#{unindent(task.desc)}\n\n\n\n&quot;
+          file.puts &quot;#{unindent(task.desc)}\n\n&quot;
+          
+          if options[:include_source]
+            file_name, source, comments = Capitate::TaskNode.find_source(task.fully_qualified_name)
+            unless source.blank?
+              file.puts &quot;\n\n&lt;pre&gt;&lt;code class='ruby'&gt;#{source}&lt;/code&gt;&lt;/pre&gt;\n\n&quot;
+            end
+          end
+          
+          file.puts &quot;&lt;/div&gt;\n\n\n&quot;
         end
       end
       
       #
       # Write doc (recursively for &quot;child&quot; namespace)
+      #
       sorted_nodes.each do |snode|
-        snode.write_doc(dir)
+        snode.write_doc(dir, nil, nil, options)
       end
       
       # If block then let it do stuff with open file
@@ -179,7 +193,6 @@ class Capitate::TaskNode
   end
   
   # Node to string. 
-  #
   def to_s(level = 0)
     spaces = &quot;     &quot;
     indent = (0...level).collect { spaces }.join(&quot;&quot;) 
@@ -198,36 +211,85 @@ class Capitate::TaskNode
     end
     s
   end
+  
+  # Weird way of getting at original source
+  def self.find_source(full_task_name)
     
-  # Class methods  
-  class &lt;&lt; self
-    
-    # Create nodes and and task to node.
-    #
-    # If task is &quot;mysql:centos:install&quot;, the nodes will look like:
-    #
-    #   (top node) -&gt; (mysql node) -&gt; (centos node; w/ tasks: install)
-    #
-    # ==== Options
-    # +top_node+:: Node to start at
-    # +task+:: Task to add
-    #    
-    def populate_with_task(top_node, task)
-      node_names = task.namespace.fully_qualified_name.split(&quot;:&quot;)
-      
-      node = top_node
-      
-      node_names.each do |name|
-        parent_node = node
-        node = parent_node.find(name)
-        if !node
-          node = self.new(name, parent_node)
-          parent_node.add_node(node)
-        end
+    # Load all the recipes into map; I know you think this is cheesy
+    @@recipes_text_map ||= begin        
+      map = {}
+      Dir[File.dirname(__FILE__) + &quot;/../recipes/**/*.rb&quot;].each do |file|
+        file_text = &quot;&quot;
+        File.open(file) { |f| file_text = f.read }
+        map[file] = file_text
       end
-      node.add_task(task)      
+      map 
     end
-  
+    
+    name_parts = full_task_name.split(&quot;:&quot;)
+    pre_namespaces = name_parts.split(&quot;:&quot;)[0..-3]
+    namespace_before = name_parts[-2]
+    task_name = full_task_name.split(&quot;:&quot;).last
+    
+    # Regex attempt #1: Try to un-greedy load up to next task
+    # Need this because don't know how to be un-greedy for task end and greedy for internal ends
+    regexs1 = []
+    regexs1 += pre_namespaces.collect do |section|
+      &quot;namespace\\s+:#{section}\\s+do.*&quot;
+    end
+    regexs1 &lt;&lt; &quot;namespace\\s+:#{namespace_before}\\s+do(.*)&quot;
+    regexs1 &lt;&lt; &quot;(task :#{task_name}.*?do.*end).*task.*&quot;
+    
+    
+    # Regex attempt #2: 
+    regexs2 = []
+    regexs2 += pre_namespaces.collect do |section|
+      &quot;namespace\\s+:#{section}\\s+do.*&quot;
+    end
+    regexs2 &lt;&lt; &quot;namespace\\s+:#{namespace_before}\\s+do(.*)&quot;
+    regexs2 &lt;&lt; &quot;(task :#{task_name}.*?do.*end).*&quot;
+    (name_parts.length - 1).times do
+      regexs2 &lt;&lt; &quot;.*end&quot;
+    end  
+    
+    @@recipes_text_map.each do |file, file_text|        
+      if file_text =~ /#{regexs1.to_s}/m or file_text =~ /#{regexs2.to_s}/m
+        comment_section = $1
+        source_section = $2
+        return [ file, source_section, comment_section ]
+      end
+    end
+    
+    puts &quot;[WARNING] Source not found for: #{full_task_name}&quot;
+    
+    nil
+  end
+    
+  # Create nodes and and task to node.
+  #
+  # If task is &quot;mysql:centos:install&quot;, the nodes will look like:
+  #
+  #   (top node) -&gt; (mysql node) -&gt; (centos node; w/ tasks: install)
+  #
+  # ==== Options
+  # +top_node+:: Node to start at
+  # +task+:: Task to add
+  #    
+  def self.populate_with_task(top_node, task)
+    node_names = task.namespace.fully_qualified_name.split(&quot;:&quot;)
+    
+    node = top_node
+    
+    node_names.each do |name|
+      parent_node = node
+      node = parent_node.find(name)
+      if !node
+        node = self.new(name, parent_node)
+        parent_node.add_node(node)
+      end
+    end
+    node.add_task(task)      
   end
+
 end
   
\ No newline at end of file</diff>
      <filename>lib/capitate/task_node.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,9 +7,19 @@ namespace :backgroundrb do
   
     pid_file = &quot;\#{CONFIG_FILE[:backgroundrb][:pid_file]}&quot;
   
-  *backgroundrb_host*: Backgroundrb host. _Defaults to 0.0.0.0_\n
-  *backgroundrb_port*: Backgroundrb port. _Defaults to 11006_\n
-  *backgroundrb_yml_template*: Backgroundrb yml template. _Defaults to @backgroundrb/backgroundrb.yml.erb@ in this gem.\n
+  &lt;dl&gt;
+    &lt;dt&gt;backgroundrb_host&lt;/dt&gt;
+    &lt;dd&gt;Backgroundrb host&lt;/dd&gt;
+    &lt;dd class=&quot;default&quot;&gt;Defaults to @0.0.0.0@&lt;/dd&gt;
+    
+    &lt;dt&gt;backgroundrb_port&lt;/dt&gt;
+    &lt;dd&gt;Backgroundrb port&lt;/dd&gt;
+    &lt;dd class=&quot;default&quot;&gt;Defaults to @11006@&lt;/dd&gt;
+  
+    &lt;dt&gt;backgroundrb_yml_template&lt;/dt&gt;
+    &lt;dd&gt;Backgroundrb yml template&lt;/dd&gt;
+    &lt;dd class=&quot;default&quot;&gt;Defaults to @backgroundrb/backgroundrb.yml.erb@ in this gem.&lt;/dd&gt;
+  &lt;/dl&gt;
   DESC
   task :setup do
     fetch_or_default(:backgroundrb_host, &quot;0.0.0.0&quot;)
@@ -21,10 +31,10 @@ namespace :backgroundrb do
   end
   
   desc &lt;&lt;-DESC
-  Symlink backgroundrb config into release path.  
+  Symlink backgroundrb config into current path.  
   DESC
   task :update_code do
-    run &quot;ln -nfs #{shared_path}/config/backgroundrb.yml #{release_path}/config/backgroundrb.yml&quot; 
+    run &quot;ln -nfs #{shared_path}/config/backgroundrb.yml #{current_path}/config/backgroundrb.yml&quot; 
   end
   
 end
\ No newline at end of file</diff>
      <filename>lib/recipes/backgroundrb.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,8 +5,14 @@ namespace :backgroundrb do
     desc &lt;&lt;-DESC
     Setup backgroundrb for application.
     
-    *backgroundrb_bin_path*: Path to start. _Defaults to @{current_path}/script/backgroundrb start@_\n
-    *backgroundrb_pid_path*: Path to backgroundrb pid file. _Defaults to @{shared_path}/pids/backgroundrb.pid@_\n
+    &lt;dl&gt;
+    &lt;dt&gt;backgroundrb_bin_path&lt;/dt&gt;
+    &lt;dd&gt;Path to start.
+    &lt;dd class=&quot;default&quot;&gt;Defaults to @\#{current_path}/script/backgroundrb -e production start@&lt;/dd&gt;
+    &lt;dt&gt;backgroundrb_pid_path&lt;/dt&gt;
+    &lt;dd&gt;Path to backgroundrb pid file&lt;/dd&gt;
+    &lt;dd class=&quot;default&quot;&gt;Defaults to @\#{shared_path}/pids/backgroundrb.pid@&lt;/dd&gt;
+    &lt;/dl&gt;
     DESC
     task :setup do       
       </diff>
      <filename>lib/recipes/centos/backgroundrb.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,8 @@ namespace :docs do
   desc &lt;&lt;-DESC
   Generate documentation for all currently loaded recipes. Assumes textile formatting.
   
+  This recipe generated this documentation.
+  
   *docs_recipes_dir*: Destination directory. _Defaults to &quot;docs/recipes&quot;_
   
   @set :docs_recipes_dir, &quot;docs/recipes&quot;@
@@ -24,7 +26,7 @@ namespace :docs do
     FileUtils.rm_rf(docs_recipes_dir) if docs_recipes_clear
     FileUtils.mkdir_p(docs_recipes_dir)
     
-    top_node.write_doc(docs_recipes_dir, &quot;index&quot;, &quot;Recipes&quot;)
+    top_node.write_doc(docs_recipes_dir, &quot;index&quot;, &quot;Recipes&quot;, :include_source =&gt; true)
     
   end
 end</diff>
      <filename>lib/recipes/docs.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,15 @@ blockquote {
   font-size: 80%;
 }
 
+dt {
+  padding-top:20px;
+  font-weight:bold;  
+}
+
+dd.default {
+  font-weight:italic;
+}
+
 #main {
   width: 45em;
   padding: 0;
@@ -77,14 +86,19 @@ td {
 	color: #995000;
 }
 pre, code {
-  font-family: monospace;
-  font-size: 90%;
-  line-height: 1.4em;
-  color: #ff8;
+  font-family: &quot;Bitstream Vera Sans Mono&quot;, monospace;
+	text-align: left;
+	font-size: 0.9em;
+  line-height: 1.4em;  
   background-color: #111;
-  padding: 2px 10px 2px 10px;
+  padding: 4px 10px 4px 10px;
   overflow: auto;
 }
+
+code {
+  color: #EEE;
+}
+
 .comment { color: #aaa; font-style: italic; }
 .keyword { color: #eff; font-weight: bold; }
 .punct { color: #eee; font-weight: bold; }
@@ -108,28 +122,26 @@ pre, code {
   border: 3px solid #141331;
 }
 
-.landing h1 {
-  
-}
-
-#recipes {
-
-}
-
-.recipes pre,
-.recipes code {
+.recipes pre {
   margin: 0 30px;
 }
 
-.recipes code {
-  display:block;
-}
-
 .recipes h3 {
+  margin: 0;
   padding: 4px;
   background-color: #E6E2AF;
 }
 
+.recipe {
+  margin: 0 0 40px 0;
+  padding: 8px;
+  border: 1px dashed #555;
+}
+
+h2+ul {
+  padding-bottom: 20px;
+}
+
 #version {
   float: right;
   text-align: right;
@@ -166,3 +178,77 @@ pre, code {
 	cursor:	hand;
 }
 
+/* Code highlighter */
+pre {
+	font-family: &quot;Bitstream Vera Sans Mono&quot;, monospace;
+	text-align: left;
+	font-size: 0.8em;
+	position: relative;
+	left: -38px;
+	width: 698px;
+	color: #eee;
+}
+
+code.ruby {
+  color: #eee;
+}
+
+.javascript .comment, .ruby .comment, .css .comment {
+	color: #707070;
+	border: 0 solid transparent;
+}
+
+.javascript .string, .ruby .string {
+	color: #8B9F67;
+}
+
+.ruby .symbol {
+  color: #DF6447;
+}
+
+.javascript .keywords, .ruby .keywords {
+	color: #D3A864;
+	font-weight: bold;
+}
+
+.javascript .global {
+	color : blue;
+}
+
+.javascript .brackets, .ruby .brackets {
+	color : #FFF;
+}
+
+.css .properties {
+	color: #999966;
+}
+
+.css .selectors {
+	color: #FF6600;
+	font-weight : bold;
+}
+
+.css .units {
+	color: black;
+}
+
+.css .urls {
+	color: black;
+}
+
+.html .tag {
+	color: purple;
+}
+
+.html .comment {
+	color : gray;
+	font-style: italic;
+}
+
+.html .string {
+	color : navy;
+}
+
+.html .doctype {
+	color : teal;
+}
\ No newline at end of file</diff>
      <filename>website/stylesheets/screen.css</filename>
    </modified>
    <modified>
      <diff>@@ -58,7 +58,15 @@
     &lt;/p&gt;
 &lt;/div&gt;
 
-&lt;!-- insert site tracking codes here, like Google Urchin --&gt;
+&lt;script type=&quot;text/javascript&quot;&gt;
+var gaJsHost = ((&quot;https:&quot; == document.location.protocol) ? &quot;https://ssl.&quot; : &quot;http://www.&quot;);
+document.write(unescape(&quot;%3Cscript src='&quot; + gaJsHost + &quot;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&quot;));
+&lt;/script&gt;
+&lt;script type=&quot;text/javascript&quot;&gt;
+var pageTracker = _gat._getTracker(&quot;UA-1286493-6&quot;);
+pageTracker._initData();
+pageTracker._trackPageview();
+&lt;/script&gt;
 
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>website/template.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,8 @@
       Capistrano recipes
       &lt;% end %&gt;
   &lt;/title&gt;
+  &lt;script type=&quot;text/javascript&quot; src=&quot;../javascripts/code_highlighter.js&quot;&gt;&lt;/script&gt;
+	&lt;script type=&quot;text/javascript&quot; src=&quot;../javascripts/ruby.js&quot;&gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body&gt;
 &lt;div id=&quot;main&quot; class=&quot;recipes&quot;&gt;
@@ -23,7 +25,16 @@
     &lt;/p&gt;
 &lt;/div&gt;
 
-&lt;!-- insert site tracking codes here, like Google Urchin --&gt;
+
+&lt;script type=&quot;text/javascript&quot;&gt;
+var gaJsHost = ((&quot;https:&quot; == document.location.protocol) ? &quot;https://ssl.&quot; : &quot;http://www.&quot;);
+document.write(unescape(&quot;%3Cscript src='&quot; + gaJsHost + &quot;google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E&quot;));
+&lt;/script&gt;
+&lt;script type=&quot;text/javascript&quot;&gt;
+var pageTracker = _gat._getTracker(&quot;UA-1286493-6&quot;);
+pageTracker._initData();
+pageTracker._trackPageview();
+&lt;/script&gt;
 
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>website/template_recipe.rhtml</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b9a5f1012c42ed66d552cc63252d4a0ca03bc669</id>
    </parent>
  </parents>
  <author>
    <name>Gabe</name>
    <email>gabrielh@gmail.com</email>
  </author>
  <url>http://github.com/gabriel/capitate/commit/32d3ca52dbcd9c9456b7408dafcc36cddb0d199e</url>
  <id>32d3ca52dbcd9c9456b7408dafcc36cddb0d199e</id>
  <committed-date>2008-03-26T11:43:43-07:00</committed-date>
  <authored-date>2008-03-26T11:43:43-07:00</authored-date>
  <message>cleaning up comments, including source in documentation (website)</message>
  <tree>0b0976735b92112cf4bdb54dcb165c07c51d27a1</tree>
  <committer>
    <name>Gabe</name>
    <email>gabrielh@gmail.com</email>
  </committer>
</commit>
