diff options
author | Toshi MARUYAMA <marutosijp2@yahoo.co.jp> | 2012-02-11 05:42:06 +0000 |
---|---|---|
committer | Toshi MARUYAMA <marutosijp2@yahoo.co.jp> | 2012-02-11 05:42:06 +0000 |
commit | 1e5f16722fc3dc8e4250309bc4fc5c579461454b (patch) | |
tree | 9126abcd9bab824e45f4893864a1c3afdb9a19c1 /app/models | |
parent | c2943ffd2938dad9a54cdd79d7d73c0733bf04ec (diff) | |
download | redmine-1e5f16722fc3dc8e4250309bc4fc5c579461454b.tar.gz redmine-1e5f16722fc3dc8e4250309bc4fc5c579461454b.zip |
scm: git: call "git log" only once instead of per branch in fetching revisions (#8857)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8839 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/repository/git.rb | 67 |
1 files changed, 39 insertions, 28 deletions
diff --git a/app/models/repository/git.rb b/app/models/repository/git.rb index c5606f240..207a224ec 100644 --- a/app/models/repository/git.rb +++ b/app/models/repository/git.rb @@ -107,8 +107,7 @@ class Repository::Git < Repository # However, Git does not have a sequential commit numbering. # # In order to fetch only new adding revisions, - # Redmine needs to parse revisions per branch. - # Branch "last_scmid" is for this requirement. + # Redmine needs to save "heads". # # In Git and Mercurial, revisions are not in date order. # Redmine Mercurial fixed issues. @@ -131,9 +130,17 @@ class Repository::Git < Repository def fetch_changesets scm_brs = branches return if scm_brs.nil? || scm_brs.empty? + h1 = extra_info || {} h = h1.dup - h["branches"] ||= {} + repo_heads = scm_brs.map{ |br| br.scmid } + h["heads"] ||= [] + prev_db_heads = h["heads"].dup + if prev_db_heads.empty? + prev_db_heads += heads_from_branches_hash + end + return if prev_db_heads.sort == repo_heads.sort + h["db_consistent"] ||= {} if changesets.count == 0 h["db_consistent"]["ordering"] = 1 @@ -144,35 +151,39 @@ class Repository::Git < Repository merge_extra_info(h) self.save end - save_revisions(h, scm_brs) - end - - def save_revisions(h, scm_brs) - scm_brs.each do |br1| - br = br1.to_s - from_scmid = nil - from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br] - h["branches"][br] ||= {} - begin - scm.revisions('', from_scmid, br, {:reverse => true}) do |rev| - db_rev = find_changeset_by_name(rev.revision) - transaction do - if db_rev.nil? - db_saved_rev = save_revision(rev) - parents = {} - parents[db_saved_rev] = rev.parents unless rev.parents.nil? - parents.each do |ch, chparents| - ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact - end + + save_revisions(prev_db_heads, repo_heads) + end + + def save_revisions(prev_db_heads, repo_heads) + h = {} + opts = {} + opts[:reverse] = true + opts[:excludes] = prev_db_heads + opts[:includes] = repo_heads + begin + scm.revisions('', nil, nil, opts) do |rev| + db_rev = find_changeset_by_name(rev.scmid) + transaction do + if db_rev.nil? + db_saved_rev = save_revision(rev) + parents = {} + parents[db_saved_rev] = rev.parents unless rev.parents.nil? + parents.each do |ch, chparents| + ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact end - h["branches"][br]["last_scmid"] = rev.scmid - merge_extra_info(h) - self.save end + h["heads"] = prev_db_heads.dup + h["heads"] << rev.scmid + merge_extra_info(h) + self.save end - rescue Redmine::Scm::Adapters::CommandFailed => e - logger.error("save revisions error: #{e.message}") end + h["heads"] = repo_heads.dup + merge_extra_info(h) + self.save + rescue Redmine::Scm::Adapters::CommandFailed => e + logger.error("save revisions error: #{e.message}") end end private :save_revisions |