##// END OF EJS Templates
scm: git: call "git log" only once instead of per branch in fetching revisions (#8857)...
Toshi MARUYAMA -
r8719:1e5f16722fc3
parent child
Show More
@@ -1,221 +1,232
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 # Copyright (C) 2007 Patrick Aljord patcito@ŋmail.com
3 # Copyright (C) 2007 Patrick Aljord patcito@ŋmail.com
4 #
4 #
5 # This program is free software; you can redistribute it and/or
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
8 # of the License, or (at your option) any later version.
9 #
9 #
10 # This program is distributed in the hope that it will be useful,
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
13 # GNU General Public License for more details.
14 #
14 #
15 # You should have received a copy of the GNU General Public License
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
18
19 require 'redmine/scm/adapters/git_adapter'
19 require 'redmine/scm/adapters/git_adapter'
20
20
21 class Repository::Git < Repository
21 class Repository::Git < Repository
22 attr_protected :root_url
22 attr_protected :root_url
23 validates_presence_of :url
23 validates_presence_of :url
24
24
25 def self.human_attribute_name(attribute_key_name, *args)
25 def self.human_attribute_name(attribute_key_name, *args)
26 attr_name = attribute_key_name
26 attr_name = attribute_key_name
27 if attr_name == "url"
27 if attr_name == "url"
28 attr_name = "path_to_repository"
28 attr_name = "path_to_repository"
29 end
29 end
30 super(attr_name, *args)
30 super(attr_name, *args)
31 end
31 end
32
32
33 def self.scm_adapter_class
33 def self.scm_adapter_class
34 Redmine::Scm::Adapters::GitAdapter
34 Redmine::Scm::Adapters::GitAdapter
35 end
35 end
36
36
37 def self.scm_name
37 def self.scm_name
38 'Git'
38 'Git'
39 end
39 end
40
40
41 def report_last_commit
41 def report_last_commit
42 extra_report_last_commit
42 extra_report_last_commit
43 end
43 end
44
44
45 def extra_report_last_commit
45 def extra_report_last_commit
46 return false if extra_info.nil?
46 return false if extra_info.nil?
47 v = extra_info["extra_report_last_commit"]
47 v = extra_info["extra_report_last_commit"]
48 return false if v.nil?
48 return false if v.nil?
49 v.to_s != '0'
49 v.to_s != '0'
50 end
50 end
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?
56 def supports_revision_graph?
57 true
57 true
58 end
58 end
59
59
60 def repo_log_encoding
60 def repo_log_encoding
61 'UTF-8'
61 'UTF-8'
62 end
62 end
63
63
64 # Returns the identifier for the given git changeset
64 # Returns the identifier for the given git changeset
65 def self.changeset_identifier(changeset)
65 def self.changeset_identifier(changeset)
66 changeset.scmid
66 changeset.scmid
67 end
67 end
68
68
69 # Returns the readable identifier for the given git changeset
69 # Returns the readable identifier for the given git changeset
70 def self.format_changeset_identifier(changeset)
70 def self.format_changeset_identifier(changeset)
71 changeset.revision[0, 8]
71 changeset.revision[0, 8]
72 end
72 end
73
73
74 def branches
74 def branches
75 scm.branches
75 scm.branches
76 end
76 end
77
77
78 def tags
78 def tags
79 scm.tags
79 scm.tags
80 end
80 end
81
81
82 def default_branch
82 def default_branch
83 scm.default_branch
83 scm.default_branch
84 rescue Exception => e
84 rescue Exception => e
85 logger.error "git: error during get default branch: #{e.message}"
85 logger.error "git: error during get default branch: #{e.message}"
86 nil
86 nil
87 end
87 end
88
88
89 def find_changeset_by_name(name)
89 def find_changeset_by_name(name)
90 return nil if name.nil? || name.empty?
90 return nil if name.nil? || name.empty?
91 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
91 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
92 return e if e
92 return e if e
93 changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"])
93 changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"])
94 end
94 end
95
95
96 def entries(path=nil, identifier=nil)
96 def entries(path=nil, identifier=nil)
97 scm.entries(path,
97 scm.entries(path,
98 identifier,
98 identifier,
99 options = {:report_last_commit => extra_report_last_commit})
99 options = {:report_last_commit => extra_report_last_commit})
100 end
100 end
101
101
102 # With SCMs that have a sequential commit numbering,
102 # With SCMs that have a sequential commit numbering,
103 # such as Subversion and Mercurial,
103 # such as Subversion and Mercurial,
104 # Redmine is able to be clever and only fetch changesets
104 # Redmine is able to be clever and only fetch changesets
105 # going forward from the most recent one it knows about.
105 # going forward from the most recent one it knows about.
106 #
106 #
107 # However, Git does not have a sequential commit numbering.
107 # However, Git does not have a sequential commit numbering.
108 #
108 #
109 # In order to fetch only new adding revisions,
109 # In order to fetch only new adding revisions,
110 # Redmine needs to parse revisions per branch.
110 # Redmine needs to save "heads".
111 # Branch "last_scmid" is for this requirement.
112 #
111 #
113 # In Git and Mercurial, revisions are not in date order.
112 # In Git and Mercurial, revisions are not in date order.
114 # Redmine Mercurial fixed issues.
113 # Redmine Mercurial fixed issues.
115 # * Redmine Takes Too Long On Large Mercurial Repository
114 # * Redmine Takes Too Long On Large Mercurial Repository
116 # http://www.redmine.org/issues/3449
115 # http://www.redmine.org/issues/3449
117 # * Sorting for changesets might go wrong on Mercurial repos
116 # * Sorting for changesets might go wrong on Mercurial repos
118 # http://www.redmine.org/issues/3567
117 # http://www.redmine.org/issues/3567
119 #
118 #
120 # Database revision column is text, so Redmine can not sort by revision.
119 # Database revision column is text, so Redmine can not sort by revision.
121 # Mercurial has revision number, and revision number guarantees revision order.
120 # Mercurial has revision number, and revision number guarantees revision order.
122 # Redmine Mercurial model stored revisions ordered by database id to database.
121 # Redmine Mercurial model stored revisions ordered by database id to database.
123 # So, Redmine Mercurial model can use correct ordering revisions.
122 # So, Redmine Mercurial model can use correct ordering revisions.
124 #
123 #
125 # Redmine Mercurial adapter uses "hg log -r 0:tip --limit 10"
124 # Redmine Mercurial adapter uses "hg log -r 0:tip --limit 10"
126 # to get limited revisions from old to new.
125 # to get limited revisions from old to new.
127 # But, Git 1.7.3.4 does not support --reverse with -n or --skip.
126 # But, Git 1.7.3.4 does not support --reverse with -n or --skip.
128 #
127 #
129 # The repository can still be fully reloaded by calling #clear_changesets
128 # The repository can still be fully reloaded by calling #clear_changesets
130 # before fetching changesets (eg. for offline resync)
129 # before fetching changesets (eg. for offline resync)
131 def fetch_changesets
130 def fetch_changesets
132 scm_brs = branches
131 scm_brs = branches
133 return if scm_brs.nil? || scm_brs.empty?
132 return if scm_brs.nil? || scm_brs.empty?
133
134 h1 = extra_info || {}
134 h1 = extra_info || {}
135 h = h1.dup
135 h = h1.dup
136 h["branches"] ||= {}
136 repo_heads = scm_brs.map{ |br| br.scmid }
137 h["heads"] ||= []
138 prev_db_heads = h["heads"].dup
139 if prev_db_heads.empty?
140 prev_db_heads += heads_from_branches_hash
141 end
142 return if prev_db_heads.sort == repo_heads.sort
143
137 h["db_consistent"] ||= {}
144 h["db_consistent"] ||= {}
138 if changesets.count == 0
145 if changesets.count == 0
139 h["db_consistent"]["ordering"] = 1
146 h["db_consistent"]["ordering"] = 1
140 merge_extra_info(h)
147 merge_extra_info(h)
141 self.save
148 self.save
142 elsif ! h["db_consistent"].has_key?("ordering")
149 elsif ! h["db_consistent"].has_key?("ordering")
143 h["db_consistent"]["ordering"] = 0
150 h["db_consistent"]["ordering"] = 0
144 merge_extra_info(h)
151 merge_extra_info(h)
145 self.save
152 self.save
146 end
153 end
147 save_revisions(h, scm_brs)
154
155 save_revisions(prev_db_heads, repo_heads)
148 end
156 end
149
157
150 def save_revisions(h, scm_brs)
158 def save_revisions(prev_db_heads, repo_heads)
151 scm_brs.each do |br1|
159 h = {}
152 br = br1.to_s
160 opts = {}
153 from_scmid = nil
161 opts[:reverse] = true
154 from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br]
162 opts[:excludes] = prev_db_heads
155 h["branches"][br] ||= {}
163 opts[:includes] = repo_heads
156 begin
164 begin
157 scm.revisions('', from_scmid, br, {:reverse => true}) do |rev|
165 scm.revisions('', nil, nil, opts) do |rev|
158 db_rev = find_changeset_by_name(rev.revision)
166 db_rev = find_changeset_by_name(rev.scmid)
159 transaction do
167 transaction do
160 if db_rev.nil?
168 if db_rev.nil?
161 db_saved_rev = save_revision(rev)
169 db_saved_rev = save_revision(rev)
162 parents = {}
170 parents = {}
163 parents[db_saved_rev] = rev.parents unless rev.parents.nil?
171 parents[db_saved_rev] = rev.parents unless rev.parents.nil?
164 parents.each do |ch, chparents|
172 parents.each do |ch, chparents|
165 ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
173 ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
166 end
174 end
167 end
175 end
168 h["branches"][br]["last_scmid"] = rev.scmid
176 h["heads"] = prev_db_heads.dup
177 h["heads"] << rev.scmid
169 merge_extra_info(h)
178 merge_extra_info(h)
170 self.save
179 self.save
171 end
180 end
172 end
181 end
182 h["heads"] = repo_heads.dup
183 merge_extra_info(h)
184 self.save
173 rescue Redmine::Scm::Adapters::CommandFailed => e
185 rescue Redmine::Scm::Adapters::CommandFailed => e
174 logger.error("save revisions error: #{e.message}")
186 logger.error("save revisions error: #{e.message}")
175 end
187 end
176 end
188 end
177 end
178 private :save_revisions
189 private :save_revisions
179
190
180 def save_revision(rev)
191 def save_revision(rev)
181 changeset = Changeset.new(
192 changeset = Changeset.new(
182 :repository => self,
193 :repository => self,
183 :revision => rev.identifier,
194 :revision => rev.identifier,
184 :scmid => rev.scmid,
195 :scmid => rev.scmid,
185 :committer => rev.author,
196 :committer => rev.author,
186 :committed_on => rev.time,
197 :committed_on => rev.time,
187 :comments => rev.message
198 :comments => rev.message
188 )
199 )
189 if changeset.save
200 if changeset.save
190 rev.paths.each do |file|
201 rev.paths.each do |file|
191 Change.create(
202 Change.create(
192 :changeset => changeset,
203 :changeset => changeset,
193 :action => file[:action],
204 :action => file[:action],
194 :path => file[:path])
205 :path => file[:path])
195 end
206 end
196 end
207 end
197 changeset
208 changeset
198 end
209 end
199 private :save_revision
210 private :save_revision
200
211
201 def heads_from_branches_hash
212 def heads_from_branches_hash
202 h1 = extra_info || {}
213 h1 = extra_info || {}
203 h = h1.dup
214 h = h1.dup
204 h["branches"] ||= {}
215 h["branches"] ||= {}
205 h['branches'].map{|br, hs| hs['last_scmid']}
216 h['branches'].map{|br, hs| hs['last_scmid']}
206 end
217 end
207
218
208 def latest_changesets(path,rev,limit=10)
219 def latest_changesets(path,rev,limit=10)
209 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
220 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
210 return [] if revisions.nil? || revisions.empty?
221 return [] if revisions.nil? || revisions.empty?
211
222
212 changesets.find(
223 changesets.find(
213 :all,
224 :all,
214 :conditions => [
225 :conditions => [
215 "scmid IN (?)",
226 "scmid IN (?)",
216 revisions.map!{|c| c.scmid}
227 revisions.map!{|c| c.scmid}
217 ],
228 ],
218 :order => 'committed_on DESC'
229 :order => 'committed_on DESC'
219 )
230 )
220 end
231 end
221 end
232 end
@@ -1,517 +1,523
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class RepositoryGitTest < ActiveSupport::TestCase
20 class RepositoryGitTest < ActiveSupport::TestCase
21 fixtures :projects, :repositories, :enabled_modules, :users, :roles
21 fixtures :projects, :repositories, :enabled_modules, :users, :roles
22
22
23 REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s
23 REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s
24 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
24 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
25
25
26 NUM_REV = 28
26 NUM_REV = 28
27
27
28 FELIX_HEX = "Felix Sch\xC3\xA4fer"
28 FELIX_HEX = "Felix Sch\xC3\xA4fer"
29 CHAR_1_HEX = "\xc3\x9c"
29 CHAR_1_HEX = "\xc3\x9c"
30
30
31 ## Ruby uses ANSI api to fork a process on Windows.
31 ## Ruby uses ANSI api to fork a process on Windows.
32 ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
32 ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
33 ## and these are incompatible with ASCII.
33 ## and these are incompatible with ASCII.
34 # WINDOWS_PASS = Redmine::Platform.mswin?
34 # WINDOWS_PASS = Redmine::Platform.mswin?
35 WINDOWS_PASS = false
35 WINDOWS_PASS = false
36
36
37 ## Git, Mercurial and CVS path encodings are binary.
37 ## Git, Mercurial and CVS path encodings are binary.
38 ## Subversion supports URL encoding for path.
38 ## Subversion supports URL encoding for path.
39 ## Redmine Mercurial adapter and extension use URL encoding.
39 ## Redmine Mercurial adapter and extension use URL encoding.
40 ## Git accepts only binary path in command line parameter.
40 ## Git accepts only binary path in command line parameter.
41 ## So, there is no way to use binary command line parameter in JRuby.
41 ## So, there is no way to use binary command line parameter in JRuby.
42 JRUBY_SKIP = (RUBY_PLATFORM == 'java')
42 JRUBY_SKIP = (RUBY_PLATFORM == 'java')
43 JRUBY_SKIP_STR = "TODO: This test fails in JRuby"
43 JRUBY_SKIP_STR = "TODO: This test fails in JRuby"
44
44
45 if File.directory?(REPOSITORY_PATH)
45 if File.directory?(REPOSITORY_PATH)
46 def setup
46 def setup
47 klass = Repository::Git
47 klass = Repository::Git
48 assert_equal "Git", klass.scm_name
48 assert_equal "Git", klass.scm_name
49 assert klass.scm_adapter_class
49 assert klass.scm_adapter_class
50 assert_not_equal "", klass.scm_command
50 assert_not_equal "", klass.scm_command
51 assert_equal true, klass.scm_available
51 assert_equal true, klass.scm_available
52
52
53 @project = Project.find(3)
53 @project = Project.find(3)
54 @repository = Repository::Git.create(
54 @repository = Repository::Git.create(
55 :project => @project,
55 :project => @project,
56 :url => REPOSITORY_PATH,
56 :url => REPOSITORY_PATH,
57 :path_encoding => 'ISO-8859-1'
57 :path_encoding => 'ISO-8859-1'
58 )
58 )
59 assert @repository
59 assert @repository
60 @char_1 = CHAR_1_HEX.dup
60 @char_1 = CHAR_1_HEX.dup
61 if @char_1.respond_to?(:force_encoding)
61 if @char_1.respond_to?(:force_encoding)
62 @char_1.force_encoding('UTF-8')
62 @char_1.force_encoding('UTF-8')
63 end
63 end
64 end
64 end
65
65
66 def test_fetch_changesets_from_scratch
66 def test_fetch_changesets_from_scratch
67 assert_nil @repository.extra_info
67 assert_nil @repository.extra_info
68
68
69 assert_equal 0, @repository.changesets.count
69 assert_equal 0, @repository.changesets.count
70 @repository.fetch_changesets
70 @repository.fetch_changesets
71 @project.reload
71 @project.reload
72
72
73 assert_equal NUM_REV, @repository.changesets.count
73 assert_equal NUM_REV, @repository.changesets.count
74 assert_equal 39, @repository.changes.count
74 assert_equal 39, @repository.changes.count
75
75
76 commit = @repository.changesets.find(:first, :order => 'committed_on ASC')
76 commit = @repository.changesets.find(:first, :order => 'committed_on ASC')
77 assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments
77 assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments
78 assert_equal "jsmith <jsmith@foo.bar>", commit.committer
78 assert_equal "jsmith <jsmith@foo.bar>", commit.committer
79 assert_equal User.find_by_login('jsmith'), commit.user
79 assert_equal User.find_by_login('jsmith'), commit.user
80 # TODO: add a commit with commit time <> author time to the test repository
80 # TODO: add a commit with commit time <> author time to the test repository
81 assert_equal "2007-12-14 09:22:52".to_time, commit.committed_on
81 assert_equal "2007-12-14 09:22:52".to_time, commit.committed_on
82 assert_equal "2007-12-14".to_date, commit.commit_date
82 assert_equal "2007-12-14".to_date, commit.commit_date
83 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.revision
83 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.revision
84 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.scmid
84 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.scmid
85 assert_equal 3, commit.changes.count
85 assert_equal 3, commit.changes.count
86 change = commit.changes.sort_by(&:path).first
86 change = commit.changes.sort_by(&:path).first
87 assert_equal "README", change.path
87 assert_equal "README", change.path
88 assert_equal "A", change.action
88 assert_equal "A", change.action
89
89
90 assert_equal 5, @repository.extra_info["branches"].size
90 assert_equal 5, @repository.extra_info["heads"].size
91 end
91 end
92
92
93 def test_fetch_changesets_incremental
93 def test_fetch_changesets_incremental
94 assert_equal 0, @repository.changesets.count
94 assert_equal 0, @repository.changesets.count
95 @repository.fetch_changesets
95 @repository.fetch_changesets
96 @project.reload
96 @project.reload
97 assert_equal NUM_REV, @repository.changesets.count
97 assert_equal NUM_REV, @repository.changesets.count
98 extra_info_db = @repository.extra_info["branches"]
98 extra_info_heads = @repository.extra_info["heads"].dup
99 assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127",
99 assert_equal 5, extra_info_heads.size
100 extra_info_db["latin-1-path-encoding"]["last_scmid"]
100 extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" }
101 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
101 assert_equal 4, extra_info_heads.size
102 extra_info_db["master"]["last_scmid"]
103
102
104 del_revs = [
103 del_revs = [
105 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
104 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
106 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
105 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
107 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
106 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
108 "deff712f05a90d96edbd70facc47d944be5897e3",
107 "deff712f05a90d96edbd70facc47d944be5897e3",
109 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
108 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
110 "7e61ac704deecde634b51e59daa8110435dcb3da",
109 "7e61ac704deecde634b51e59daa8110435dcb3da",
111 ]
110 ]
112 @repository.changesets.each do |rev|
111 @repository.changesets.each do |rev|
113 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
112 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
114 end
113 end
115 @project.reload
114 @project.reload
116 cs1 = @repository.changesets
115 cs1 = @repository.changesets
117 assert_equal 22, cs1.count
116 assert_equal NUM_REV - 6, cs1.count
118 h = @repository.extra_info.dup
117 extra_info_heads << "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
119 h["branches"]["master"]["last_scmid"] =
118 h = {}
120 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
119 h["heads"] = extra_info_heads
121 @repository.merge_extra_info(h)
120 @repository.merge_extra_info(h)
122 @repository.save
121 @repository.save
123 @project.reload
122 @project.reload
124 extra_info_db_1 = @repository.extra_info["branches"]
123 assert @repository.extra_info["heads"].index("4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8")
125 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8",
126 extra_info_db_1["master"]["last_scmid"]
127
128 @repository.fetch_changesets
124 @repository.fetch_changesets
129 @project.reload
125 @project.reload
130 assert_equal NUM_REV, @repository.changesets.count
126 assert_equal NUM_REV, @repository.changesets.count
127 assert_equal 5, @repository.extra_info["heads"].size
128 assert @repository.extra_info["heads"].index("83ca5fd546063a3c7dc2e568ba3355661a9e2b2c")
131 end
129 end
132
130
133 def test_fetch_changesets_history_editing
131 def test_fetch_changesets_history_editing
134 assert_equal 0, @repository.changesets.count
132 assert_equal 0, @repository.changesets.count
135 @repository.fetch_changesets
133 @repository.fetch_changesets
136 @project.reload
134 @project.reload
137 assert_equal NUM_REV, @repository.changesets.count
135 assert_equal NUM_REV, @repository.changesets.count
138 assert_equal 5, @repository.extra_info["branches"].size
136 extra_info_heads = @repository.extra_info["heads"].dup
139 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
137 assert_equal 5, extra_info_heads.size
140 @repository.extra_info["branches"]["master"]["last_scmid"]
138 extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" }
139 assert_equal 4, extra_info_heads.size
141
140
142 del_revs = [
141 del_revs = [
143 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
142 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
144 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
143 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
145 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
144 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
146 "deff712f05a90d96edbd70facc47d944be5897e3",
145 "deff712f05a90d96edbd70facc47d944be5897e3",
147 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
146 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
148 "7e61ac704deecde634b51e59daa8110435dcb3da",
147 "7e61ac704deecde634b51e59daa8110435dcb3da",
149 ]
148 ]
150 @repository.changesets.each do |rev|
149 @repository.changesets.each do |rev|
151 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
150 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
152 end
151 end
153 @project.reload
152 @project.reload
154 assert_equal NUM_REV - 6, @repository.changesets.count
153 assert_equal NUM_REV - 6, @repository.changesets.count
155
154
156 c = Changeset.new(:repository => @repository,
155 c = Changeset.new(:repository => @repository,
157 :committed_on => Time.now,
156 :committed_on => Time.now,
158 :revision => "abcd1234efgh",
157 :revision => "abcd1234efgh",
159 :scmid => "abcd1234efgh",
158 :scmid => "abcd1234efgh",
160 :comments => 'test')
159 :comments => 'test')
161 assert c.save
160 assert c.save
162 @project.reload
161 @project.reload
163 assert_equal NUM_REV - 5, @repository.changesets.count
162 assert_equal NUM_REV - 5, @repository.changesets.count
164
163
165 h = @repository.extra_info.dup
164 extra_info_heads << "abcd1234efgh"
166 h["branches"]["master"]["last_scmid"] = "abcd1234efgh"
165 h = {}
166 h["heads"] = extra_info_heads
167 @repository.merge_extra_info(h)
167 @repository.merge_extra_info(h)
168 @repository.save
168 @repository.save
169 @project.reload
169 @project.reload
170 assert_equal "abcd1234efgh",
170 h1 = @repository.extra_info["heads"].dup
171 @repository.extra_info["branches"]["master"]["last_scmid"]
171 assert h1.index("abcd1234efgh")
172 assert_equal 5, h1.size
172
173
173 @repository.fetch_changesets
174 @repository.fetch_changesets
174 @project.reload
175 @project.reload
175 assert_equal NUM_REV - 5, @repository.changesets.count
176 assert_equal NUM_REV - 5, @repository.changesets.count
177 h2 = @repository.extra_info["heads"].dup
178 assert_equal h1, h2
176 end
179 end
177
180
178 def test_parents
181 def test_parents
179 assert_equal 0, @repository.changesets.count
182 assert_equal 0, @repository.changesets.count
180 @repository.fetch_changesets
183 @repository.fetch_changesets
181 @project.reload
184 @project.reload
182 assert_equal NUM_REV, @repository.changesets.count
185 assert_equal NUM_REV, @repository.changesets.count
183 r1 = @repository.find_changeset_by_name("7234cb2750b63")
186 r1 = @repository.find_changeset_by_name("7234cb2750b63")
184 assert_equal [], r1.parents
187 assert_equal [], r1.parents
185 r2 = @repository.find_changeset_by_name("899a15dba03a3")
188 r2 = @repository.find_changeset_by_name("899a15dba03a3")
186 assert_equal 1, r2.parents.length
189 assert_equal 1, r2.parents.length
187 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
190 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
188 r2.parents[0].identifier
191 r2.parents[0].identifier
189 r3 = @repository.find_changeset_by_name("32ae898b720c2")
192 r3 = @repository.find_changeset_by_name("32ae898b720c2")
190 assert_equal 2, r3.parents.length
193 assert_equal 2, r3.parents.length
191 r4 = [r3.parents[0].identifier, r3.parents[1].identifier].sort
194 r4 = [r3.parents[0].identifier, r3.parents[1].identifier].sort
192 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", r4[0]
195 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", r4[0]
193 assert_equal "7e61ac704deecde634b51e59daa8110435dcb3da", r4[1]
196 assert_equal "7e61ac704deecde634b51e59daa8110435dcb3da", r4[1]
194 end
197 end
195
198
196 def test_db_consistent_ordering_init
199 def test_db_consistent_ordering_init
197 assert_nil @repository.extra_info
200 assert_nil @repository.extra_info
198 assert_equal 0, @repository.changesets.count
201 assert_equal 0, @repository.changesets.count
199 @repository.fetch_changesets
202 @repository.fetch_changesets
200 @project.reload
203 @project.reload
201 assert_equal 1, @repository.extra_info["db_consistent"]["ordering"]
204 assert_equal 1, @repository.extra_info["db_consistent"]["ordering"]
202 end
205 end
203
206
204 def test_db_consistent_ordering_before_1_2
207 def test_db_consistent_ordering_before_1_2
205 assert_nil @repository.extra_info
208 assert_nil @repository.extra_info
206 assert_equal 0, @repository.changesets.count
209 assert_equal 0, @repository.changesets.count
207 @repository.fetch_changesets
210 @repository.fetch_changesets
208 @project.reload
211 @project.reload
209 assert_equal NUM_REV, @repository.changesets.count
212 assert_equal NUM_REV, @repository.changesets.count
210 assert_not_nil @repository.extra_info
213 assert_not_nil @repository.extra_info
211 @repository.write_attribute(:extra_info, nil)
214 @repository.write_attribute(:extra_info, nil)
212 @repository.save
215 @repository.save
213 assert_nil @repository.extra_info
216 assert_nil @repository.extra_info
214 assert_equal NUM_REV, @repository.changesets.count
217 assert_equal NUM_REV, @repository.changesets.count
215 @repository.fetch_changesets
218 @repository.fetch_changesets
216 @project.reload
219 @project.reload
217 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
220 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
218
221
222 extra_info_heads = @repository.extra_info["heads"].dup
223 extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" }
219 del_revs = [
224 del_revs = [
220 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
225 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
221 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
226 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
222 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
227 "4f26664364207fa8b1af9f8722647ab2d4ac5d43",
223 "deff712f05a90d96edbd70facc47d944be5897e3",
228 "deff712f05a90d96edbd70facc47d944be5897e3",
224 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
229 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
225 "7e61ac704deecde634b51e59daa8110435dcb3da",
230 "7e61ac704deecde634b51e59daa8110435dcb3da",
226 ]
231 ]
227 @repository.changesets.each do |rev|
232 @repository.changesets.each do |rev|
228 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
233 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s }
229 end
234 end
230 @project.reload
235 @project.reload
231 cs1 = @repository.changesets
236 cs1 = @repository.changesets
232 assert_equal NUM_REV - 6, cs1.count
237 assert_equal NUM_REV - 6, cs1.count
233 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
238 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
234 h = @repository.extra_info.dup
239
235 h["branches"]["master"]["last_scmid"] =
240 extra_info_heads << "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
236 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
241 h = {}
242 h["heads"] = extra_info_heads
237 @repository.merge_extra_info(h)
243 @repository.merge_extra_info(h)
238 @repository.save
244 @repository.save
239 @project.reload
245 @project.reload
240 extra_info_db_1 = @repository.extra_info["branches"]
246 assert @repository.extra_info["heads"].index("4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8")
241 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8",
242 extra_info_db_1["master"]["last_scmid"]
243
244 @repository.fetch_changesets
247 @repository.fetch_changesets
248 @project.reload
245 assert_equal NUM_REV, @repository.changesets.count
249 assert_equal NUM_REV, @repository.changesets.count
250 assert_equal 5, @repository.extra_info["heads"].size
251
246 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
252 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
247 end
253 end
248
254
249 def test_heads_from_branches_hash
255 def test_heads_from_branches_hash
250 assert_nil @repository.extra_info
256 assert_nil @repository.extra_info
251 assert_equal 0, @repository.changesets.count
257 assert_equal 0, @repository.changesets.count
252 assert_equal [], @repository.heads_from_branches_hash
258 assert_equal [], @repository.heads_from_branches_hash
253 h = {}
259 h = {}
254 h["branches"] = {}
260 h["branches"] = {}
255 h["branches"]["test1"] = {}
261 h["branches"]["test1"] = {}
256 h["branches"]["test1"]["last_scmid"] = "1234abcd"
262 h["branches"]["test1"]["last_scmid"] = "1234abcd"
257 h["branches"]["test2"] = {}
263 h["branches"]["test2"] = {}
258 h["branches"]["test2"]["last_scmid"] = "abcd1234"
264 h["branches"]["test2"]["last_scmid"] = "abcd1234"
259 @repository.merge_extra_info(h)
265 @repository.merge_extra_info(h)
260 @repository.save
266 @repository.save
261 @project.reload
267 @project.reload
262 assert_equal ["1234abcd", "abcd1234"], @repository.heads_from_branches_hash.sort
268 assert_equal ["1234abcd", "abcd1234"], @repository.heads_from_branches_hash.sort
263 end
269 end
264
270
265 def test_latest_changesets
271 def test_latest_changesets
266 assert_equal 0, @repository.changesets.count
272 assert_equal 0, @repository.changesets.count
267 @repository.fetch_changesets
273 @repository.fetch_changesets
268 @project.reload
274 @project.reload
269 assert_equal NUM_REV, @repository.changesets.count
275 assert_equal NUM_REV, @repository.changesets.count
270 # with limit
276 # with limit
271 changesets = @repository.latest_changesets('', 'master', 2)
277 changesets = @repository.latest_changesets('', 'master', 2)
272 assert_equal 2, changesets.size
278 assert_equal 2, changesets.size
273
279
274 # with path
280 # with path
275 changesets = @repository.latest_changesets('images', 'master')
281 changesets = @repository.latest_changesets('images', 'master')
276 assert_equal [
282 assert_equal [
277 'deff712f05a90d96edbd70facc47d944be5897e3',
283 'deff712f05a90d96edbd70facc47d944be5897e3',
278 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
284 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
279 '7234cb2750b63f47bff735edc50a1c0a433c2518',
285 '7234cb2750b63f47bff735edc50a1c0a433c2518',
280 ], changesets.collect(&:revision)
286 ], changesets.collect(&:revision)
281
287
282 changesets = @repository.latest_changesets('README', nil)
288 changesets = @repository.latest_changesets('README', nil)
283 assert_equal [
289 assert_equal [
284 '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf',
290 '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf',
285 '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8',
291 '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8',
286 '713f4944648826f558cf548222f813dabe7cbb04',
292 '713f4944648826f558cf548222f813dabe7cbb04',
287 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
293 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
288 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
294 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
289 '7234cb2750b63f47bff735edc50a1c0a433c2518',
295 '7234cb2750b63f47bff735edc50a1c0a433c2518',
290 ], changesets.collect(&:revision)
296 ], changesets.collect(&:revision)
291
297
292 # with path, revision and limit
298 # with path, revision and limit
293 changesets = @repository.latest_changesets('images', '899a15dba')
299 changesets = @repository.latest_changesets('images', '899a15dba')
294 assert_equal [
300 assert_equal [
295 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
301 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
296 '7234cb2750b63f47bff735edc50a1c0a433c2518',
302 '7234cb2750b63f47bff735edc50a1c0a433c2518',
297 ], changesets.collect(&:revision)
303 ], changesets.collect(&:revision)
298
304
299 changesets = @repository.latest_changesets('images', '899a15dba', 1)
305 changesets = @repository.latest_changesets('images', '899a15dba', 1)
300 assert_equal [
306 assert_equal [
301 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
307 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
302 ], changesets.collect(&:revision)
308 ], changesets.collect(&:revision)
303
309
304 changesets = @repository.latest_changesets('README', '899a15dba')
310 changesets = @repository.latest_changesets('README', '899a15dba')
305 assert_equal [
311 assert_equal [
306 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
312 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
307 '7234cb2750b63f47bff735edc50a1c0a433c2518',
313 '7234cb2750b63f47bff735edc50a1c0a433c2518',
308 ], changesets.collect(&:revision)
314 ], changesets.collect(&:revision)
309
315
310 changesets = @repository.latest_changesets('README', '899a15dba', 1)
316 changesets = @repository.latest_changesets('README', '899a15dba', 1)
311 assert_equal [
317 assert_equal [
312 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
318 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
313 ], changesets.collect(&:revision)
319 ], changesets.collect(&:revision)
314
320
315 # with path, tag and limit
321 # with path, tag and limit
316 changesets = @repository.latest_changesets('images', 'tag01.annotated')
322 changesets = @repository.latest_changesets('images', 'tag01.annotated')
317 assert_equal [
323 assert_equal [
318 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
324 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
319 '7234cb2750b63f47bff735edc50a1c0a433c2518',
325 '7234cb2750b63f47bff735edc50a1c0a433c2518',
320 ], changesets.collect(&:revision)
326 ], changesets.collect(&:revision)
321
327
322 changesets = @repository.latest_changesets('images', 'tag01.annotated', 1)
328 changesets = @repository.latest_changesets('images', 'tag01.annotated', 1)
323 assert_equal [
329 assert_equal [
324 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
330 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
325 ], changesets.collect(&:revision)
331 ], changesets.collect(&:revision)
326
332
327 changesets = @repository.latest_changesets('README', 'tag01.annotated')
333 changesets = @repository.latest_changesets('README', 'tag01.annotated')
328 assert_equal [
334 assert_equal [
329 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
335 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
330 '7234cb2750b63f47bff735edc50a1c0a433c2518',
336 '7234cb2750b63f47bff735edc50a1c0a433c2518',
331 ], changesets.collect(&:revision)
337 ], changesets.collect(&:revision)
332
338
333 changesets = @repository.latest_changesets('README', 'tag01.annotated', 1)
339 changesets = @repository.latest_changesets('README', 'tag01.annotated', 1)
334 assert_equal [
340 assert_equal [
335 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
341 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
336 ], changesets.collect(&:revision)
342 ], changesets.collect(&:revision)
337
343
338 # with path, branch and limit
344 # with path, branch and limit
339 changesets = @repository.latest_changesets('images', 'test_branch')
345 changesets = @repository.latest_changesets('images', 'test_branch')
340 assert_equal [
346 assert_equal [
341 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
347 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
342 '7234cb2750b63f47bff735edc50a1c0a433c2518',
348 '7234cb2750b63f47bff735edc50a1c0a433c2518',
343 ], changesets.collect(&:revision)
349 ], changesets.collect(&:revision)
344
350
345 changesets = @repository.latest_changesets('images', 'test_branch', 1)
351 changesets = @repository.latest_changesets('images', 'test_branch', 1)
346 assert_equal [
352 assert_equal [
347 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
353 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
348 ], changesets.collect(&:revision)
354 ], changesets.collect(&:revision)
349
355
350 changesets = @repository.latest_changesets('README', 'test_branch')
356 changesets = @repository.latest_changesets('README', 'test_branch')
351 assert_equal [
357 assert_equal [
352 '713f4944648826f558cf548222f813dabe7cbb04',
358 '713f4944648826f558cf548222f813dabe7cbb04',
353 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
359 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
354 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
360 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9',
355 '7234cb2750b63f47bff735edc50a1c0a433c2518',
361 '7234cb2750b63f47bff735edc50a1c0a433c2518',
356 ], changesets.collect(&:revision)
362 ], changesets.collect(&:revision)
357
363
358 changesets = @repository.latest_changesets('README', 'test_branch', 2)
364 changesets = @repository.latest_changesets('README', 'test_branch', 2)
359 assert_equal [
365 assert_equal [
360 '713f4944648826f558cf548222f813dabe7cbb04',
366 '713f4944648826f558cf548222f813dabe7cbb04',
361 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
367 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
362 ], changesets.collect(&:revision)
368 ], changesets.collect(&:revision)
363
369
364 if JRUBY_SKIP
370 if JRUBY_SKIP
365 puts JRUBY_SKIP_STR
371 puts JRUBY_SKIP_STR
366 else
372 else
367 # latin-1 encoding path
373 # latin-1 encoding path
368 changesets = @repository.latest_changesets(
374 changesets = @repository.latest_changesets(
369 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89')
375 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89')
370 assert_equal [
376 assert_equal [
371 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d',
377 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d',
372 '4fc55c43bf3d3dc2efb66145365ddc17639ce81e',
378 '4fc55c43bf3d3dc2efb66145365ddc17639ce81e',
373 ], changesets.collect(&:revision)
379 ], changesets.collect(&:revision)
374
380
375 changesets = @repository.latest_changesets(
381 changesets = @repository.latest_changesets(
376 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89', 1)
382 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89', 1)
377 assert_equal [
383 assert_equal [
378 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d',
384 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d',
379 ], changesets.collect(&:revision)
385 ], changesets.collect(&:revision)
380 end
386 end
381 end
387 end
382
388
383 def test_latest_changesets_latin_1_dir
389 def test_latest_changesets_latin_1_dir
384 if WINDOWS_PASS
390 if WINDOWS_PASS
385 #
391 #
386 elsif JRUBY_SKIP
392 elsif JRUBY_SKIP
387 puts JRUBY_SKIP_STR
393 puts JRUBY_SKIP_STR
388 else
394 else
389 assert_equal 0, @repository.changesets.count
395 assert_equal 0, @repository.changesets.count
390 @repository.fetch_changesets
396 @repository.fetch_changesets
391 @project.reload
397 @project.reload
392 assert_equal NUM_REV, @repository.changesets.count
398 assert_equal NUM_REV, @repository.changesets.count
393 changesets = @repository.latest_changesets(
399 changesets = @repository.latest_changesets(
394 "latin-1-dir/test-#{@char_1}-subdir", '1ca7f5ed')
400 "latin-1-dir/test-#{@char_1}-subdir", '1ca7f5ed')
395 assert_equal [
401 assert_equal [
396 '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127',
402 '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127',
397 ], changesets.collect(&:revision)
403 ], changesets.collect(&:revision)
398 end
404 end
399 end
405 end
400
406
401 def test_find_changeset_by_name
407 def test_find_changeset_by_name
402 assert_equal 0, @repository.changesets.count
408 assert_equal 0, @repository.changesets.count
403 @repository.fetch_changesets
409 @repository.fetch_changesets
404 @project.reload
410 @project.reload
405 assert_equal NUM_REV, @repository.changesets.count
411 assert_equal NUM_REV, @repository.changesets.count
406 ['7234cb2750b63f47bff735edc50a1c0a433c2518', '7234cb2750b'].each do |r|
412 ['7234cb2750b63f47bff735edc50a1c0a433c2518', '7234cb2750b'].each do |r|
407 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518',
413 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518',
408 @repository.find_changeset_by_name(r).revision
414 @repository.find_changeset_by_name(r).revision
409 end
415 end
410 end
416 end
411
417
412 def test_find_changeset_by_empty_name
418 def test_find_changeset_by_empty_name
413 assert_equal 0, @repository.changesets.count
419 assert_equal 0, @repository.changesets.count
414 @repository.fetch_changesets
420 @repository.fetch_changesets
415 @project.reload
421 @project.reload
416 assert_equal NUM_REV, @repository.changesets.count
422 assert_equal NUM_REV, @repository.changesets.count
417 ['', ' ', nil].each do |r|
423 ['', ' ', nil].each do |r|
418 assert_nil @repository.find_changeset_by_name(r)
424 assert_nil @repository.find_changeset_by_name(r)
419 end
425 end
420 end
426 end
421
427
422 def test_identifier
428 def test_identifier
423 assert_equal 0, @repository.changesets.count
429 assert_equal 0, @repository.changesets.count
424 @repository.fetch_changesets
430 @repository.fetch_changesets
425 @project.reload
431 @project.reload
426 assert_equal NUM_REV, @repository.changesets.count
432 assert_equal NUM_REV, @repository.changesets.count
427 c = @repository.changesets.find_by_revision(
433 c = @repository.changesets.find_by_revision(
428 '7234cb2750b63f47bff735edc50a1c0a433c2518')
434 '7234cb2750b63f47bff735edc50a1c0a433c2518')
429 assert_equal c.scmid, c.identifier
435 assert_equal c.scmid, c.identifier
430 end
436 end
431
437
432 def test_format_identifier
438 def test_format_identifier
433 assert_equal 0, @repository.changesets.count
439 assert_equal 0, @repository.changesets.count
434 @repository.fetch_changesets
440 @repository.fetch_changesets
435 @project.reload
441 @project.reload
436 assert_equal NUM_REV, @repository.changesets.count
442 assert_equal NUM_REV, @repository.changesets.count
437 c = @repository.changesets.find_by_revision(
443 c = @repository.changesets.find_by_revision(
438 '7234cb2750b63f47bff735edc50a1c0a433c2518')
444 '7234cb2750b63f47bff735edc50a1c0a433c2518')
439 assert_equal '7234cb27', c.format_identifier
445 assert_equal '7234cb27', c.format_identifier
440 end
446 end
441
447
442 def test_activities
448 def test_activities
443 c = Changeset.new(:repository => @repository,
449 c = Changeset.new(:repository => @repository,
444 :committed_on => Time.now,
450 :committed_on => Time.now,
445 :revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
451 :revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
446 :scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
452 :scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2',
447 :comments => 'test')
453 :comments => 'test')
448 assert c.event_title.include?('abc7234c:')
454 assert c.event_title.include?('abc7234c:')
449 assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
455 assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev]
450 end
456 end
451
457
452 def test_log_utf8
458 def test_log_utf8
453 assert_equal 0, @repository.changesets.count
459 assert_equal 0, @repository.changesets.count
454 @repository.fetch_changesets
460 @repository.fetch_changesets
455 @project.reload
461 @project.reload
456 assert_equal NUM_REV, @repository.changesets.count
462 assert_equal NUM_REV, @repository.changesets.count
457 str_felix_hex = FELIX_HEX.dup
463 str_felix_hex = FELIX_HEX.dup
458 if str_felix_hex.respond_to?(:force_encoding)
464 if str_felix_hex.respond_to?(:force_encoding)
459 str_felix_hex.force_encoding('UTF-8')
465 str_felix_hex.force_encoding('UTF-8')
460 end
466 end
461 c = @repository.changesets.find_by_revision(
467 c = @repository.changesets.find_by_revision(
462 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b')
468 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b')
463 assert_equal "#{str_felix_hex} <felix@fachschaften.org>", c.committer
469 assert_equal "#{str_felix_hex} <felix@fachschaften.org>", c.committer
464 end
470 end
465
471
466 def test_previous
472 def test_previous
467 assert_equal 0, @repository.changesets.count
473 assert_equal 0, @repository.changesets.count
468 @repository.fetch_changesets
474 @repository.fetch_changesets
469 @project.reload
475 @project.reload
470 assert_equal NUM_REV, @repository.changesets.count
476 assert_equal NUM_REV, @repository.changesets.count
471 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1|
477 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1|
472 changeset = @repository.find_changeset_by_name(r1)
478 changeset = @repository.find_changeset_by_name(r1)
473 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2|
479 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2|
474 assert_equal @repository.find_changeset_by_name(r2), changeset.previous
480 assert_equal @repository.find_changeset_by_name(r2), changeset.previous
475 end
481 end
476 end
482 end
477 end
483 end
478
484
479 def test_previous_nil
485 def test_previous_nil
480 assert_equal 0, @repository.changesets.count
486 assert_equal 0, @repository.changesets.count
481 @repository.fetch_changesets
487 @repository.fetch_changesets
482 @project.reload
488 @project.reload
483 assert_equal NUM_REV, @repository.changesets.count
489 assert_equal NUM_REV, @repository.changesets.count
484 %w|95488a44bc25f7d1f97d775a31359539ff333a63 95488a44b|.each do |r1|
490 %w|7234cb2750b63f47bff735edc50a1c0a433c2518 7234cb275|.each do |r1|
485 changeset = @repository.find_changeset_by_name(r1)
491 changeset = @repository.find_changeset_by_name(r1)
486 assert_nil changeset.previous
492 assert_nil changeset.previous
487 end
493 end
488 end
494 end
489
495
490 def test_next
496 def test_next
491 assert_equal 0, @repository.changesets.count
497 assert_equal 0, @repository.changesets.count
492 @repository.fetch_changesets
498 @repository.fetch_changesets
493 @project.reload
499 @project.reload
494 assert_equal NUM_REV, @repository.changesets.count
500 assert_equal NUM_REV, @repository.changesets.count
495 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2|
501 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2|
496 changeset = @repository.find_changeset_by_name(r2)
502 changeset = @repository.find_changeset_by_name(r2)
497 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1|
503 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1|
498 assert_equal @repository.find_changeset_by_name(r1), changeset.next
504 assert_equal @repository.find_changeset_by_name(r1), changeset.next
499 end
505 end
500 end
506 end
501 end
507 end
502
508
503 def test_next_nil
509 def test_next_nil
504 assert_equal 0, @repository.changesets.count
510 assert_equal 0, @repository.changesets.count
505 @repository.fetch_changesets
511 @repository.fetch_changesets
506 @project.reload
512 @project.reload
507 assert_equal NUM_REV, @repository.changesets.count
513 assert_equal NUM_REV, @repository.changesets.count
508 %w|67e7792ce20ccae2e4bb73eed09bb397819c8834 67e7792ce20cca|.each do |r1|
514 %w|2a682156a3b6e77a8bf9cd4590e8db757f3c6c78 2a682156a3b6e77a|.each do |r1|
509 changeset = @repository.find_changeset_by_name(r1)
515 changeset = @repository.find_changeset_by_name(r1)
510 assert_nil changeset.next
516 assert_nil changeset.next
511 end
517 end
512 end
518 end
513 else
519 else
514 puts "Git test repository NOT FOUND. Skipping unit tests !!!"
520 puts "Git test repository NOT FOUND. Skipping unit tests !!!"
515 def test_fake; assert true end
521 def test_fake; assert true end
516 end
522 end
517 end
523 end
General Comments 0
You need to be logged in to leave comments. Login now