]> source.dussan.org Git - redmine.git/commitdiff
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567).
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Sun, 2 Jan 2011 06:05:54 +0000 (06:05 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Sun, 2 Jan 2011 06:05:54 +0000 (06:05 +0000)
In DVCS, changesets are not in date order.
Because Mercurial backend inserts changesets from eariest, 'ORDER BY id'
means 'order by revision number'.

Contributed by Yuya Nishihara.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4611 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/repository/mercurial.rb
test/fixtures/repositories/mercurial_repository.tar.gz
test/unit/repository_mercurial_test.rb

index 1072239567b5b109d003f11107fb561b22533ee9..9ce3b63ebd8503518b63b3197bd1db4c4b54c76a 100644 (file)
@@ -18,6 +18,9 @@
 require 'redmine/scm/adapters/mercurial_adapter'
 
 class Repository::Mercurial < Repository
+  # sort changesets by revision number
+  has_many :changesets, :order => "#{Changeset.table_name}.id DESC", :foreign_key => 'repository_id'
+
   attr_protected :root_url
   validates_presence_of :url
 
@@ -52,6 +55,18 @@ class Repository::Mercurial < Repository
     entries
   end
 
+  # Returns the latest changesets for +path+; sorted by revision number
+  def latest_changesets(path, rev, limit=10)
+    if path.blank?
+      changesets.find(:all, :include => :user, :limit => limit)
+    else
+      changes.find(:all, :include => {:changeset => :user},
+                         :conditions => ["path = ?", path.with_leading_slash],
+                         :order => "#{Changeset.table_name}.id DESC",
+                         :limit => limit).collect(&:changeset)
+    end
+  end
+
   def fetch_changesets
     scm_info = scm.info
     if scm_info
index 1d8ad305732f7a0d7bfbcd52bbeec919da88e3f1..c2a1b58745c8fdf994e7ab43b11919e79a639be4 100644 (file)
Binary files a/test/fixtures/repositories/mercurial_repository.tar.gz and b/test/fixtures/repositories/mercurial_repository.tar.gz differ
index 16e72c35dfff7792dc8033b0333ab558028289f3..17b72cf6757aab18ad38d2a895d2625fa405fdce 100644 (file)
@@ -76,6 +76,17 @@ class RepositoryMercurialTest < ActiveSupport::TestCase
         assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on
       end
     end
+
+    def test_changeset_order_by_revision
+      @repository.fetch_changesets
+      @repository.reload
+
+      c0 = @repository.latest_changeset
+      c1 = @repository.changesets.find_by_revision('0')
+      # sorted by revision (id), not by date
+      assert c0.revision.to_i > c1.revision.to_i
+      assert c0.committed_on  < c1.committed_on
+    end
   else
     puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end