<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>db/migrate/031_add_diffable_to_changes.rb</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/diff_2</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/diff_2f</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/diff_f</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/diff_i</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/diff_new_mode</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/rev_list_count</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/fixtures/show_empty_commit</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/test_diff.rb</filename>
    </added>
    <added>
      <filename>vendor/silo/vendor/grit/test/test_real.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -4,3 +4,4 @@ public/javascripts/warehouse.js
 .rake_tasks
 tmp
 log
+.DS_Store</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -6,28 +6,24 @@ module ChangesetsHelper
   end
 
   def unified_diff_for(node, options = {})
-    options[:old_rev] ||= node.previous_node.revision
     old_rev = find_revision_for(node, options[:old_rev])
 
-    return nil if old_rev.nil?
-
     raw_diff = node.unified_diff_with(old_rev)
     if raw_diff.empty?
       return nil
     end
+
     diff_line_regex = %r{@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@}
     lines = raw_diff.split(&quot;\n&quot;)
-        
-    original_revision_num = node.revision.to_s
-    current_revision_num  = old_rev
-    original_revision = nil
-    current_revision  = nil
+    
+    original_revision, original_revision_num = nil, node.revision.to_s
+    current_revision,  current_revision_num  = nil, old_rev
     if controller.action_name == 'diff'
-      original_revision = link_to_diff(original_revision_num, original_revision_num, node.path)
-      current_revision  = link_to_diff(current_revision_num,  current_revision_num,  node.path)
+      original_revision = link_to_diff(truncate(original_revision_num, 7, ''), original_revision_num, node.path)
+      current_revision  = link_to_diff(truncate(current_revision_num, 7, ''),  current_revision_num,  node.path)
     else
-      original_revision = link_to_node(original_revision_num, node, original_revision_num)
-      current_revision  = link_to_node(current_revision_num,  node, current_revision_num)
+      original_revision = link_to_node(truncate(original_revision_num, 7, ''), node, original_revision_num)
+      current_revision  = link_to_node(truncate(current_revision_num, 7, ''),  node, current_revision_num)
     end
     
     th_pnum = content_tag('th', original_revision, :class =&gt; 'csnum')
@@ -81,6 +77,7 @@ module ChangesetsHelper
     )
   end
   
+  # wraps a change's diff and specifies a header.
   def diff_for(change)
     unified_diff_for change.node, :id =&gt; dom_id(change) do |original_revision_num, current_revision_num|
       %(
@@ -91,7 +88,11 @@ module ChangesetsHelper
   end
   
   def find_revision_for(node, other)
-    return other if other.is_a?(Silo::Node)
+    if current_repository.scm_type == 'git' &amp;&amp; other.nil?
+      other = node.commit.parents.first.to_s
+    end
+
+    return other if other.nil? || other.is_a?(Silo::Node)
     if other.is_a?(Date)
       changeset = current_repository.changesets.find_by_date_for_path(other, node.path)
       return changeset ? changeset.revision : nil</diff>
      <filename>app/helpers/changesets_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,10 +10,6 @@ class Change &lt; ActiveRecord::Base
     @node ||= changeset.repository.node(path, revision)
   end
   
-  def diffable?
-    node ? node.diffable? : false
-  end
-  
   def silo
     changeset.repository.silo
   end</diff>
      <filename>app/models/change.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@
   &lt;div class=&quot;cs-meta&quot;&gt;
     &lt;%= avatar_for(current_changeset.user) %&gt;
     &lt;p&gt;
-      &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(current_changeset.revision, hosted_url(:changeset, current_changeset.revision)) %&gt;&lt;/span&gt;
+      &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(truncate(current_changeset.revision, 7, ''), hosted_url(:changeset, current_changeset.revision)) %&gt;&lt;/span&gt;
     &lt;/p&gt;
   &lt;/div&gt;
   &lt;div class=&quot;cs-log clearfix&quot;&gt;      </diff>
      <filename>app/views/browser/dir.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -12,7 +12,7 @@
   &lt;div class=&quot;cs-meta&quot;&gt;
     &lt;%= avatar_for(current_changeset.user) %&gt;
     &lt;p&gt;
-      &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(current_changeset.revision, hosted_url(:changeset, current_changeset.revision)) %&gt;&lt;/span&gt;
+      &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(truncate(current_changeset.revision, 7, ''), hosted_url(:changeset, current_changeset.revision)) %&gt;&lt;/span&gt;
     &lt;/p&gt;
   &lt;/div&gt;
   &lt;div class=&quot;cs-log clearfix&quot;&gt;      </diff>
      <filename>app/views/browser/file.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -29,7 +29,7 @@
     &lt;div class=&quot;cs-meta&quot;&gt;
       &lt;%= avatar_for(user) %&gt;
       &lt;p&gt;
-        &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(changeset.revision, hosted_url(changeset.repository, :changeset, :id =&gt; changeset.revision)) %&gt;&lt;/span&gt;
+        &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(truncate(changeset.revision, 7, ''), hosted_url(changeset.repository, :changeset, :id =&gt; changeset.revision)) %&gt;&lt;/span&gt;
       &lt;/p&gt;
     &lt;/div&gt;
     &lt;div class=&quot;cs-log clearfix&quot;&gt;      </diff>
      <filename>app/views/changesets/index.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@
   &lt;div class=&quot;cs-meta&quot;&gt;
     &lt;%= avatar_for(@changeset.user) %&gt;
     &lt;p&gt;
-      &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(@changeset.revision, hosted_url(:changeset, @changeset.revision)) %&gt;&lt;/span&gt;
+      &lt;span class=&quot;change-number&quot;&gt;&lt;%= link_to(truncate(@changeset.revision, 7, ''), hosted_url(:changeset, @changeset.revision)) %&gt;&lt;/span&gt;
     &lt;/p&gt;
   &lt;/div&gt;
   &lt;div class=&quot;cs-log clearfix&quot;&gt;      </diff>
      <filename>app/views/changesets/show.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -26,7 +26,7 @@ ActionController::Routing::Routes.draw do |map|
   end
 
   map.with_options :controller =&gt; &quot;browser&quot; do |b|
-    b.rev_browser &quot;browser/:rev/*paths&quot;, :rev =&gt; /r\d+/
+    b.rev_browser &quot;browser/:rev/*paths&quot;, :rev =&gt; /r\w+/
     b.browser     &quot;browser/*paths&quot;
     b.blame       &quot;blame/*paths&quot;, :action =&gt; &quot;blame&quot;
     b.text        &quot;text/*paths&quot;,  :action =&gt; &quot;text&quot;</diff>
      <filename>config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version =&gt; 30) do
+ActiveRecord::Schema.define(:version =&gt; 31) do
 
   create_table &quot;avatars&quot;, :force =&gt; true do |t|
     t.string  &quot;content_type&quot;
@@ -36,6 +36,7 @@ ActiveRecord::Schema.define(:version =&gt; 30) do
     t.text    &quot;path&quot;
     t.text    &quot;from_path&quot;
     t.integer &quot;from_revision&quot;
+    t.boolean &quot;diffable&quot;,      :default =&gt; false
   end
 
   add_index &quot;changes&quot;, [&quot;changeset_id&quot;], :name =&gt; &quot;index_changes_on_changeset_id&quot;</diff>
      <filename>db/schema.rb</filename>
    </modified>
    <modified>
      <diff>@@ -54,6 +54,11 @@ namespace :warehouse do
     Warehouse::Command.logger ||= Logger.new(ENV['LOGGER'] || STDOUT) unless ENV['LOGGER'] == 'none'
     Warehouse::Command.logger.level = Logger.const_get((ENV['LOG_LEVEL'] || 'INFO').upcase) if Warehouse::Command.logger
     @command = Warehouse::Command.new(config)
+    begin
+      require 'ruby-debug'
+      Debugger.start
+    rescue LoadError
+    end if ENV[&quot;DEBUG&quot;]
   end
 
   task :post_commit do</diff>
      <filename>lib/tasks/importer.rake</filename>
    </modified>
    <modified>
      <diff>@@ -62,19 +62,21 @@ module Warehouse
           :message       =&gt; node.message,
           :changed_at    =&gt; node.changed_at}
         changeset_id   = @connection[:changesets] &lt;&lt; changeset
-        changes = {:all =&gt; [], :diffable =&gt; []}
+        changes = {:all =&gt; [], :diffable =&gt; false}
         create_change_from_changeset(node, changeset.update(:id =&gt; changeset_id), changes)
-        @connection[:changesets].filter(:id =&gt; changeset_id).update(:diffable =&gt; 1) if changes[:diffable].size &gt; 0
+        @connection[:changesets].filter(:id =&gt; changeset_id).update(:diffable =&gt; 1) if changes[:diffable]
         changeset
       end
     
       def create_change_from_changeset(node, changeset, changes)
         (node.added_files).each do |path|
-          process_change_path_and_save(node, changeset, 'A', path, changes)
+          diff_node = node.repository.node_at(path, node.revision)
+          process_change_path_and_save(node, changeset, 'A', diff_node, changes)
         end
       
         (node.updated_files).each do |path|
-          process_change_path_and_save(node, changeset, 'M', path, changes)
+          diff_node = node.repository.node_at(path, node.revision)
+          process_change_path_and_save(node, changeset, 'M', diff_node, changes)
         end
       
         deleted_files = node.deleted_files
@@ -83,27 +85,30 @@ module Warehouse
         end
       
         moved_files.each do |path|
-          process_change_path_and_save(node, changeset, 'MV', path, changes)
+          diff_node = node.repository.node_at(path, node.revision)
+          process_change_path_and_save(node, changeset, 'MV', diff_node, changes)
         end
       
         copied_files.each do |path|
-          process_change_path_and_save(node, changeset, 'CP', path, changes)
+          diff_node = node.repository.node_at(path, node.revision)
+          process_change_path_and_save(node, changeset, 'CP', diff_node, changes)
         end
       
         deleted_files.each do |path|
-          process_change_path_and_save(node, changeset, 'D', path, changes)
+          diff_node = node.repository.node_at(path, node.revision)
+          process_change_path_and_save(node, changeset, 'D', diff_node, changes)
         end
       end
 
-      def process_change_path_and_save(node, changeset, name, path, changes)
-        change = {:changeset_id =&gt; changeset[:id], :name =&gt; name, :path =&gt; path}
+      def process_change_path_and_save(node, changeset, name, diff_node, changes)
+        change = {:changeset_id =&gt; changeset[:id], :name =&gt; name, :path =&gt; diff_node.path, :diffable =&gt; diff_node.text?}
         if @@extra_change_names.include?(name)
           change[:path]          = path[0]
           change[:from_path]     = path[1]
           change[:from_revision] = path[2]
         end
         unless @@undiffable_change_names.include?(change[:name]) || changeset[:diffable] == 1
-          changes[:diffable] &lt;&lt; true unless node.text?
+          changes[:diffable] = true if change[:diffable]
         end
         @connection[:changes] &lt;&lt; change
       end</diff>
      <filename>lib/warehouse/syncer/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,11 +7,19 @@ module Warehouse
           latest_changeset = @connection[:changesets].where(:repository_id =&gt; @repo[:id]).order(:changed_at.DESC).first
           latest_rev       = @silo.latest_revision
           branch_prefix    = @repo[:synced_revision].to_s.size.zero? ? '' : @repo[:synced_revision] + &quot;..&quot;
-          revisions        = @silo.send(:backend).git.rev_list({}, @silo.send(:backend).heads.collect { |h| branch_prefix + h.name }).split
+          @heads           = @silo.send(:backend).heads.collect { |h| h.name }
+          if @heads.include?('master')
+            @heads.delete 'master'
+            @heads.unshift 'master'
+          end
+          arguments        = @heads.collect { |name| branch_prefix + name }
+          arguments &lt;&lt; &quot;--since=#{@repo[:synced_changed_at].utc.xmlschema}&quot; if @repo[:synced_changed_at]
+          revisions        = @silo.send(:backend).git.rev_list({}, arguments).split
           revisions.reverse!
           @connection.transaction do    
             i = 0
-            while (@num.zero? || i &lt; @num) &amp;&amp; rev = revisions.shift
+            while (@num.zero? || i &lt; @num) &amp;&amp; revisions.size &gt; 0
+              rev = revisions.shift
               changeset = create_changeset(rev)
               if i &gt; 1 &amp;&amp; i % 100 == 0
                 update_repository_progress rev, changeset, 100
@@ -27,6 +35,15 @@ module Warehouse
           end
         end
       end
+      
+    protected
+      def process_change_path_and_save(node, changeset, name, diff_node, changes)
+        orig_path = diff_node.path
+        super unless @heads.detect do |head|
+          diff_node = node.repository.node_at(&quot;#{head}/#{orig_path}&quot;, node.revision)
+          diff_node.exists?
+        end.nil?
+      end
     end
   end
 end
\ No newline at end of file</diff>
      <filename>lib/warehouse/syncer/git_syncer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -45,7 +45,12 @@ module Silo
             grit_object.data
           end
         end
-  
+
+        def unified_diff_with(other_rev = nil)
+          other_rev ||= commit.parents.first.to_s
+          @repository.unified_diff_for(other_rev, revision, @only_path)
+        end
+
         def added_files
           @added_files ||= collect_diffs { |d| d.new_file }
         end
@@ -61,11 +66,9 @@ module Silo
         def deleted_files
           @deleted_files ||= collect_diffs { |d| d.deleted_file }
         end
-
-        def collect_diffs(&amp;block)
-          commit.diffs.inject [] do |diffs, diff|
-            block.call(diff) ? diffs &lt;&lt; diff.a_path : diffs
-          end
+        
+        def diffs
+          @repository.cached_diffs[commit] ||= commit.diffs
         end
 
         def commit
@@ -109,7 +112,7 @@ module Silo
         def grit_object
           @grit_object ||= begin
             only_paths = paths.dup ; only_paths.shift
-            only_paths.inject(head) { |tree, path| tree / path } || :none
+            only_paths.inject(head) { |tree, path| tree ? (tree / path) : tree } || :none
           end
           @grit_object == :none ? nil : @grit_object
         end
@@ -132,6 +135,14 @@ module Silo
         def revision_for(commit)
           @repository.revision_for(commit)
         end
+        
+        def collect_diffs(&amp;block)
+          collected = []
+          diffs.each do |diff|
+            collected &lt;&lt; diff.a_path if block.call(diff)
+          end
+          collected
+        end
       end
 
       def latest_revision
@@ -175,11 +186,11 @@ module Silo
       end
       
       def find_commit(id)
-        backend.commit(id)
+        cached_commits[id] ||= backend.commit(id)
       end
       
       def latest_commit_for(node)
-        backend.log(node.branch, node.only_path, :max_count =&gt; 1).first
+        cached_commits[[node.branch, node.only_path]] ||= backend.log(node.branch, node.only_path, :max_count =&gt; 1).first
       end
       
       def revision_for(commit)
@@ -187,14 +198,27 @@ module Silo
       end
 
       def unified_diff_for(old_rev, new_rev, diff_path)
-        Grit::Commit.diff(backend, old_rev, new_rev).collect do |d| 
-          &quot;diff --git a/#{d.a_path} b/#{d.b_path}\nindex #{d.a_commit.id_abbrev}..#{d.b_commit.id_abbrev}\n#{d.diff}&quot;
+        new_rev = new_rev.revision if new_rev.respond_to?(:revision)
+        old_rev = old_rev.revision if old_rev.respond_to?(:revision)
+        Grit::Commit.diff(backend, old_rev, new_rev, Array(diff_path)).collect do |d|
+          next '' unless d.a_path[diff_path]
+          a_id = d.a_commit ? d.a_commit.id[0..6] : '0000000'
+          b_id = d.b_commit ? d.b_commit.id[0..6] : '0000000'
+          &quot;diff --git a/#{d.a_path} b/#{d.b_path}\nindex #{a_id}..#{b_id}\n#{d.diff}&quot;
         end.join(&quot;\n&quot;)
       end
 
       def tree(*args)
         backend &amp;&amp; backend.tree(*args)
       end
+      
+      def cached_commits
+        @cached_commits ||= {}
+      end
+      
+      def cached_diffs
+        @cached_diffs ||= {}
+      end
     
     protected
       def backend</diff>
      <filename>vendor/silo/lib/silo/adapters/git.rb</filename>
    </modified>
    <modified>
      <diff>@@ -119,8 +119,12 @@ module Silo
       end
 
       def unified_diff_for(old_rev, new_rev, diff_path)
-        old_root = backend.fs.root old_rev
-        new_root = backend.fs.root new_rev
+        case new_rev
+          when nil        then new_rev = old_rev - 1
+          when Silo::Node then new_rev = new_rev.revision
+        end
+        old_root  = backend.fs.root old_rev
+        new_root  = backend.fs.root new_rev
         
         differ = ::Svn::Fs::FileDiff.new(old_root, diff_path, new_root, diff_path)
       </diff>
      <filename>vendor/silo/lib/silo/adapters/svn.rb</filename>
    </modified>
    <modified>
      <diff>@@ -105,17 +105,17 @@ module Silo
     end
     
     def unified_diff
-      unified_diff_with(revision - 1)
+      unified_diff_with nil
     end
     
-    def unified_diff_with(other_rev)
-      @repository.unified_diff_for(revision, other_rev.respond_to?(:revision) ? other_rev.revision : other_rev, @path)
+    def unified_diff_with(other_rev = nil)
+      @repository.unified_diff_for(revision, other_rev, @path)
     end
     
     def ==(other)
-      repository == other.repository &amp;&amp;
-        path     == other.path       &amp;&amp;
-        revision == other.revision
+      other.respond_to?(:repository) &amp;&amp; repository == other.repository &amp;&amp;
+        other.respond_to?(:path)     &amp;&amp; path       == other.path       &amp;&amp;
+        other.respond_to?(:revision) &amp;&amp; revision   == other.revision
     end
     
     def &lt;=&gt;(other)
@@ -128,7 +128,7 @@ module Silo
       end
     end
 
-  protected    
+  protected
     def repository=(value)
       @repository = value
     end</diff>
      <filename>vendor/silo/lib/silo/node.rb</filename>
    </modified>
    <modified>
      <diff>@@ -90,6 +90,15 @@ module Grit
       nil
     end
     
+    # Count the number of commits reachable from this ref
+    #   +repo+ is the Repo
+    #   +ref+ is the ref from which to begin (SHA1 or name)
+    #
+    # Returns Integer
+    def self.count(repo, ref)
+      repo.git.rev_list({}, ref).strip.split(&quot;\n&quot;).size
+    end
+    
     # Find all commits matching the given criteria.
     #   +repo+ is the Repo
     #   +ref+ is the ref from which to begin (SHA1 or name)
@@ -140,13 +149,39 @@ module Grit
       commits
     end
     
-    def self.diff(repo, a, b = nil)
-      text = repo.git.diff({:full_index =&gt; true}, a, b)
+    # Show diffs between two trees:
+    #   +repo+ is the Repo
+    #   +a+ is a named commit
+    #   +b+ is an optional named commit.  Passing an array assumes you 
+    #     wish to omit the second named commit and limit the diff to the 
+    #     given paths.
+    #   +paths* is an array of paths to limit the diff.
+    #
+    # Returns Grit::Diff[] (baked)
+    def self.diff(repo, a, b = nil, paths = [])
+      if b.is_a?(Array)
+        paths = b
+        b     = nil
+      end
+      paths.unshift(&quot;--&quot;) unless paths.empty?
+      paths.unshift(b)    unless b.nil?
+      paths.unshift(a)
+      text = repo.git.diff({:full_index =&gt; true}, *paths)
       Diff.list_from_string(repo, text)
     end
 
     def diffs
-      self.class.diff(@repo, parents.first.id, @id) 
+      if parents.empty?
+        diff = @repo.git.show({:full_index =&gt; true, :pretty =&gt; 'raw'}, @id)
+        if diff =~ /diff --git a/
+          diff = diff.sub(/.+?(diff --git a)/m, '\1')
+        else
+          diff = ''
+        end
+        Diff.list_from_string(@repo, diff)
+      else
+        self.class.diff(@repo, parents.first.id, @id) 
+      end
     end
     
     # Convert this Commit to a String which is just the SHA1 id</diff>
      <filename>vendor/silo/vendor/grit/lib/grit/commit.rb</filename>
    </modified>
    <modified>
      <diff>@@ -27,6 +27,10 @@ module Grit
       while !lines.empty?
         m, a_path, b_path = *lines.shift.match(%r{^diff --git a/(\S+) b/(\S+)$})
         
+        if lines.first =~ /^old mode/
+          2.times { lines.shift }
+        end
+        
         new_file = false
         deleted_file = false
         </diff>
      <filename>vendor/silo/vendor/grit/lib/grit/diff.rb</filename>
    </modified>
    <modified>
      <diff>@@ -27,8 +27,9 @@ module Grit
     # Returns String
     def method_missing(cmd, options = {}, *args)
       opt_args = transform_options(options)
+      ext_args = args.map { |a| a == '--' ? a : &quot;'#{a}'&quot; }
       
-      call = &quot;#{Git.git_binary} --git-dir='#{self.git_dir}' #{cmd.to_s.gsub(/_/, '-')} #{(opt_args + args).join(' ')}&quot;
+      call = &quot;#{Git.git_binary} --git-dir='#{self.git_dir}' #{cmd.to_s.gsub(/_/, '-')} #{(opt_args + ext_args).join(' ')}&quot;
       puts call if Grit.debug
       response = `#{call}`
       puts response if Grit.debug
@@ -48,14 +49,14 @@ module Grit
             args &lt;&lt; &quot;-#{opt}&quot;
           else
             val = options.delete(opt)
-            args &lt;&lt; &quot;-#{opt.to_s} #{val}&quot;
+            args &lt;&lt; &quot;-#{opt.to_s} '#{val}'&quot;
           end
         else
           if options[opt] == true
             args &lt;&lt; &quot;--#{opt.to_s.gsub(/_/, '-')}&quot;
           else
             val = options.delete(opt)
-            args &lt;&lt; &quot;--#{opt.to_s.gsub(/_/, '-')}=#{val}&quot;
+            args &lt;&lt; &quot;--#{opt.to_s.gsub(/_/, '-')}='#{val}'&quot;
           end
         end
       end</diff>
      <filename>vendor/silo/vendor/grit/lib/grit/git.rb</filename>
    </modified>
    <modified>
      <diff>@@ -29,7 +29,7 @@ module Grit
     # Returns Grit::Head[] (baked)
     def self.find_all(repo, options = {})
       default_options = {:sort =&gt; &quot;committerdate&quot;,
-                         :format =&gt; &quot;'%(refname)%00%(objectname)'&quot;}
+                         :format =&gt; &quot;%(refname)%00%(objectname)&quot;}
                          
       actual_options = default_options.merge(options)
       </diff>
      <filename>vendor/silo/vendor/grit/lib/grit/head.rb</filename>
    </modified>
    <modified>
      <diff>@@ -88,6 +88,14 @@ module Grit
       Commit.find_all(self, start, options)
     end
     
+    # The number of commits reachable by the given branch/commit
+    #   +start+ is the branch/commit name (default 'master')
+    #
+    # Returns Integer
+    def commit_count(start = 'master')
+      Commit.count(self, start)
+    end
+    
     # The Commit object for the specified id
     #   +id+ is the SHA1 identifier of the commit
     #
@@ -103,7 +111,7 @@ module Grit
     #   +paths+ is an optional Array of directory paths to restrict the tree (deafult [])
     #
     # Examples
-    #   Repo.tree('master', ['lib/'])
+    #   repo.tree('master', ['lib/'])
     #
     # Returns Grit::Tree (baked)
     def tree(treeish = 'master', paths = [])
@@ -124,8 +132,8 @@ module Grit
     def log(commit = 'master', path = nil, options = {})
       default_options = {:pretty =&gt; &quot;raw&quot;}
       actual_options  = default_options.merge(options)
-      arg = path ? &quot;#{commit} -- #{path}&quot; : commit
-      commits = self.git.log(actual_options, arg)
+      arg = path ? [commit, '--', path] : [commit]
+      commits = self.git.log(actual_options, *arg)
       Commit.list_from_string(self, commits)
     end
     </diff>
      <filename>vendor/silo/vendor/grit/lib/grit/repo.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@ module Grit
     #
     # Returns Grit::Tree (baked)
     def self.construct(repo, treeish, paths = [])
-      output = repo.git.ls_tree({}, treeish, paths.join(&quot; &quot;))
+      output = repo.git.ls_tree({}, treeish, *paths)
       
       self.allocate.construct_initialize(repo, treeish, output)
     end</diff>
      <filename>vendor/silo/vendor/grit/lib/grit/tree.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,7 +28,7 @@ class TestCommit &lt; Test::Unit::TestCase
   def test_diff
     # git diff --full-index 91169e1f5fa4de2eaea3f176461f5dc784796769 &gt; test/fixtures/diff_p
     
-    Git.any_instance.expects(:diff).returns(fixture('diff_p'))
+    Git.any_instance.expects(:diff).with({:full_index =&gt; true}, 'master').returns(fixture('diff_p'))
     diffs = Commit.diff(@r, 'master')
     
     assert_equal 15, diffs.size
@@ -47,6 +47,33 @@ class TestCommit &lt; Test::Unit::TestCase
     assert_equal 'f733bce6b57c0e5e353206e692b0e3105c2527f4', diffs[5].b_commit.id
     assert_equal true, diffs[5].new_file
   end
+  
+  def test_diff_with_two_commits
+    # git diff --full-index 59ddc32 13d27d5 &gt; test/fixtures/diff_2
+    Git.any_instance.expects(:diff).with({:full_index =&gt; true}, '59ddc32', '13d27d5').returns(fixture('diff_2'))
+    diffs = Commit.diff(@r, '59ddc32', '13d27d5')
+    
+    assert_equal 3, diffs.size
+    assert_equal %w(lib/grit/commit.rb test/fixtures/show_empty_commit test/test_commit.rb), diffs.collect { |d| d.a_path }
+  end
+  
+  def test_diff_with_files
+    # git diff --full-index 59ddc32 -- lib &gt; test/fixtures/diff_f
+    Git.any_instance.expects(:diff).with({:full_index =&gt; true}, '59ddc32', '--', 'lib').returns(fixture('diff_f'))
+    diffs = Commit.diff(@r, '59ddc32', %w(lib))
+    
+    assert_equal 1, diffs.size
+    assert_equal 'lib/grit/diff.rb', diffs.first.a_path
+  end
+  
+  def test_diff_with_two_commits_and_files
+    # git diff --full-index 59ddc32 13d27d5 -- lib &gt; test/fixtures/diff_2f
+    Git.any_instance.expects(:diff).with({:full_index =&gt; true}, '59ddc32', '13d27d5', '--', 'lib').returns(fixture('diff_2f'))
+    diffs = Commit.diff(@r, '59ddc32', '13d27d5', %w(lib))
+    
+    assert_equal 1, diffs.size
+    assert_equal 'lib/grit/commit.rb', diffs.first.a_path
+  end
 
   # diffs
   def test_diffs
@@ -72,6 +99,43 @@ class TestCommit &lt; Test::Unit::TestCase
     assert_equal 'f733bce6b57c0e5e353206e692b0e3105c2527f4', diffs[5].b_commit.id
     assert_equal true, diffs[5].new_file
   end
+
+  def test_diffs_on_initial_import
+    # git show --full-index 634396b2f541a9f2d58b00be1a07f0c358b999b3 &gt; test/fixtures/diff_i
+
+    Git.any_instance.expects(:show).with({:full_index =&gt; true, :pretty =&gt; 'raw'}, '634396b2f541a9f2d58b00be1a07f0c358b999b3').returns(fixture('diff_i'))
+    @c = Commit.create(@r, :id =&gt; '634396b2f541a9f2d58b00be1a07f0c358b999b3')
+    diffs = @c.diffs
+    
+    assert_equal 10, diffs.size
+    
+    assert_equal 'History.txt', diffs.first.a_path
+    assert_equal 'History.txt', diffs.first.b_path
+    assert_equal nil, diffs.first.a_commit
+    assert_equal nil, diffs.first.mode
+    assert_equal '81d2c27608b352814cbe979a6acd678d30219678', diffs.first.b_commit.id
+    assert_equal true, diffs.first.new_file
+    assert_equal false, diffs.first.deleted_file
+    assert_equal &quot;--- /dev/null\n+++ b/History.txt\n@@ -0,0 +1,5 @@\n+== 1.0.0 / 2007-10-09\n+\n+* 1 major enhancement\n+  * Birthday!\n+&quot;, diffs.first.diff
+
+    
+    assert_equal 'lib/grit.rb', diffs[5].a_path
+    assert_equal nil, diffs[5].a_commit
+    assert_equal '32cec87d1e78946a827ddf6a8776be4d81dcf1d1', diffs[5].b_commit.id
+    assert_equal true, diffs[5].new_file
+  end
+  
+  def test_diffs_on_initial_import_with_empty_commit
+    Git.any_instance.expects(:show).with(
+      {:full_index =&gt; true, :pretty =&gt; 'raw'}, 
+      '634396b2f541a9f2d58b00be1a07f0c358b999b3'
+    ).returns(fixture('show_empty_commit'))
+    
+    @c = Commit.create(@r, :id =&gt; '634396b2f541a9f2d58b00be1a07f0c358b999b3')
+    diffs = @c.diffs
+    
+    assert_equal [], diffs
+  end
   
   # to_s
   </diff>
      <filename>vendor/silo/vendor/grit/test/test_commit.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,10 +11,10 @@ class TestGit &lt; Test::Unit::TestCase
   
   def test_transform_options
     assert_equal [&quot;-s&quot;], @git.transform_options({:s =&gt; true})
-    assert_equal [&quot;-s 5&quot;], @git.transform_options({:s =&gt; 5})
+    assert_equal [&quot;-s '5'&quot;], @git.transform_options({:s =&gt; 5})
     
     assert_equal [&quot;--max-count&quot;], @git.transform_options({:max_count =&gt; true})
-    assert_equal [&quot;--max-count=5&quot;], @git.transform_options({:max_count =&gt; 5})
+    assert_equal [&quot;--max-count='5'&quot;], @git.transform_options({:max_count =&gt; 5})
     
     assert_equal [&quot;-s&quot;, &quot;-t&quot;], @git.transform_options({:s =&gt; true, :t =&gt; true}).sort
   end</diff>
      <filename>vendor/silo/vendor/grit/test/test_git.rb</filename>
    </modified>
    <modified>
      <diff>@@ -75,6 +75,14 @@ class TestRepo &lt; Test::Unit::TestCase
     assert_equal &quot;Merge branch 'site'&quot;, c.message
   end
   
+  # commit_count
+  
+  def test_commit_count
+    Git.any_instance.expects(:rev_list).with({}, 'master').returns(fixture('rev_list_count'))
+    
+    assert_equal 655, @r.commit_count('master')
+  end
+  
   # commit
   
   def test_commit
@@ -204,7 +212,7 @@ class TestRepo &lt; Test::Unit::TestCase
   end
 
   def test_log_with_path_and_options
-    Git.any_instance.expects(:log).with({:pretty =&gt; 'raw', :max_count =&gt; 1}, 'master -- file.rb').returns(fixture('rev_list'))
+    Git.any_instance.expects(:log).with({:pretty =&gt; 'raw', :max_count =&gt; 1}, 'master', '--', 'file.rb').returns(fixture('rev_list'))
     @r.log('master', 'file.rb', :max_count =&gt; 1)
   end
 end</diff>
      <filename>vendor/silo/vendor/grit/test/test_repo.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>vendor/silo/spec/git_adapter_spec.rb</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/git_repo.tar.gz</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/mock_adapter_spec.rb</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/mock_repo/config.yml</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/mock_repo/test.html</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/node_spec.rb</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/repository_spec.rb</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/spec_helper.rb</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_adapter_spec.rb</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/README.txt</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/conf/authz</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/conf/passwd</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/conf/svnserve.conf</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/current</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/format</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/fs-type</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/0</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/1</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/2</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/3</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/4</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/5</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/6</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revprops/7</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/0</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/1</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/2</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/3</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/4</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/5</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/6</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/revs/7</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/uuid</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/db/write-lock</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/format</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/post-commit.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/post-lock.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/post-revprop-change.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/post-unlock.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/pre-commit.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/pre-lock.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/pre-revprop-change.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/pre-unlock.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/hooks/start-commit.tmpl</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/locks/db-logs.lock</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_repo/locks/db.lock</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_wc/.svn/entries</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_wc/.svn/format</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_wc/.svn/text-base/config.yml.svn-base</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_wc/config.yml</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_wc/foo/.svn/entries</filename>
    </removed>
    <removed>
      <filename>vendor/silo/spec/svn_wc/foo/.svn/format</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>dab90c568b3b8c04a61a6972e3ff4c4893240313</id>
    </parent>
  </parents>
  <author>
    <name>rick</name>
    <email>technoweenie@gmail.com</email>
  </author>
  <url>http://github.com/entp/warehouse/commit/c1702b3a2773e5967a2d3a07e682407d6fce553e</url>
  <id>c1702b3a2773e5967a2d3a07e682407d6fce553e</id>
  <committed-date>2008-02-10T23:57:17-08:00</committed-date>
  <authored-date>2008-02-10T23:57:17-08:00</authored-date>
  <message>lots of git-related bug fixes</message>
  <tree>cc5cb020471e38d002a5c6569aff9a8abd9c7e57</tree>
  <committer>
    <name>rick</name>
    <email>technoweenie@gmail.com</email>
  </committer>
</commit>
