From: Jean-Philippe Lang Date: Sun, 29 Jun 2008 09:41:42 +0000 (+0000) Subject: Reduces memory usage when importing large git repositories (#1482). X-Git-Tag: 0.8.0-RC1~395 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=00593f2f345f51565535257cf183b004c1087a21;p=redmine.git Reduces memory usage when importing large git repositories (#1482). git-svn-id: http://redmine.rubyforge.org/svn/trunk@1599 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/models/repository/git.rb b/app/models/repository/git.rb index 7213588ac..2f440fe29 100644 --- a/app/models/repository/git.rb +++ b/app/models/repository/git.rb @@ -44,10 +44,8 @@ class Repository::Git < Repository scm_revision = scm_info.lastrev.scmid unless changesets.find_by_scmid(scm_revision) - - revisions = scm.revisions('', db_revision, nil) - transaction do - revisions.reverse_each do |revision| + scm.revisions('', db_revision, nil, :reverse => true) do |revision| + transaction do changeset = Changeset.create(:repository => self, :revision => revision.identifier, :scmid => revision.scmid, diff --git a/lib/redmine/scm/adapters/git_adapter.rb b/lib/redmine/scm/adapters/git_adapter.rb index d05b4fb38..30d624001 100644 --- a/lib/redmine/scm/adapters/git_adapter.rb +++ b/lib/redmine/scm/adapters/git_adapter.rb @@ -139,10 +139,10 @@ module Redmine def revisions(path, identifier_from, identifier_to, options={}) revisions = Revisions.new cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw " + cmd << " --reverse" if options[:reverse] cmd << " -n #{options[:limit].to_i} " if (!options.nil?) && options[:limit] cmd << " #{shell_quote(identifier_from + '..')} " if identifier_from cmd << " #{shell_quote identifier_to} " if identifier_to - #cmd << " HEAD " if !identifier_to shellout(cmd) do |io| files=[] changeset = {} @@ -155,13 +155,18 @@ module Redmine value = $1 if (parsing_descr == 1 || parsing_descr == 2) parsing_descr = 0 - revisions << Revision.new({:identifier => changeset[:commit], - :scmid => changeset[:commit], - :author => changeset[:author], - :time => Time.parse(changeset[:date]), - :message => changeset[:description], - :paths => files - }) + revision = Revision.new({:identifier => changeset[:commit], + :scmid => changeset[:commit], + :author => changeset[:author], + :time => Time.parse(changeset[:date]), + :message => changeset[:description], + :paths => files + }) + if block_given? + yield revision + else + revisions << revision + end changeset = {} files = [] revno = revno + 1 @@ -190,14 +195,20 @@ module Redmine end end - revisions << Revision.new({:identifier => changeset[:commit], + if changeset[:commit] + revision = Revision.new({:identifier => changeset[:commit], :scmid => changeset[:commit], :author => changeset[:author], :time => Time.parse(changeset[:date]), :message => changeset[:description], :paths => files - }) if changeset[:commit] - + }) + if block_given? + yield revision + else + revisions << revision + end + end end return nil if $? && $?.exitstatus != 0