<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/models/repository/git.rb</filename>
    </added>
    <added>
      <filename>db/migrate/091_change_changesets_revision_to_string.rb</filename>
    </added>
    <added>
      <filename>db/migrate/092_change_changes_from_revision_to_string.rb</filename>
    </added>
    <added>
      <filename>lib/redmine/scm/adapters/git_adapter.rb</filename>
    </added>
    <added>
      <filename>test/fixtures/repositories/darcs_repository.tar.gz</filename>
    </added>
    <added>
      <filename>test/fixtures/repositories/git_repository.tar.gz</filename>
    </added>
    <added>
      <filename>test/functional/repositories_darcs_controller_test.rb</filename>
    </added>
    <added>
      <filename>test/functional/repositories_git_controller_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/repository_darcs_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/repository_git_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -134,7 +134,7 @@ class RepositoriesController &lt; ApplicationController
   end
   
   def diff
-    @rev_to = params[:rev_to] ? params[:rev_to].to_i : (@rev - 1)
+    @rev_to = params[:rev_to]
     @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
     @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
     
@@ -185,7 +185,7 @@ private
     render_404 and return false unless @repository
     @path = params[:path].join('/') unless params[:path].nil?
     @path ||= ''
-    @rev = params[:rev].to_i if params[:rev]
+    @rev = params[:rev]
   rescue ActiveRecord::RecordNotFound
     render_404
   end</diff>
      <filename>app/controllers/repositories_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -270,6 +270,7 @@ module ApplicationHelper
     #     #52 -&gt; Link to issue #52
     #   Changesets:
     #     r52 -&gt; Link to revision 52
+    #     commit:a85130f -&gt; Link to scmid starting with a85130f
     #   Documents:
     #     document#17 -&gt; Link to document with id 17
     #     document:Greetings -&gt; Link to the document with title &quot;Greetings&quot;
@@ -280,7 +281,7 @@ module ApplicationHelper
     #     version:&quot;1.0 beta 2&quot; -&gt; Link to version named &quot;1.0 beta 2&quot;
     #   Attachments:
     #     attachment:file.zip -&gt; Link to the attachment of the current object named file.zip
-    text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version)?((#|r)(\d+)|(:)([^&quot;][^\s&lt;&gt;]+|&quot;[^&quot;]+&quot;))(?=[[:punct:]]|\s|&lt;|$)}) do |m|
+    text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version|commit)?((#|r)(\d+)|(:)([^&quot;][^\s&lt;&gt;]+|&quot;[^&quot;]+&quot;))(?=[[:punct:]]|\s|&lt;|$)}) do |m|
       leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
       link = nil
       if esc.nil?
@@ -325,6 +326,10 @@ module ApplicationHelper
               link = link_to h(version.name), {:only_path =&gt; only_path, :controller =&gt; 'versions', :action =&gt; 'show', :id =&gt; version},
                                               :class =&gt; 'version'
             end
+          when 'commit'
+            if project &amp;&amp; (changeset = project.changesets.find(:first, :conditions =&gt; [&quot;scmid LIKE ?&quot;, &quot;#{name}%&quot;]))
+              link = link_to h(&quot;#{name}&quot;), {:only_path =&gt; only_path, :controller =&gt; 'repositories', :action =&gt; 'revision', :id =&gt; project.id, :rev =&gt; changeset.revision}, :class =&gt; 'changeset', :title =&gt; truncate(changeset.comments, 100)
+            end
           when 'attachment'
             if attachments &amp;&amp; attachment = attachments.detect {|a| a.filename == name }
               link = link_to h(attachment.filename), {:only_path =&gt; only_path, :controller =&gt; 'attachments', :action =&gt; 'download', :id =&gt; attachment},</diff>
      <filename>app/helpers/application_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,6 +25,10 @@ module RepositoriesHelper
     type ? CodeRay.scan(content, type).html : h(content)
   end
   
+  def format_revision(txt)
+    txt.to_s[0,8]
+  end
+  
   def to_utf8(str)
     return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
     @encodings ||= Setting.repositories_encodings.split(',').collect(&amp;:strip)
@@ -76,6 +80,10 @@ module RepositoriesHelper
       content_tag('p', form.text_field(:url, :label =&gt; 'Root directory', :size =&gt; 60, :required =&gt; true, :disabled =&gt; (repository &amp;&amp; !repository.root_url.blank?)))
   end
 
+  def git_field_tags(form, repository)
+      content_tag('p', form.text_field(:url, :label =&gt; 'Path to .git directory', :size =&gt; 60, :required =&gt; true, :disabled =&gt; (repository &amp;&amp; !repository.root_url.blank?)))
+  end
+
   def cvs_field_tags(form, repository)
       content_tag('p', form.text_field(:root_url, :label =&gt; 'CVSROOT', :size =&gt; 60, :required =&gt; true, :disabled =&gt; !repository.new_record?)) +
       content_tag('p', form.text_field(:url, :label =&gt; 'Module', :size =&gt; 30, :required =&gt; true, :disabled =&gt; !repository.new_record?))</diff>
      <filename>app/helpers/repositories_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -32,7 +32,6 @@ class Changeset &lt; ActiveRecord::Base
                      :date_column =&gt; 'committed_on'
   
   validates_presence_of :repository_id, :revision, :committed_on, :commit_date
-  validates_numericality_of :revision, :only_integer =&gt; true
   validates_uniqueness_of :revision, :scope =&gt; :repository_id
   validates_uniqueness_of :scmid, :scope =&gt; :repository_id, :allow_nil =&gt; true
   
@@ -89,7 +88,11 @@ class Changeset &lt; ActiveRecord::Base
           # don't change the status is the issue is closed
           next if issue.status.is_closed?
           user = committer_user || User.anonymous
-          journal = issue.init_journal(user, l(:text_status_changed_by_changeset, &quot;r#{self.revision}&quot;))
+          csettext = &quot;r#{self.revision}&quot;
+          if self.scmid &amp;&amp; (! (csettext =~ /^r[0-9]+$/))
+            csettext = &quot;commit:\&quot;#{self.scmid}\&quot;&quot;
+          end
+          journal = issue.init_journal(user, l(:text_status_changed_by_changeset, csettext))
           issue.status = fix_status
           issue.done_ratio = done_ratio if done_ratio
           issue.save
@@ -114,11 +117,11 @@ class Changeset &lt; ActiveRecord::Base
   
   # Returns the previous changeset
   def previous
-    @previous ||= Changeset.find(:first, :conditions =&gt; ['revision &lt; ? AND repository_id = ?', self.revision, self.repository_id], :order =&gt; 'revision DESC')
+    @previous ||= Changeset.find(:first, :conditions =&gt; ['id &lt; ? AND repository_id = ?', self.id, self.repository_id], :order =&gt; 'id DESC')
   end
 
   # Returns the next changeset
   def next
-    @next ||= Changeset.find(:first, :conditions =&gt; ['revision &gt; ? AND repository_id = ?', self.revision, self.repository_id], :order =&gt; 'revision ASC')
+    @next ||= Changeset.find(:first, :conditions =&gt; ['id &gt; ? AND repository_id = ?', self.id, self.repository_id], :order =&gt; 'id ASC')
   end
 end</diff>
      <filename>app/models/changeset.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,7 +17,7 @@
 
 class Repository &lt; ActiveRecord::Base
   belongs_to :project
-  has_many :changesets, :dependent =&gt; :destroy, :order =&gt; &quot;#{Changeset.table_name}.revision DESC&quot;
+  has_many :changesets, :dependent =&gt; :destroy, :order =&gt; &quot;#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC&quot;
   has_many :changes, :through =&gt; :changesets
     
   def scm
@@ -51,7 +51,7 @@ class Repository &lt; ActiveRecord::Base
     path = &quot;/#{path}&quot; unless path.starts_with?('/')
     Change.find(:all, :include =&gt; :changeset, 
       :conditions =&gt; [&quot;repository_id = ? AND path = ?&quot;, id, path],
-      :order =&gt; &quot;committed_on DESC, #{Changeset.table_name}.revision DESC&quot;).collect(&amp;:changeset)
+      :order =&gt; &quot;committed_on DESC, #{Changeset.table_name}.id DESC&quot;).collect(&amp;:changeset)
   end
   
   def latest_changeset</diff>
      <filename>app/models/repository.rb</filename>
    </modified>
    <modified>
      <diff>@@ -51,7 +51,7 @@ class Repository::Bazaar &lt; Repository
     scm_info = scm.info
     if scm_info
       # latest revision found in database
-      db_revision = latest_changeset ? latest_changeset.revision : 0
+      db_revision = latest_changeset ? latest_changeset.revision.to_i : 0
       # latest revision in the repository
       scm_revision = scm_info.lastrev.identifier.to_i
       if db_revision &lt; scm_revision</diff>
      <filename>app/models/repository/bazaar.rb</filename>
    </modified>
    <modified>
      <diff>@@ -82,9 +82,6 @@ class Repository::Cvs &lt; Repository
   end
   
   def fetch_changesets
-    #not the preferred way with CVS. maybe we should introduce always a cron-job for this
-    last_commit = changesets.maximum(:committed_on)
-    
     # some nifty bits to introduce a commit-id with cvs
     # natively cvs doesn't provide any kind of changesets, there is only a revision per file.
     # we now take a guess using the author, the commitlog and the commit-date.
@@ -94,8 +91,10 @@ class Repository::Cvs &lt; Repository
     # we use a small delta here, to merge all changes belonging to _one_ changeset
     time_delta=10.seconds
     
+    fetch_since = latest_changeset ? latest_changeset.committed_on : nil
     transaction do
-      scm.revisions('', last_commit, nil, :with_paths =&gt; true) do |revision|
+      tmp_rev_num = 1
+      scm.revisions('', fetch_since, nil, :with_paths =&gt; true) do |revision|
         # only add the change to the database, if it doen't exists. the cvs log
         # is not exclusive at all. 
         unless changes.find_by_path_and_revision(scm.with_leading_slash(revision.paths[0][:path]), revision.paths[0][:revision])
@@ -107,18 +106,16 @@ class Repository::Cvs &lt; Repository
           })
         
           # create a new changeset.... 
-          unless cs 
-            # we use a negative changeset-number here (just for inserting)
+          unless cs
+            # we use a temporaray revision number here (just for inserting)
             # later on, we calculate a continous positive number
-            next_rev = changesets.minimum(:revision)            
-            next_rev = 0 if next_rev.nil? or next_rev &gt; 0 
-            next_rev = next_rev - 1
-            
-            cs=Changeset.create(:repository =&gt; self,
-            :revision =&gt; next_rev, 
-            :committer =&gt; revision.author, 
-            :committed_on =&gt; revision.time,
-            :comments =&gt; revision.message)
+            latest = changesets.find(:first, :order =&gt; 'id DESC')
+            cs = Changeset.create(:repository =&gt; self,
+                                  :revision =&gt; &quot;_#{tmp_rev_num}&quot;, 
+                                  :committer =&gt; revision.author, 
+                                  :committed_on =&gt; revision.time,
+                                  :comments =&gt; revision.message)
+            tmp_rev_num += 1
           end
         
           #convert CVS-File-States to internal Action-abbrevations
@@ -139,12 +136,13 @@ class Repository::Cvs &lt; Repository
         end
       end
       
-      next_rev = [changesets.maximum(:revision) || 0, 0].max
-      changesets.find(:all, :conditions=&gt;[&quot;revision &lt; 0&quot;], :order=&gt;&quot;committed_on ASC&quot;).each() do |changeset|
-        next_rev = next_rev + 1
-        changeset.revision = next_rev
-        changeset.save!
+      # Renumber new changesets in chronological order
+      c = changesets.find(:first, :order =&gt; 'committed_on DESC, id DESC', :conditions =&gt; &quot;revision NOT LIKE '_%'&quot;)
+      next_rev = c.nil? ? 1 : (c.revision.to_i + 1)
+      changesets.find(:all, :order =&gt; 'committed_on ASC, id ASC', :conditions =&gt; &quot;revision LIKE '_%'&quot;).each do |changeset|
+        changeset.update_attribute :revision, next_rev
+        next_rev += 1
       end
-    end
+    end # transaction
   end
 end</diff>
      <filename>app/models/repository/cvs.rb</filename>
    </modified>
    <modified>
      <diff>@@ -47,18 +47,19 @@ class Repository::Darcs &lt; Repository
   
   def diff(path, rev, rev_to, type)
     patch_from = changesets.find_by_revision(rev)
+    return nil if patch_from.nil?
     patch_to = changesets.find_by_revision(rev_to) if rev_to
     if path.blank?
       path = patch_from.changes.collect{|change| change.path}.join(' ')
     end
-    scm.diff(path, patch_from.scmid, patch_to.scmid, type)
+    patch_from ? scm.diff(path, patch_from.scmid, patch_to ? patch_to.scmid : nil, type) : nil
   end
   
   def fetch_changesets
     scm_info = scm.info
     if scm_info
       db_last_id = latest_changeset ? latest_changeset.scmid : nil
-      next_rev = latest_changeset ? latest_changeset.revision + 1 : 1      
+      next_rev = latest_changeset ? latest_changeset.revision.to_i + 1 : 1      
       # latest revision in the repository
       scm_revision = scm_info.lastrev.scmid      
       unless changesets.find_by_scmid(scm_revision)
@@ -71,9 +72,7 @@ class Repository::Darcs &lt; Repository
                                          :committer =&gt; revision.author, 
                                          :committed_on =&gt; revision.time,
                                          :comments =&gt; revision.message)
-            
-            next if changeset.new_record?
-            
+                                         
             revision.paths.each do |change|
               Change.create(:changeset =&gt; changeset,
                             :action =&gt; change[:action],</diff>
      <filename>app/models/repository/darcs.rb</filename>
    </modified>
    <modified>
      <diff>@@ -39,7 +39,7 @@ class Repository::Subversion &lt; Repository
     scm_info = scm.info
     if scm_info
       # latest revision found in database
-      db_revision = latest_changeset ? latest_changeset.revision : 0
+      db_revision = latest_changeset ? latest_changeset.revision.to_i : 0
       # latest revision in the repository
       scm_revision = scm_info.lastrev.identifier.to_i
       if db_revision &lt; scm_revision</diff>
      <filename>app/models/repository/subversion.rb</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@ else
 end %&gt;
 &lt;/td&gt;
 &lt;td class=&quot;size&quot;&gt;&lt;%= (entry.size ? number_to_human_size(entry.size) : &quot;?&quot;) unless entry.is_dir? %&gt;&lt;/td&gt;
-&lt;td class=&quot;revision&quot;&gt;&lt;%= link_to(entry.lastrev.name, :action =&gt; 'revision', :id =&gt; @project, :rev =&gt; entry.lastrev.identifier) if entry.lastrev &amp;&amp; entry.lastrev.identifier %&gt;&lt;/td&gt;
+&lt;td class=&quot;revision&quot;&gt;&lt;%= link_to(format_revision(entry.lastrev.name), :action =&gt; 'revision', :id =&gt; @project, :rev =&gt; entry.lastrev.identifier) if entry.lastrev &amp;&amp; entry.lastrev.identifier %&gt;&lt;/td&gt;
 &lt;td class=&quot;age&quot;&gt;&lt;%= distance_of_time_in_words(entry.lastrev.time, Time.now) if entry.lastrev &amp;&amp; entry.lastrev.time %&gt;&lt;/td&gt;
 &lt;td class=&quot;author&quot;&gt;&lt;%=h(entry.lastrev.author.to_s.split('&lt;').first) if entry.lastrev %&gt;&lt;/td&gt;
 &lt;% changeset = @project.repository.changesets.find_by_revision(entry.lastrev.identifier) if entry.lastrev %&gt;</diff>
      <filename>app/views/repositories/_dir_list_content.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -13,7 +13,7 @@
 &lt;% line_num = 1 %&gt;
 &lt;% revisions.each do |changeset| %&gt;
 &lt;tr class=&quot;changeset &lt;%= cycle 'odd', 'even' %&gt;&quot;&gt;
-&lt;td class=&quot;id&quot;&gt;&lt;%= link_to changeset.revision, :action =&gt; 'revision', :id =&gt; project, :rev =&gt; changeset.revision %&gt;&lt;/td&gt;
+&lt;td class=&quot;id&quot;&gt;&lt;%= link_to format_revision(changeset.revision), :action =&gt; 'revision', :id =&gt; project, :rev =&gt; changeset.revision %&gt;&lt;/td&gt;
 &lt;td class=&quot;checkbox&quot;&gt;&lt;%= radio_button_tag('rev', changeset.revision, (line_num==1), :id =&gt; &quot;cb-#{line_num}&quot;, :onclick =&gt; &quot;$('cbto-#{line_num+1}').checked=true;&quot;) if show_diff &amp;&amp; (line_num &lt; revisions.size) %&gt;&lt;/td&gt;
 &lt;td class=&quot;checkbox&quot;&gt;&lt;%= radio_button_tag('rev_to', changeset.revision, (line_num==2), :id =&gt; &quot;cbto-#{line_num}&quot;, :onclick =&gt; &quot;if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}&quot;) if show_diff &amp;&amp; (line_num &gt; 1) %&gt;&lt;/td&gt;
 &lt;td class=&quot;committed_on&quot;&gt;&lt;%= format_time(changeset.committed_on) %&gt;&lt;/td&gt;</diff>
      <filename>app/views/repositories/_revisions.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@
     &lt;tr class=&quot;bloc-&lt;%= revision.nil? ? 0 : colors[revision.identifier || revision.revision] %&gt;&quot;&gt;
       &lt;th class=&quot;line-num&quot;&gt;&lt;%= line_num %&gt;&lt;/th&gt;
       &lt;td class=&quot;revision&quot;&gt;
-      &lt;%= (revision.identifier ? link_to(revision.identifier, :action =&gt; 'revision', :id =&gt; @project, :rev =&gt; revision.identifier) : revision.revision) if revision %&gt;&lt;/td&gt;
+      &lt;%= (revision.identifier ? link_to(format_revision(revision.identifier), :action =&gt; 'revision', :id =&gt; @project, :rev =&gt; revision.identifier) : format_revision(revision.revision)) if revision %&gt;&lt;/td&gt;
       &lt;td class=&quot;author&quot;&gt;&lt;%= h(revision.author.to_s.split('&lt;').first) if revision %&gt;&lt;/td&gt;
       &lt;td class=&quot;line-code&quot;&gt;&lt;pre&gt;&lt;%= line %&gt;&lt;/pre&gt;&lt;/td&gt;
     &lt;/tr&gt;</diff>
      <filename>app/views/repositories/annotate.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-&lt;h2&gt;&lt;%= l(:label_revision) %&gt; &lt;%= @rev %&gt;: &lt;%= @path.gsub(/^.*\//, '') %&gt;&lt;/h2&gt;
+&lt;h2&gt;&lt;%= l(:label_revision) %&gt; &lt;%= format_revision(@rev) %&gt; &lt;%= @path.gsub(/^.*\//, '') %&gt;&lt;/h2&gt;
 
 &lt;!-- Choose view type --&gt;
 &lt;% form_tag({ :controller =&gt; 'repositories', :action =&gt; 'diff'}, :method =&gt; 'get') do %&gt;
@@ -23,8 +23,8 @@
           &lt;/th&gt;
         &lt;/tr&gt;
         &lt;tr&gt;
-          &lt;th colspan=&quot;2&quot;&gt;@&lt;%= @rev %&gt;&lt;/th&gt;
-          &lt;th colspan=&quot;2&quot;&gt;@&lt;%= @rev_to %&gt;&lt;/th&gt;
+          &lt;th colspan=&quot;2&quot;&gt;@&lt;%= format_revision @rev %&gt;&lt;/th&gt;
+          &lt;th colspan=&quot;2&quot;&gt;@&lt;%= format_revision @rev_to %&gt;&lt;/th&gt;
         &lt;/tr&gt;
       &lt;/thead&gt;
       &lt;tbody&gt;
@@ -56,8 +56,8 @@
           &lt;/th&gt;
         &lt;/tr&gt;
         &lt;tr&gt;
-          &lt;th&gt;@&lt;%= @rev %&gt;&lt;/th&gt;
-          &lt;th&gt;@&lt;%= @rev_to %&gt;&lt;/th&gt;
+          &lt;th&gt;@&lt;%= format_revision @rev %&gt;&lt;/th&gt;
+          &lt;th&gt;@&lt;%= format_revision @rev_to %&gt;&lt;/th&gt;
           &lt;th&gt;&lt;/th&gt;
         &lt;/tr&gt;
       &lt;/thead&gt;</diff>
      <filename>app/views/repositories/diff.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@
   &lt;% end %&gt;
 &lt;/div&gt;
 
-&lt;h2&gt;&lt;%= l(:label_revision) %&gt; &lt;%= @changeset.revision %&gt;&lt;/h2&gt;
+&lt;h2&gt;&lt;%= l(:label_revision) %&gt; &lt;%= format_revision(@changeset.revision) %&gt;&lt;/h2&gt;
 
 &lt;p&gt;&lt;% if @changeset.scmid %&gt;ID: &lt;%= @changeset.scmid %&gt;&lt;br /&gt;&lt;% end %&gt;
 &lt;em&gt;&lt;%= @changeset.committer.to_s.split('&lt;').first %&gt;, &lt;%= format_time(@changeset.committed_on) %&gt;&lt;/em&gt;&lt;/p&gt;</diff>
      <filename>app/views/repositories/revision.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -19,3 +19,19 @@ gunzip &lt; test/fixtures/repositories/bazaar_repository.tar.gz | tar -xv -C tmp/te
 Mercurial
 ---------
 gunzip &lt; test/fixtures/repositories/mercurial_repository.tar.gz | tar -xv -C tmp/test
+
+Git
+---
+gunzip &lt; test/fixtures/repositories/git_repository.tar.gz | tar -xv -C tmp/test
+
+
+Running Tests
+=============
+
+Run 
+
+  rake --tasks | grep test
+
+to see available tests.
+
+RAILS_ENV=test rake test will run tests.</diff>
      <filename>doc/RUNNING_TESTS</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ rescue LoadError
   # RMagick is not available
 end
 
-REDMINE_SUPPORTED_SCM = %w( Subversion Darcs Mercurial Cvs Bazaar )
+REDMINE_SUPPORTED_SCM = %w( Subversion Darcs Mercurial Cvs Bazaar Git )
 
 # Permissions
 Redmine::AccessControl.map do |map|</diff>
      <filename>lib/redmine.rb</filename>
    </modified>
    <modified>
      <diff>@@ -102,8 +102,12 @@ module Redmine
         def diff(path, identifier_from, identifier_to=nil, type=&quot;inline&quot;)
           path = '*' if path.blank?
           cmd = &quot;#{DARCS_BIN} diff --repodir #{@url}&quot;
-          cmd &lt;&lt; &quot; --to-match \&quot;hash #{identifier_from}\&quot;&quot;
-          cmd &lt;&lt; &quot; --from-match \&quot;hash #{identifier_to}\&quot;&quot; if identifier_to
+          if identifier_to.nil?
+            cmd &lt;&lt; &quot; --match \&quot;hash #{identifier_from}\&quot;&quot;
+          else
+            cmd &lt;&lt; &quot; --to-match \&quot;hash #{identifier_from}\&quot;&quot;
+            cmd &lt;&lt; &quot; --from-match \&quot;hash #{identifier_to}\&quot;&quot;
+          end
           cmd &lt;&lt; &quot; -u #{path}&quot;
           diff = []
           shellout(cmd) do |io|</diff>
      <filename>lib/redmine/scm/adapters/darcs_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -40,13 +40,13 @@ class RepositoryCvsTest &lt; Test::Unit::TestCase
       
       assert_equal 5, @repository.changesets.count
       assert_equal 14, @repository.changes.count
-      assert_equal 'Two files changed', @repository.changesets.find_by_revision(3).comments
+      assert_not_nil @repository.changesets.find_by_comments('Two files changed')
     end
     
     def test_fetch_changesets_incremental
       @repository.fetch_changesets
-      # Remove changesets with revision &gt; 2
-      @repository.changesets.find(:all, :conditions =&gt; 'revision &gt; 2').each(&amp;:destroy)
+      # Remove the 3 latest changesets
+      @repository.changesets.find(:all, :order =&gt; 'committed_on DESC', :limit =&gt; 3).each(&amp;:destroy)
       @repository.reload
       assert_equal 2, @repository.changesets.count
       </diff>
      <filename>test/unit/repository_cvs_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6fcc512cb77a0851ab8c3c693fd178b564a600dd</id>
    </parent>
  </parents>
  <author>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </author>
  <url>http://github.com/artemv/redmine_tt/commit/3a9b0988c7515371531e47f9eef9f8e60ce352aa</url>
  <id>3a9b0988c7515371531e47f9eef9f8e60ce352aa</id>
  <committed-date>2008-03-12T13:28:49-07:00</committed-date>
  <authored-date>2008-03-12T13:28:49-07:00</authored-date>
  <message>Merged Git support branch (r1200 to r1226).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1236 e93f8b46-1217-0410-a6f0-8f06a7374b81</message>
  <tree>2a2deaedbd321dcf838c631dfed357f3c1110dbe</tree>
  <committer>
    <name>Jean-Philippe Lang</name>
    <email>jp_lang@yahoo.fr</email>
  </committer>
</commit>
