comparison app/models/.svn/text-base/repository.rb.svn-base @ 245:051f544170fe

* Update to SVN trunk revision 4993
author Chris Cannam
date Thu, 03 Mar 2011 11:42:28 +0000
parents 07fa8a8b56a8
children eeebe205a056 cbce1fd3b1b7
comparison
equal deleted inserted replaced
244:8972b600f4fb 245:051f544170fe
14 # You should have received a copy of the GNU General Public License 14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software 15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 class Repository < ActiveRecord::Base 18 class Repository < ActiveRecord::Base
19 include Redmine::Ciphering
20
19 belongs_to :project 21 belongs_to :project
20 has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC" 22 has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
21 has_many :changes, :through => :changesets 23 has_many :changes, :through => :changesets
22 24
23 # Raw SQL to delete changesets and changes in the database 25 # Raw SQL to delete changesets and changes in the database
24 # has_many :changesets, :dependent => :destroy is too slow for big repositories 26 # has_many :changesets, :dependent => :destroy is too slow for big repositories
25 before_destroy :clear_changesets 27 before_destroy :clear_changesets
26 28
29 validates_length_of :password, :maximum => 255, :allow_nil => true
27 # Checks if the SCM is enabled when creating a repository 30 # Checks if the SCM is enabled when creating a repository
28 validate_on_create { |r| r.errors.add(:type, :invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) } 31 validate_on_create { |r| r.errors.add(:type, :invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) }
29 32
30 # Removes leading and trailing whitespace 33 # Removes leading and trailing whitespace
31 def url=(arg) 34 def url=(arg)
32 write_attribute(:url, arg ? arg.to_s.strip : nil) 35 write_attribute(:url, arg ? arg.to_s.strip : nil)
33 end 36 end
34 37
35 # Removes leading and trailing whitespace 38 # Removes leading and trailing whitespace
36 def root_url=(arg) 39 def root_url=(arg)
37 write_attribute(:root_url, arg ? arg.to_s.strip : nil) 40 write_attribute(:root_url, arg ? arg.to_s.strip : nil)
38 end 41 end
42
43 def password
44 read_ciphered_attribute(:password)
45 end
46
47 def password=(arg)
48 write_ciphered_attribute(:password, arg)
49 end
50
51 def scm_adapter
52 self.class.scm_adapter_class
53 end
39 54
40 def scm 55 def scm
41 @scm ||= self.scm_adapter.new url, root_url, login, password 56 @scm ||= self.scm_adapter.new(url, root_url,
57 login, password, path_encoding)
42 update_attribute(:root_url, @scm.root_url) if root_url.blank? 58 update_attribute(:root_url, @scm.root_url) if root_url.blank?
43 @scm 59 @scm
44 end 60 end
45 61
46 def scm_name 62 def scm_name
47 self.class.scm_name 63 self.class.scm_name
48 end 64 end
49 65
50 def supports_cat? 66 def supports_cat?
51 scm.supports_cat? 67 scm.supports_cat?
52 end 68 end
53 69
54 def supports_annotate? 70 def supports_annotate?
171 end 187 end
172 @found_committer_users[committer] = user 188 @found_committer_users[committer] = user
173 user 189 user
174 end 190 end
175 end 191 end
176 192
193 def repo_log_encoding
194 encoding = log_encoding.to_s.strip
195 encoding.blank? ? 'UTF-8' : encoding
196 end
197
177 # Fetches new changesets for all repositories of active projects 198 # Fetches new changesets for all repositories of active projects
178 # Can be called periodically by an external script 199 # Can be called periodically by an external script
179 # eg. ruby script/runner "Repository.fetch_changesets" 200 # eg. ruby script/runner "Repository.fetch_changesets"
180 def self.fetch_changesets 201 def self.fetch_changesets
181 Project.active.has_module(:repository).find(:all, :include => :repository).each do |project| 202 Project.active.has_module(:repository).find(:all, :include => :repository).each do |project|
182 if project.repository 203 if project.repository
183 project.repository.fetch_changesets 204 begin
205 project.repository.fetch_changesets
206 rescue Redmine::Scm::Adapters::CommandFailed => e
207 logger.error "scm: error during fetching changesets: #{e.message}"
208 end
184 end 209 end
185 end 210 end
186 end 211 end
187 212
188 # scan changeset comments to find related and fixed issues for all repositories 213 # scan changeset comments to find related and fixed issues for all repositories
189 def self.scan_changesets_for_issue_ids 214 def self.scan_changesets_for_issue_ids
190 find(:all).each(&:scan_changesets_for_issue_ids) 215 find(:all).each(&:scan_changesets_for_issue_ids)
191 end 216 end
192 217
195 end 220 end
196 221
197 def self.available_scm 222 def self.available_scm
198 subclasses.collect {|klass| [klass.scm_name, klass.name]} 223 subclasses.collect {|klass| [klass.scm_name, klass.name]}
199 end 224 end
200 225
201 def self.factory(klass_name, *args) 226 def self.factory(klass_name, *args)
202 klass = "Repository::#{klass_name}".constantize 227 klass = "Repository::#{klass_name}".constantize
203 klass.new(*args) 228 klass.new(*args)
204 rescue 229 rescue
205 nil 230 nil
206 end 231 end
207 232
233 def self.scm_adapter_class
234 nil
235 end
236
237 def self.scm_command
238 ret = ""
239 begin
240 ret = self.scm_adapter_class.client_command if self.scm_adapter_class
241 rescue Redmine::Scm::Adapters::CommandFailed => e
242 logger.error "scm: error during get command: #{e.message}"
243 end
244 ret
245 end
246
247 def self.scm_version_string
248 ret = ""
249 begin
250 ret = self.scm_adapter_class.client_version_string if self.scm_adapter_class
251 rescue Redmine::Scm::Adapters::CommandFailed => e
252 logger.error "scm: error during get version string: #{e.message}"
253 end
254 ret
255 end
256
257 def self.scm_available
258 ret = false
259 begin
260 ret = self.scm_adapter_class.client_available if self.scm_adapter_class
261 rescue Redmine::Scm::Adapters::CommandFailed => e
262 logger.error "scm: error during get scm available: #{e.message}"
263 end
264 ret
265 end
266
208 private 267 private
209 268
210 def before_save 269 def before_save
211 # Strips url and root_url 270 # Strips url and root_url
212 url.strip! 271 url.strip!
213 root_url.strip! 272 root_url.strip!
214 true 273 true