156 |
156 |
from_scmid = nil
|
157 |
157 |
from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br]
|
158 |
158 |
h["branches"][br] ||= {}
|
159 |
|
|
|
159 |
|
160 |
160 |
revisions = scm.revisions('', from_scmid, br, {:reverse => true})
|
161 |
161 |
next if revisions.blank?
|
162 |
|
|
|
162 |
|
163 |
163 |
# Remember the last commit id here, before we start removing revisions from the array.
|
164 |
164 |
# We'll do that for optimization, but it also means, that we may lose even all revisions.
|
165 |
165 |
last_revision = revisions.last
|
... | ... | |
170 |
170 |
# (this equals to a union, because we executed diff above)
|
171 |
171 |
all_revisions += revisions.map{|r| r.scmid}
|
172 |
172 |
|
173 |
|
# Make the search for existing revisions in the database in a more sufficient manner
|
174 |
|
# This is replacing the one-after-one queries.
|
175 |
|
# Find all revisions, that are in the database, and then remove them from the revision array.
|
176 |
|
# Then later we won't need any conditions for db existence.
|
177 |
|
# Query for several revisions at once, and remove them from the revisions array, if they are there.
|
178 |
|
# Do this in chunks, to avoid eventual memory problems (in case of tens of thousands of commits).
|
179 |
|
# If there are no revisions (because the original code's algoritm filtered them),
|
180 |
|
# then this part will be stepped over.
|
181 |
|
# We make queries, just if there is any revision.
|
182 |
|
limit = 100
|
183 |
|
offset = 0
|
184 |
|
revisions_copy = revisions.clone # revisions will change
|
185 |
|
while offset < revisions_copy.size
|
186 |
|
recent_changesets_slice = changesets.find(
|
187 |
|
:all,
|
188 |
|
:conditions => [
|
189 |
|
'scmid IN (?)',
|
190 |
|
revisions_copy.slice(offset, limit).map{|x| x.scmid}
|
191 |
|
]
|
192 |
|
)
|
193 |
|
# Subtract revisions that redmine already knows about
|
194 |
|
recent_revisions = recent_changesets_slice.map{|c| c.scmid}
|
195 |
|
revisions.reject!{|r| recent_revisions.include?(r.scmid)}
|
196 |
|
offset += limit
|
197 |
|
end
|
198 |
|
|
199 |
173 |
revisions.each do |rev|
|
200 |
|
transaction do
|
201 |
|
# There is no search in the db for this revision, because above we ensured,
|
202 |
|
# that it's not in the db.
|
203 |
|
db_saved_rev = save_revision(rev)
|
204 |
|
parents = {}
|
205 |
|
parents[db_saved_rev] = rev.parents unless rev.parents.nil?
|
206 |
|
parents.each do |ch, chparents|
|
207 |
|
ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
|
|
174 |
db_rev = find_changeset_by_name(rev.revision)
|
|
175 |
if db_rev.nil?
|
|
176 |
transaction do
|
|
177 |
db_saved_rev = save_revision(rev)
|
|
178 |
parents = {}
|
|
179 |
parents[db_saved_rev] = rev.parents unless rev.parents.nil?
|
|
180 |
parents.each do |ch, chparents|
|
|
181 |
ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
|
|
182 |
end
|
208 |
183 |
end
|
209 |
184 |
# saving the last scmid was moved from here, because we won't come in here,
|
210 |
185 |
# if the revision was already added for another branch
|
211 |
186 |
end
|
212 |
187 |
end
|
213 |
|
|
|
188 |
|
214 |
189 |
# save the data about the last revision for this branch
|
215 |
190 |
unless last_revision.nil?
|
216 |
191 |
h["branches"][br]["last_scmid"] = last_revision.scmid
|