@@ -19,12 +19,15 require 'redmine/scm/adapters/mercurial_adapter' | |||
|
19 | 19 | |
|
20 | 20 | class Repository::Mercurial < Repository |
|
21 | 21 | # sort changesets by revision number |
|
22 | has_many :changesets, :order => "#{Changeset.table_name}.id DESC", :foreign_key => 'repository_id' | |
|
22 | has_many :changesets, | |
|
23 | :order => "#{Changeset.table_name}.id DESC", | |
|
24 | :foreign_key => 'repository_id' | |
|
23 | 25 | |
|
24 | attr_protected :root_url | |
|
26 | attr_protected :root_url | |
|
25 | 27 | validates_presence_of :url |
|
26 | 28 | |
|
27 |
|
|
|
29 | # number of changesets to fetch at once | |
|
30 | FETCH_AT_ONCE = 100 | |
|
28 | 31 | |
|
29 | 32 | def self.human_attribute_name(attribute_key_name) |
|
30 | 33 | attr_name = attribute_key_name |
@@ -84,9 +87,11 class Repository::Mercurial < Repository | |||
|
84 | 87 | # Sqlite3 and PostgreSQL pass. |
|
85 | 88 | # Is this MySQL bug? |
|
86 | 89 | def latest_changesets(path, rev, limit=10) |
|
87 |
changesets.find(:all, |
|
|
90 | changesets.find(:all, | |
|
91 | :include => :user, | |
|
88 | 92 | :conditions => latest_changesets_cond(path, rev, limit), |
|
89 | :limit => limit, :order => "#{Changeset.table_name}.id DESC") | |
|
93 | :limit => limit, | |
|
94 | :order => "#{Changeset.table_name}.id DESC") | |
|
90 | 95 | end |
|
91 | 96 | |
|
92 | 97 | def latest_changesets_cond(path, rev, limit) |
@@ -108,7 +113,6 class Repository::Mercurial < Repository | |||
|
108 | 113 | cond << "#{Changeset.table_name}.id <= ?" |
|
109 | 114 | args << last.id |
|
110 | 115 | end |
|
111 | ||
|
112 | 116 | unless path.blank? |
|
113 | 117 | cond << "EXISTS (SELECT * FROM #{Change.table_name} |
|
114 | 118 | WHERE #{Change.table_name}.changeset_id = #{Changeset.table_name}.id |
@@ -117,26 +121,25 class Repository::Mercurial < Repository | |||
|
117 | 121 | args << path.with_leading_slash |
|
118 | 122 | args << "#{path.with_leading_slash.gsub(%r{[%_\\]}) { |s| "\\#{s}" }}/%" << '\\' |
|
119 | 123 | end |
|
120 | ||
|
121 | 124 | [cond.join(' AND '), *args] unless cond.empty? |
|
122 | 125 | end |
|
123 | 126 | private :latest_changesets_cond |
|
124 | 127 | |
|
125 | 128 | def fetch_changesets |
|
126 | 129 | scm_rev = scm.info.lastrev.revision.to_i |
|
127 | db_rev = latest_changeset ? latest_changeset.revision.to_i : -1 | |
|
130 | db_rev = latest_changeset ? latest_changeset.revision.to_i : -1 | |
|
128 | 131 | return unless db_rev < scm_rev # already up-to-date |
|
129 | 132 | |
|
130 | 133 | logger.debug "Fetching changesets for repository #{url}" if logger |
|
131 | 134 | (db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i| |
|
132 | 135 | transaction do |
|
133 | 136 | scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re| |
|
134 | cs = Changeset.create(:repository => self, | |
|
135 | :revision => re.revision, | |
|
136 | :scmid => re.scmid, | |
|
137 | :committer => re.author, | |
|
137 | cs = Changeset.create(:repository => self, | |
|
138 | :revision => re.revision, | |
|
139 | :scmid => re.scmid, | |
|
140 | :committer => re.author, | |
|
138 | 141 | :committed_on => re.time, |
|
139 | :comments => re.message) | |
|
142 | :comments => re.message) | |
|
140 | 143 | re.paths.each { |e| cs.create_change(e) } |
|
141 | 144 | end |
|
142 | 145 | end |
General Comments 0
You need to be logged in to leave comments.
Login now