comparison app/models/repository/git.rb @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents 0c939c159af4
children 5e80956cc792 433d4f72a19b
comparison
equal deleted inserted replaced
908:c6c2cbd0afee 909:cbb26bc654de
51 51
52 def supports_directory_revisions? 52 def supports_directory_revisions?
53 true 53 true
54 end 54 end
55 55
56 def supports_revision_graph?
57 true
58 end
59
56 def repo_log_encoding 60 def repo_log_encoding
57 'UTF-8' 61 'UTF-8'
58 end 62 end
59 63
60 # Returns the identifier for the given git changeset 64 # Returns the identifier for the given git changeset
75 scm.tags 79 scm.tags
76 end 80 end
77 81
78 def default_branch 82 def default_branch
79 scm.default_branch 83 scm.default_branch
84 rescue Exception => e
85 logger.error "git: error during get default branch: #{e.message}"
86 nil
80 end 87 end
81 88
82 def find_changeset_by_name(name) 89 def find_changeset_by_name(name)
83 return nil if name.nil? || name.empty? 90 return nil if name.nil? || name.empty?
84 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s]) 91 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
90 scm.entries(path, 97 scm.entries(path,
91 identifier, 98 identifier,
92 options = {:report_last_commit => extra_report_last_commit}) 99 options = {:report_last_commit => extra_report_last_commit})
93 end 100 end
94 101
102 # With SCMs that have a sequential commit numbering,
103 # such as Subversion and Mercurial,
104 # Redmine is able to be clever and only fetch changesets
105 # going forward from the most recent one it knows about.
106 #
107 # However, Git does not have a sequential commit numbering.
108 #
109 # In order to fetch only new adding revisions,
110 # Redmine needs to parse revisions per branch.
111 # Branch "last_scmid" is for this requirement.
112 #
95 # In Git and Mercurial, revisions are not in date order. 113 # In Git and Mercurial, revisions are not in date order.
96 # Redmine Mercurial fixed issues. 114 # Redmine Mercurial fixed issues.
97 # * Redmine Takes Too Long On Large Mercurial Repository 115 # * Redmine Takes Too Long On Large Mercurial Repository
98 # http://www.redmine.org/issues/3449 116 # http://www.redmine.org/issues/3449
99 # * Sorting for changesets might go wrong on Mercurial repos 117 # * Sorting for changesets might go wrong on Mercurial repos
124 elsif ! h["db_consistent"].has_key?("ordering") 142 elsif ! h["db_consistent"].has_key?("ordering")
125 h["db_consistent"]["ordering"] = 0 143 h["db_consistent"]["ordering"] = 0
126 merge_extra_info(h) 144 merge_extra_info(h)
127 self.save 145 self.save
128 end 146 end
129 scm_brs.each do |br| 147 scm_brs.each do |br1|
148 br = br1.to_s
130 from_scmid = nil 149 from_scmid = nil
131 from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br] 150 from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br]
132 h["branches"][br] ||= {} 151 h["branches"][br] ||= {}
133 scm.revisions('', from_scmid, br, {:reverse => true}) do |rev| 152 scm.revisions('', from_scmid, br, {:reverse => true}) do |rev|
134 db_rev = find_changeset_by_name(rev.revision) 153 db_rev = find_changeset_by_name(rev.revision)
135 transaction do 154 transaction do
136 if db_rev.nil? 155 if db_rev.nil?
137 save_revision(rev) 156 db_saved_rev = save_revision(rev)
157 parents = {}
158 parents[db_saved_rev] = rev.parents unless rev.parents.nil?
159 parents.each do |ch, chparents|
160 ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
161 end
138 end 162 end
139 h["branches"][br]["last_scmid"] = rev.scmid 163 h["branches"][br]["last_scmid"] = rev.scmid
140 merge_extra_info(h) 164 merge_extra_info(h)
141 self.save 165 self.save
142 end 166 end
159 :changeset => changeset, 183 :changeset => changeset,
160 :action => file[:action], 184 :action => file[:action],
161 :path => file[:path]) 185 :path => file[:path])
162 end 186 end
163 end 187 end
188 changeset
164 end 189 end
165 private :save_revision 190 private :save_revision
166 191
167 def latest_changesets(path,rev,limit=10) 192 def latest_changesets(path,rev,limit=10)
168 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false) 193 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)