diff app/models/repository/mercurial.rb @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents 0c939c159af4
children 5e80956cc792 433d4f72a19b
line wrap: on
line diff
--- a/app/models/repository/mercurial.rb	Fri Feb 24 18:36:29 2012 +0000
+++ b/app/models/repository/mercurial.rb	Fri Feb 24 19:09:32 2012 +0000
@@ -19,12 +19,15 @@
 
 class Repository::Mercurial < Repository
   # sort changesets by revision number
-  has_many :changesets, :order => "#{Changeset.table_name}.id DESC", :foreign_key => 'repository_id'
+  has_many :changesets,
+           :order       => "#{Changeset.table_name}.id DESC",
+           :foreign_key => 'repository_id'
 
-  attr_protected :root_url
+  attr_protected        :root_url
   validates_presence_of :url
 
-  FETCH_AT_ONCE = 100  # number of changesets to fetch at once
+  # number of changesets to fetch at once
+  FETCH_AT_ONCE = 100
 
   def self.human_attribute_name(attribute_key_name)
     attr_name = attribute_key_name
@@ -46,6 +49,10 @@
     true
   end
 
+  def supports_revision_graph?
+    true
+  end
+
   def repo_log_encoding
     'UTF-8'
   end
@@ -84,9 +91,11 @@
   # Sqlite3 and PostgreSQL pass.
   # Is this MySQL bug?
   def latest_changesets(path, rev, limit=10)
-    changesets.find(:all, :include => :user,
+    changesets.find(:all,
+                    :include    => :user,
                     :conditions => latest_changesets_cond(path, rev, limit),
-                    :limit => limit, :order => "#{Changeset.table_name}.id DESC")
+                    :limit      => limit,
+                    :order      => "#{Changeset.table_name}.id DESC")
   end
 
   def latest_changesets_cond(path, rev, limit)
@@ -108,16 +117,14 @@
       cond << "#{Changeset.table_name}.id <= ?"
       args << last.id
     end
-
     unless path.blank?
       cond << "EXISTS (SELECT * FROM #{Change.table_name}
                  WHERE #{Change.table_name}.changeset_id = #{Changeset.table_name}.id
                  AND (#{Change.table_name}.path = ?
                        OR #{Change.table_name}.path LIKE ? ESCAPE ?))"
       args << path.with_leading_slash
-      args << "#{path.with_leading_slash.gsub(/[%_\\]/) { |s| "\\#{s}" }}/%" << '\\'
+      args << "#{path.with_leading_slash.gsub(%r{[%_\\]}) { |s| "\\#{s}" }}/%" << '\\'
     end
-
     [cond.join(' AND '), *args] unless cond.empty?
   end
   private :latest_changesets_cond
@@ -125,23 +132,27 @@
   def fetch_changesets
     return if scm.info.nil?
     scm_rev = scm.info.lastrev.revision.to_i
-    db_rev = latest_changeset ? latest_changeset.revision.to_i : -1
+    db_rev  = latest_changeset ? latest_changeset.revision.to_i : -1
     return unless db_rev < scm_rev  # already up-to-date
 
     logger.debug "Fetching changesets for repository #{url}" if logger
     (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i|
       transaction do
         scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re|
-          cs = Changeset.create(:repository => self,
-                                :revision => re.revision,
-                                :scmid => re.scmid,
-                                :committer => re.author,
+          cs = Changeset.create(:repository   => self,
+                                :revision     => re.revision,
+                                :scmid        => re.scmid,
+                                :committer    => re.author,
                                 :committed_on => re.time,
-                                :comments => re.message)
+                                :comments     => re.message)
           re.paths.each { |e| cs.create_change(e) }
+          parents = {}
+          parents[cs] = re.parents unless re.parents.nil?
+          parents.each do |ch, chparents|
+            ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
+          end
         end
       end
     end
-    self
   end
 end