Mercurial > hg > soundsoftware-site
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 |