| 
									
										
										
										
											2007-06-12 20:12:05 +00:00
										 |  |  | # redMine - project management software | 
					
						
							|  |  |  | # Copyright (C) 2006-2007  Jean-Philippe Lang | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | # as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | # of the License, or (at your option) any later version. | 
					
						
							|  |  |  | #  | 
					
						
							|  |  |  | # This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							|  |  |  | #  | 
					
						
							|  |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with this program; if not, write to the Free Software | 
					
						
							|  |  |  | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'redmine/scm/adapters/mercurial_adapter' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Repository::Mercurial < Repository | 
					
						
							|  |  |  |   attr_protected :root_url | 
					
						
							|  |  |  |   validates_presence_of :url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def scm_adapter | 
					
						
							|  |  |  |     Redmine::Scm::Adapters::MercurialAdapter | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   def self.scm_name | 
					
						
							|  |  |  |     'Mercurial' | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   def entries(path=nil, identifier=nil) | 
					
						
							|  |  |  |     entries=scm.entries(path, identifier) | 
					
						
							|  |  |  |     if entries | 
					
						
							|  |  |  |       entries.each do |entry| | 
					
						
							|  |  |  |         next unless entry.is_file? | 
					
						
							|  |  |  |         # Search the DB for the entry's last change | 
					
						
							|  |  |  |         change = changes.find(:first, :conditions => ["path = ?", scm.with_leading_slash(entry.path)], :order => "#{Changeset.table_name}.committed_on DESC") | 
					
						
							|  |  |  |         if change | 
					
						
							|  |  |  |           entry.lastrev.identifier = change.changeset.revision | 
					
						
							|  |  |  |           entry.lastrev.name = change.changeset.revision | 
					
						
							|  |  |  |           entry.lastrev.author = change.changeset.committer | 
					
						
							|  |  |  |           entry.lastrev.revision = change.revision | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     entries | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fetch_changesets | 
					
						
							|  |  |  |     scm_info = scm.info | 
					
						
							|  |  |  |     if scm_info | 
					
						
							|  |  |  |       # latest revision found in database | 
					
						
							| 
									
										
										
										
											2008-03-15 10:30:56 +00:00
										 |  |  |       db_revision = latest_changeset ? latest_changeset.revision.to_i : -1
 | 
					
						
							| 
									
										
										
										
											2007-06-12 20:12:05 +00:00
										 |  |  |       # latest revision in the repository | 
					
						
							|  |  |  |       scm_revision = scm_info.lastrev.identifier.to_i | 
					
						
							| 
									
										
										
										
											2008-03-15 10:30:56 +00:00
										 |  |  |       if db_revision < scm_revision | 
					
						
							|  |  |  |         logger.debug "Fetching changesets for repository #{url}" if logger && logger.debug? | 
					
						
							|  |  |  |         identifier_from = db_revision + 1
 | 
					
						
							|  |  |  |         while (identifier_from <= scm_revision) | 
					
						
							|  |  |  |           # loads changesets by batches of 100 | 
					
						
							|  |  |  |           identifier_to = [identifier_from + 99, scm_revision].min | 
					
						
							|  |  |  |           revisions = scm.revisions('', identifier_from, identifier_to, :with_paths => true) | 
					
						
							|  |  |  |           transaction do | 
					
						
							|  |  |  |             revisions.each do |revision| | 
					
						
							|  |  |  |               changeset = Changeset.create(:repository => self, | 
					
						
							|  |  |  |                                            :revision => revision.identifier, | 
					
						
							|  |  |  |                                            :scmid => revision.scmid, | 
					
						
							|  |  |  |                                            :committer => revision.author,  | 
					
						
							|  |  |  |                                            :committed_on => revision.time, | 
					
						
							|  |  |  |                                            :comments => revision.message) | 
					
						
							|  |  |  |                | 
					
						
							|  |  |  |               revision.paths.each do |change| | 
					
						
							|  |  |  |                 Change.create(:changeset => changeset, | 
					
						
							|  |  |  |                               :action => change[:action], | 
					
						
							|  |  |  |                               :path => change[:path], | 
					
						
							|  |  |  |                               :from_path => change[:from_path], | 
					
						
							|  |  |  |                               :from_revision => change[:from_revision]) | 
					
						
							|  |  |  |               end | 
					
						
							| 
									
										
										
										
											2007-06-12 20:12:05 +00:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2008-03-15 10:30:56 +00:00
										 |  |  |           end unless revisions.nil? | 
					
						
							|  |  |  |           identifier_from = identifier_to + 1
 | 
					
						
							| 
									
										
										
										
											2007-06-12 20:12:05 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |