summaryrefslogtreecommitdiffstats
path: root/app/models/repository
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2008-03-15 10:30:56 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2008-03-15 10:30:56 +0000
commit01fdaf5977429d8a40682af915d95bf742c97588 (patch)
tree4dfb945ac41541b3dc074e3e7084e252ff4fd686 /app/models/repository
parenta59e6bfb020f51ec2ae586e2e0e238b9827b7e9a (diff)
downloadredmine-01fdaf5977429d8a40682af915d95bf742c97588.tar.gz
redmine-01fdaf5977429d8a40682af915d95bf742c97588.zip
Mercurial adapter:
* fetch changesets by batches of 100 (rather than in a single transaction) * fix: fetch_changesets tries to re-insert the last revision that exists in the db (#860) git-svn-id: http://redmine.rubyforge.org/svn/trunk@1255 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/repository')
-rw-r--r--app/models/repository/mercurial.rb46
1 files changed, 26 insertions, 20 deletions
diff --git a/app/models/repository/mercurial.rb b/app/models/repository/mercurial.rb
index 5d9ea9cd4..27a8eaea9 100644
--- a/app/models/repository/mercurial.rb
+++ b/app/models/repository/mercurial.rb
@@ -51,29 +51,35 @@ class Repository::Mercurial < Repository
scm_info = scm.info
if scm_info
# latest revision found in database
- db_revision = latest_changeset ? latest_changeset.revision : nil
+ db_revision = latest_changeset ? latest_changeset.revision.to_i : -1
# latest revision in the repository
scm_revision = scm_info.lastrev.identifier.to_i
-
- unless changesets.find_by_revision(scm_revision)
- revisions = scm.revisions('', db_revision, nil)
- transaction do
- revisions.reverse_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])
+ 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
end
- end
+ end unless revisions.nil?
+ identifier_from = identifier_to + 1
end
end
end