comparison app/models/repository/mercurial.rb @ 1115:433d4f72a19b redmine-2.2

Update to Redmine SVN revision 11137 on 2.2-stable branch
author Chris Cannam
date Mon, 07 Jan 2013 12:01:42 +0000
parents cbb26bc654de
children bb32da3bea34 622f24f53b42
comparison
equal deleted inserted replaced
929:5f33065ddc4b 1115:433d4f72a19b
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang 2 # Copyright (C) 2006-2012 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
27 validates_presence_of :url 27 validates_presence_of :url
28 28
29 # number of changesets to fetch at once 29 # number of changesets to fetch at once
30 FETCH_AT_ONCE = 100 30 FETCH_AT_ONCE = 100
31 31
32 def self.human_attribute_name(attribute_key_name) 32 def self.human_attribute_name(attribute_key_name, *args)
33 attr_name = attribute_key_name 33 attr_name = attribute_key_name.to_s
34 if attr_name == "url" 34 if attr_name == "url"
35 attr_name = "path_to_repository" 35 attr_name = "path_to_repository"
36 end 36 end
37 super(attr_name) 37 super(attr_name, *args)
38 end 38 end
39 39
40 def self.scm_adapter_class 40 def self.scm_adapter_class
41 Redmine::Scm::Adapters::MercurialAdapter 41 Redmine::Scm::Adapters::MercurialAdapter
42 end 42 end
71 super(cs, cs_to, ' ') 71 super(cs, cs_to, ' ')
72 end 72 end
73 73
74 # Finds and returns a revision with a number or the beginning of a hash 74 # Finds and returns a revision with a number or the beginning of a hash
75 def find_changeset_by_name(name) 75 def find_changeset_by_name(name)
76 return nil if name.nil? || name.empty? 76 return nil if name.blank?
77 if /[^\d]/ =~ name or name.to_s.size > 8 77 s = name.to_s
78 e = changesets.find(:first, :conditions => ['scmid = ?', name.to_s]) 78 if /[^\d]/ =~ s or s.size > 8
79 cs = changesets.where(:scmid => s).first
79 else 80 else
80 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s]) 81 cs = changesets.where(:revision => s).first
81 end 82 end
82 return e if e 83 return cs if cs
83 changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"]) # last ditch 84 changesets.where('scmid LIKE ?', "#{s}%").first
84 end 85 end
85 86
86 # Returns the latest changesets for +path+; sorted by revision number 87 # Returns the latest changesets for +path+; sorted by revision number
87 # 88 #
88 # Because :order => 'id DESC' is defined at 'has_many', 89 # Because :order => 'id DESC' is defined at 'has_many',
135 db_rev = latest_changeset ? latest_changeset.revision.to_i : -1 136 db_rev = latest_changeset ? latest_changeset.revision.to_i : -1
136 return unless db_rev < scm_rev # already up-to-date 137 return unless db_rev < scm_rev # already up-to-date
137 138
138 logger.debug "Fetching changesets for repository #{url}" if logger 139 logger.debug "Fetching changesets for repository #{url}" if logger
139 (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i| 140 (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i|
140 transaction do 141 scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re|
141 scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re| 142 transaction do
143 parents = (re.parents || []).collect{|rp| find_changeset_by_name(rp)}.compact
142 cs = Changeset.create(:repository => self, 144 cs = Changeset.create(:repository => self,
143 :revision => re.revision, 145 :revision => re.revision,
144 :scmid => re.scmid, 146 :scmid => re.scmid,
145 :committer => re.author, 147 :committer => re.author,
146 :committed_on => re.time, 148 :committed_on => re.time,
147 :comments => re.message) 149 :comments => re.message,
148 re.paths.each { |e| cs.create_change(e) } 150 :parents => parents)
149 parents = {} 151 unless cs.new_record?
150 parents[cs] = re.parents unless re.parents.nil? 152 re.paths.each { |e| cs.create_change(e) }
151 parents.each do |ch, chparents|
152 ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
153 end 153 end
154 end 154 end
155 end 155 end
156 end 156 end
157 end 157 end