diff app/models/repository/mercurial.rb @ 1517:dffacf8a6908 redmine-2.5

Update to Redmine SVN revision 13367 on 2.5-stable branch
author Chris Cannam
date Tue, 09 Sep 2014 09:29:00 +0100
parents e248c7af89ec
children a1bdbf8a87d5
line wrap: on
line diff
--- a/app/models/repository/mercurial.rb	Tue Sep 09 09:28:31 2014 +0100
+++ b/app/models/repository/mercurial.rb	Tue Sep 09 09:29:00 2014 +0100
@@ -59,7 +59,7 @@
 
   # Returns the readable identifier for the given mercurial changeset
   def self.format_changeset_identifier(changeset)
-    "#{changeset.revision}:#{changeset.scmid}"
+    "#{changeset.revision}:#{changeset.scmid[0, 12]}"
   end
 
   # Returns the identifier for the given Mercurial changeset
@@ -71,6 +71,28 @@
     super(cs, cs_to, ' ')
   end
 
+  def modify_entry_lastrev_identifier(entry)
+    if entry.lastrev && entry.lastrev.identifier
+      entry.lastrev.identifier = scmid_for_inserting_db(entry.lastrev.identifier)
+    end
+  end
+  private :modify_entry_lastrev_identifier
+
+  def entry(path=nil, identifier=nil)
+    entry = scm.entry(path, identifier)
+    return nil if entry.nil?
+    modify_entry_lastrev_identifier(entry)
+    entry
+  end
+
+  def scm_entries(path=nil, identifier=nil)
+    entries = scm.entries(path, identifier)
+    return nil if entries.nil?
+    entries.each {|entry| modify_entry_lastrev_identifier(entry)}
+    entries
+  end
+  protected :scm_entries
+
   # Finds and returns a revision with a number or the beginning of a hash
   def find_changeset_by_name(name)
     return nil if name.blank?
@@ -100,6 +122,28 @@
       all
   end
 
+  def is_short_id_in_db?
+    return @is_short_id_in_db unless @is_short_id_in_db.nil?
+    cs = changesets.first
+    @is_short_id_in_db = (!cs.nil? && cs.scmid.length != 40)
+  end
+  private :is_short_id_in_db?
+
+  def scmid_for_inserting_db(scmid)
+    is_short_id_in_db? ? scmid[0, 12] : scmid
+  end
+
+  def nodes_in_branch(rev, branch_limit)
+    scm.nodes_in_branch(rev, :limit => branch_limit).collect do |b|
+      scmid_for_inserting_db(b)
+    end
+  end
+
+  def tag_scmid(rev)
+    scmid = scm.tagmap[rev]
+    scmid.nil? ? nil : scmid_for_inserting_db(scmid)
+  end
+
   def latest_changesets_cond(path, rev, limit)
     cond, args = [], []
     if scm.branchmap.member? rev
@@ -114,8 +158,8 @@
       # Mercurial does not treat direcotry.
       # So, "hg log DIR" is very heavy.
       branch_limit = path.blank? ? limit : ( limit * 5 )
-      args << scm.nodes_in_branch(rev, :limit => branch_limit)
-    elsif last = rev ? find_changeset_by_name(scm.tagmap[rev] || rev) : nil
+      args << nodes_in_branch(rev, branch_limit)
+    elsif last = rev ? find_changeset_by_name(tag_scmid(rev) || rev) : nil
       cond << "#{Changeset.table_name}.id <= ?"
       args << last.id
     end
@@ -141,16 +185,23 @@
     (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i|
       scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re|
         transaction do
-          parents = (re.parents || []).collect{|rp| find_changeset_by_name(rp)}.compact
+          parents = (re.parents || []).collect do |rp|
+            find_changeset_by_name(scmid_for_inserting_db(rp))
+          end.compact
           cs = Changeset.create(:repository   => self,
                                 :revision     => re.revision,
-                                :scmid        => re.scmid,
+                                :scmid        => scmid_for_inserting_db(re.scmid),
                                 :committer    => re.author,
                                 :committed_on => re.time,
                                 :comments     => re.message,
                                 :parents      => parents)
           unless cs.new_record?
-            re.paths.each { |e| cs.create_change(e) }
+            re.paths.each do |e|
+              if from_revision = e[:from_revision]
+                e[:from_revision] = scmid_for_inserting_db(from_revision)
+              end
+              cs.create_change(e)
+            end
           end
         end
       end