##// END OF EJS Templates
Reduces memory usage when importing large git repositories (#1482)....
Jean-Philippe Lang -
r1585:00593f2f345f
parent child
Show More
@@ -44,10 +44,8 class Repository::Git < Repository
44 scm_revision = scm_info.lastrev.scmid
44 scm_revision = scm_info.lastrev.scmid
45
45
46 unless changesets.find_by_scmid(scm_revision)
46 unless changesets.find_by_scmid(scm_revision)
47
47 scm.revisions('', db_revision, nil, :reverse => true) do |revision|
48 revisions = scm.revisions('', db_revision, nil)
48 transaction do
49 transaction do
50 revisions.reverse_each do |revision|
51 changeset = Changeset.create(:repository => self,
49 changeset = Changeset.create(:repository => self,
52 :revision => revision.identifier,
50 :revision => revision.identifier,
53 :scmid => revision.scmid,
51 :scmid => revision.scmid,
@@ -139,10 +139,10 module Redmine
139 def revisions(path, identifier_from, identifier_to, options={})
139 def revisions(path, identifier_from, identifier_to, options={})
140 revisions = Revisions.new
140 revisions = Revisions.new
141 cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw "
141 cmd = "#{GIT_BIN} --git-dir #{target('')} log --raw "
142 cmd << " --reverse" if options[:reverse]
142 cmd << " -n #{options[:limit].to_i} " if (!options.nil?) && options[:limit]
143 cmd << " -n #{options[:limit].to_i} " if (!options.nil?) && options[:limit]
143 cmd << " #{shell_quote(identifier_from + '..')} " if identifier_from
144 cmd << " #{shell_quote(identifier_from + '..')} " if identifier_from
144 cmd << " #{shell_quote identifier_to} " if identifier_to
145 cmd << " #{shell_quote identifier_to} " if identifier_to
145 #cmd << " HEAD " if !identifier_to
146 shellout(cmd) do |io|
146 shellout(cmd) do |io|
147 files=[]
147 files=[]
148 changeset = {}
148 changeset = {}
@@ -155,13 +155,18 module Redmine
155 value = $1
155 value = $1
156 if (parsing_descr == 1 || parsing_descr == 2)
156 if (parsing_descr == 1 || parsing_descr == 2)
157 parsing_descr = 0
157 parsing_descr = 0
158 revisions << Revision.new({:identifier => changeset[:commit],
158 revision = Revision.new({:identifier => changeset[:commit],
159 :scmid => changeset[:commit],
159 :scmid => changeset[:commit],
160 :author => changeset[:author],
160 :author => changeset[:author],
161 :time => Time.parse(changeset[:date]),
161 :time => Time.parse(changeset[:date]),
162 :message => changeset[:description],
162 :message => changeset[:description],
163 :paths => files
163 :paths => files
164 })
164 })
165 if block_given?
166 yield revision
167 else
168 revisions << revision
169 end
165 changeset = {}
170 changeset = {}
166 files = []
171 files = []
167 revno = revno + 1
172 revno = revno + 1
@@ -190,14 +195,20 module Redmine
190 end
195 end
191 end
196 end
192
197
193 revisions << Revision.new({:identifier => changeset[:commit],
198 if changeset[:commit]
199 revision = Revision.new({:identifier => changeset[:commit],
194 :scmid => changeset[:commit],
200 :scmid => changeset[:commit],
195 :author => changeset[:author],
201 :author => changeset[:author],
196 :time => Time.parse(changeset[:date]),
202 :time => Time.parse(changeset[:date]),
197 :message => changeset[:description],
203 :message => changeset[:description],
198 :paths => files
204 :paths => files
199 }) if changeset[:commit]
205 })
200
206 if block_given?
207 yield revision
208 else
209 revisions << revision
210 end
211 end
201 end
212 end
202
213
203 return nil if $? && $?.exitstatus != 0
214 return nil if $? && $?.exitstatus != 0
General Comments 0
You need to be logged in to leave comments. Login now