##// END OF EJS Templates
scm: mercurial: change diff option from --git to --config diff.git=false (#7253)....
Toshi MARUYAMA -
r4568:80b329d031dc
parent child
Show More
@@ -1,225 +1,225
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 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 'redmine/scm/adapters/abstract_adapter'
18 require 'redmine/scm/adapters/abstract_adapter'
19 require 'cgi'
19 require 'cgi'
20
20
21 module Redmine
21 module Redmine
22 module Scm
22 module Scm
23 module Adapters
23 module Adapters
24 class MercurialAdapter < AbstractAdapter
24 class MercurialAdapter < AbstractAdapter
25
25
26 # Mercurial executable name
26 # Mercurial executable name
27 HG_BIN = "hg"
27 HG_BIN = "hg"
28 TEMPLATES_DIR = File.dirname(__FILE__) + "/mercurial"
28 TEMPLATES_DIR = File.dirname(__FILE__) + "/mercurial"
29 TEMPLATE_NAME = "hg-template"
29 TEMPLATE_NAME = "hg-template"
30 TEMPLATE_EXTENSION = "tmpl"
30 TEMPLATE_EXTENSION = "tmpl"
31
31
32 class << self
32 class << self
33 def client_version
33 def client_version
34 @@client_version ||= (hgversion || [])
34 @@client_version ||= (hgversion || [])
35 end
35 end
36
36
37 def hgversion
37 def hgversion
38 # The hg version is expressed either as a
38 # The hg version is expressed either as a
39 # release number (eg 0.9.5 or 1.0) or as a revision
39 # release number (eg 0.9.5 or 1.0) or as a revision
40 # id composed of 12 hexa characters.
40 # id composed of 12 hexa characters.
41 theversion = hgversion_from_command_line
41 theversion = hgversion_from_command_line
42 if m = theversion.match(%r{\A(.*?)((\d+\.)+\d+)})
42 if m = theversion.match(%r{\A(.*?)((\d+\.)+\d+)})
43 m[2].scan(%r{\d+}).collect(&:to_i)
43 m[2].scan(%r{\d+}).collect(&:to_i)
44 end
44 end
45 end
45 end
46
46
47 def hgversion_from_command_line
47 def hgversion_from_command_line
48 shellout("#{HG_BIN} --version") { |io| io.read }.to_s
48 shellout("#{HG_BIN} --version") { |io| io.read }.to_s
49 end
49 end
50
50
51 def template_path
51 def template_path
52 @@template_path ||= template_path_for(client_version)
52 @@template_path ||= template_path_for(client_version)
53 end
53 end
54
54
55 def template_path_for(version)
55 def template_path_for(version)
56 if ((version <=> [0,9,5]) > 0) || version.empty?
56 if ((version <=> [0,9,5]) > 0) || version.empty?
57 ver = "1.0"
57 ver = "1.0"
58 else
58 else
59 ver = "0.9.5"
59 ver = "0.9.5"
60 end
60 end
61 "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
61 "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{ver}.#{TEMPLATE_EXTENSION}"
62 end
62 end
63 end
63 end
64
64
65 def info
65 def info
66 cmd = "#{HG_BIN} -R #{target('')} root"
66 cmd = "#{HG_BIN} -R #{target('')} root"
67 root_url = nil
67 root_url = nil
68 shellout(cmd) do |io|
68 shellout(cmd) do |io|
69 root_url = io.read
69 root_url = io.read
70 end
70 end
71 return nil if $? && $?.exitstatus != 0
71 return nil if $? && $?.exitstatus != 0
72 info = Info.new({:root_url => root_url.chomp,
72 info = Info.new({:root_url => root_url.chomp,
73 :lastrev => revisions(nil,nil,nil,{:limit => 1}).last
73 :lastrev => revisions(nil,nil,nil,{:limit => 1}).last
74 })
74 })
75 info
75 info
76 rescue CommandFailed
76 rescue CommandFailed
77 return nil
77 return nil
78 end
78 end
79
79
80 def entries(path=nil, identifier=nil)
80 def entries(path=nil, identifier=nil)
81 path ||= ''
81 path ||= ''
82 entries = Entries.new
82 entries = Entries.new
83 cmd = "#{HG_BIN} -R #{target('')} --cwd #{target('')} locate"
83 cmd = "#{HG_BIN} -R #{target('')} --cwd #{target('')} locate"
84 cmd << " -r #{hgrev(identifier)}"
84 cmd << " -r #{hgrev(identifier)}"
85 cmd << " " + shell_quote("path:#{path}") unless path.empty?
85 cmd << " " + shell_quote("path:#{path}") unless path.empty?
86 shellout(cmd) do |io|
86 shellout(cmd) do |io|
87 io.each_line do |line|
87 io.each_line do |line|
88 # HG uses antislashs as separator on Windows
88 # HG uses antislashs as separator on Windows
89 line = line.gsub(/\\/, "/")
89 line = line.gsub(/\\/, "/")
90 if path.empty? or e = line.gsub!(%r{^#{with_trailling_slash(path)}},'')
90 if path.empty? or e = line.gsub!(%r{^#{with_trailling_slash(path)}},'')
91 e ||= line
91 e ||= line
92 e = e.chomp.split(%r{[\/\\]})
92 e = e.chomp.split(%r{[\/\\]})
93 entries << Entry.new({:name => e.first,
93 entries << Entry.new({:name => e.first,
94 :path => (path.nil? or path.empty? ? e.first : "#{with_trailling_slash(path)}#{e.first}"),
94 :path => (path.nil? or path.empty? ? e.first : "#{with_trailling_slash(path)}#{e.first}"),
95 :kind => (e.size > 1 ? 'dir' : 'file'),
95 :kind => (e.size > 1 ? 'dir' : 'file'),
96 :lastrev => Revision.new
96 :lastrev => Revision.new
97 }) unless e.empty? || entries.detect{|entry| entry.name == e.first}
97 }) unless e.empty? || entries.detect{|entry| entry.name == e.first}
98 end
98 end
99 end
99 end
100 end
100 end
101 return nil if $? && $?.exitstatus != 0
101 return nil if $? && $?.exitstatus != 0
102 entries.sort_by_name
102 entries.sort_by_name
103 end
103 end
104
104
105 # Fetch the revisions by using a template file that
105 # Fetch the revisions by using a template file that
106 # makes Mercurial produce a xml output.
106 # makes Mercurial produce a xml output.
107 def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
107 def revisions(path=nil, identifier_from=nil, identifier_to=nil, options={})
108 revisions = Revisions.new
108 revisions = Revisions.new
109 cmd = "#{HG_BIN} --debug --encoding utf8 -R #{target('')} log -C --style #{shell_quote self.class.template_path}"
109 cmd = "#{HG_BIN} --debug --encoding utf8 -R #{target('')} log -C --style #{shell_quote self.class.template_path}"
110 if identifier_from && identifier_to
110 if identifier_from && identifier_to
111 cmd << " -r #{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
111 cmd << " -r #{hgrev(identifier_from)}:#{hgrev(identifier_to)}"
112 elsif identifier_from
112 elsif identifier_from
113 cmd << " -r #{hgrev(identifier_from)}:"
113 cmd << " -r #{hgrev(identifier_from)}:"
114 end
114 end
115 cmd << " --limit #{options[:limit].to_i}" if options[:limit]
115 cmd << " --limit #{options[:limit].to_i}" if options[:limit]
116 cmd << " #{shell_quote path}" unless path.blank?
116 cmd << " #{shell_quote path}" unless path.blank?
117 shellout(cmd) do |io|
117 shellout(cmd) do |io|
118 begin
118 begin
119 # HG doesn't close the XML Document...
119 # HG doesn't close the XML Document...
120 doc = REXML::Document.new(io.read << "</log>")
120 doc = REXML::Document.new(io.read << "</log>")
121 doc.elements.each("log/logentry") do |logentry|
121 doc.elements.each("log/logentry") do |logentry|
122 paths = []
122 paths = []
123 copies = logentry.get_elements('paths/path-copied')
123 copies = logentry.get_elements('paths/path-copied')
124 logentry.elements.each("paths/path") do |path|
124 logentry.elements.each("paths/path") do |path|
125 # Detect if the added file is a copy
125 # Detect if the added file is a copy
126 if path.attributes['action'] == 'A' and c = copies.find{ |e| e.text == path.text }
126 if path.attributes['action'] == 'A' and c = copies.find{ |e| e.text == path.text }
127 from_path = c.attributes['copyfrom-path']
127 from_path = c.attributes['copyfrom-path']
128 from_rev = logentry.attributes['revision']
128 from_rev = logentry.attributes['revision']
129 end
129 end
130 paths << {:action => path.attributes['action'],
130 paths << {:action => path.attributes['action'],
131 :path => "/#{CGI.unescape(path.text)}",
131 :path => "/#{CGI.unescape(path.text)}",
132 :from_path => from_path ? "/#{CGI.unescape(from_path)}" : nil,
132 :from_path => from_path ? "/#{CGI.unescape(from_path)}" : nil,
133 :from_revision => from_rev ? from_rev : nil
133 :from_revision => from_rev ? from_rev : nil
134 }
134 }
135 end
135 end
136 paths.sort! { |x,y| x[:path] <=> y[:path] }
136 paths.sort! { |x,y| x[:path] <=> y[:path] }
137
137
138 revisions << Revision.new({:identifier => logentry.attributes['revision'],
138 revisions << Revision.new({:identifier => logentry.attributes['revision'],
139 :scmid => logentry.attributes['node'],
139 :scmid => logentry.attributes['node'],
140 :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""),
140 :author => (logentry.elements['author'] ? logentry.elements['author'].text : ""),
141 :time => Time.parse(logentry.elements['date'].text).localtime,
141 :time => Time.parse(logentry.elements['date'].text).localtime,
142 :message => logentry.elements['msg'].text,
142 :message => logentry.elements['msg'].text,
143 :paths => paths
143 :paths => paths
144 })
144 })
145 end
145 end
146 rescue
146 rescue
147 logger.debug($!)
147 logger.debug($!)
148 end
148 end
149 end
149 end
150 return nil if $? && $?.exitstatus != 0
150 return nil if $? && $?.exitstatus != 0
151 revisions
151 revisions
152 end
152 end
153
153
154 def diff(path, identifier_from, identifier_to=nil)
154 def diff(path, identifier_from, identifier_to=nil)
155 path ||= ''
155 path ||= ''
156 diff_args = ''
156 diff_args = ''
157 diff = []
157 diff = []
158 if identifier_to
158 if identifier_to
159 diff_args = "-r #{hgrev(identifier_to)} -r #{hgrev(identifier_from)}"
159 diff_args = "-r #{hgrev(identifier_to)} -r #{hgrev(identifier_from)}"
160 else
160 else
161 if self.class.client_version_above?([1, 2])
161 if self.class.client_version_above?([1, 2])
162 diff_args = "-c #{hgrev(identifier_from)}"
162 diff_args = "-c #{hgrev(identifier_from)}"
163 else
163 else
164 return []
164 return []
165 end
165 end
166 end
166 end
167 cmd = "#{HG_BIN} -R #{target('')} diff --nodates --git #{diff_args}"
167 cmd = "#{HG_BIN} -R #{target('')} --config diff.git=false diff --nodates #{diff_args}"
168 cmd << " -I #{target(path)}" unless path.empty?
168 cmd << " -I #{target(path)}" unless path.empty?
169 shellout(cmd) do |io|
169 shellout(cmd) do |io|
170 io.each_line do |line|
170 io.each_line do |line|
171 diff << line
171 diff << line
172 end
172 end
173 end
173 end
174 return nil if $? && $?.exitstatus != 0
174 return nil if $? && $?.exitstatus != 0
175 diff
175 diff
176 end
176 end
177
177
178 def cat(path, identifier=nil)
178 def cat(path, identifier=nil)
179 cmd = "#{HG_BIN} -R #{target('')} cat"
179 cmd = "#{HG_BIN} -R #{target('')} cat"
180 cmd << " -r #{hgrev(identifier)}"
180 cmd << " -r #{hgrev(identifier)}"
181 cmd << " #{target(path)}"
181 cmd << " #{target(path)}"
182 cat = nil
182 cat = nil
183 shellout(cmd) do |io|
183 shellout(cmd) do |io|
184 io.binmode
184 io.binmode
185 cat = io.read
185 cat = io.read
186 end
186 end
187 return nil if $? && $?.exitstatus != 0
187 return nil if $? && $?.exitstatus != 0
188 cat
188 cat
189 end
189 end
190
190
191 def annotate(path, identifier=nil)
191 def annotate(path, identifier=nil)
192 path ||= ''
192 path ||= ''
193 cmd = "#{HG_BIN} -R #{target('')}"
193 cmd = "#{HG_BIN} -R #{target('')}"
194 cmd << " annotate -ncu"
194 cmd << " annotate -ncu"
195 cmd << " -r #{hgrev(identifier)}"
195 cmd << " -r #{hgrev(identifier)}"
196 cmd << " #{target(path)}"
196 cmd << " #{target(path)}"
197 blame = Annotate.new
197 blame = Annotate.new
198 shellout(cmd) do |io|
198 shellout(cmd) do |io|
199 io.each_line do |line|
199 io.each_line do |line|
200 next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$}
200 next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$}
201 r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3,
201 r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3,
202 :identifier => $3)
202 :identifier => $3)
203 blame.add_line($4.rstrip, r)
203 blame.add_line($4.rstrip, r)
204 end
204 end
205 end
205 end
206 return nil if $? && $?.exitstatus != 0
206 return nil if $? && $?.exitstatus != 0
207 blame
207 blame
208 end
208 end
209
209
210 class Revision < Redmine::Scm::Adapters::Revision
210 class Revision < Redmine::Scm::Adapters::Revision
211 # Returns the readable identifier
211 # Returns the readable identifier
212 def format_identifier
212 def format_identifier
213 "#{revision}:#{scmid}"
213 "#{revision}:#{scmid}"
214 end
214 end
215 end
215 end
216
216
217 # Returns correct revision identifier
217 # Returns correct revision identifier
218 def hgrev(identifier)
218 def hgrev(identifier)
219 shell_quote(identifier.blank? ? 'tip' : identifier.to_s)
219 shell_quote(identifier.blank? ? 'tip' : identifier.to_s)
220 end
220 end
221 private :hgrev
221 private :hgrev
222 end
222 end
223 end
223 end
224 end
224 end
225 end
225 end
@@ -1,130 +1,130
1 require File.expand_path('../../../../../../test_helper', __FILE__)
1 require File.expand_path('../../../../../../test_helper', __FILE__)
2 begin
2 begin
3 require 'mocha'
3 require 'mocha'
4
4
5 class MercurialAdapterTest < ActiveSupport::TestCase
5 class MercurialAdapterTest < ActiveSupport::TestCase
6
6
7 TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR
7 TEMPLATES_DIR = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATES_DIR
8 TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
8 TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
9 TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION
9 TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION
10
10
11 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
11 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
12
12
13 if File.directory?(REPOSITORY_PATH)
13 if File.directory?(REPOSITORY_PATH)
14 def setup
14 def setup
15 @adapter = Redmine::Scm::Adapters::MercurialAdapter.new(REPOSITORY_PATH)
15 @adapter = Redmine::Scm::Adapters::MercurialAdapter.new(REPOSITORY_PATH)
16 end
16 end
17
17
18 def test_hgversion
18 def test_hgversion
19 to_test = { "Mercurial Distributed SCM (version 0.9.5)\n" => [0,9,5],
19 to_test = { "Mercurial Distributed SCM (version 0.9.5)\n" => [0,9,5],
20 "Mercurial Distributed SCM (1.0)\n" => [1,0],
20 "Mercurial Distributed SCM (1.0)\n" => [1,0],
21 "Mercurial Distributed SCM (1e4ddc9ac9f7+20080325)\n" => nil,
21 "Mercurial Distributed SCM (1e4ddc9ac9f7+20080325)\n" => nil,
22 "Mercurial Distributed SCM (1.0.1+20080525)\n" => [1,0,1],
22 "Mercurial Distributed SCM (1.0.1+20080525)\n" => [1,0,1],
23 "Mercurial Distributed SCM (1916e629a29d)\n" => nil,
23 "Mercurial Distributed SCM (1916e629a29d)\n" => nil,
24 "Mercurial SCM Distribuito (versione 0.9.5)\n" => [0,9,5],
24 "Mercurial SCM Distribuito (versione 0.9.5)\n" => [0,9,5],
25 "(1.6)\n(1.7)\n(1.8)" => [1,6],
25 "(1.6)\n(1.7)\n(1.8)" => [1,6],
26 "(1.7.1)\r\n(1.8.1)\r\n(1.9.1)" => [1,7,1]}
26 "(1.7.1)\r\n(1.8.1)\r\n(1.9.1)" => [1,7,1]}
27
27
28 to_test.each do |s, v|
28 to_test.each do |s, v|
29 test_hgversion_for(s, v)
29 test_hgversion_for(s, v)
30 end
30 end
31 end
31 end
32
32
33 def test_template_path
33 def test_template_path
34 to_test = { [0,9,5] => "0.9.5",
34 to_test = { [0,9,5] => "0.9.5",
35 [1,0] => "1.0",
35 [1,0] => "1.0",
36 [] => "1.0",
36 [] => "1.0",
37 [1,0,1] => "1.0",
37 [1,0,1] => "1.0",
38 [1,7] => "1.0",
38 [1,7] => "1.0",
39 [1,7,1] => "1.0" }
39 [1,7,1] => "1.0" }
40 to_test.each do |v, template|
40 to_test.each do |v, template|
41 test_template_path_for(v, template)
41 test_template_path_for(v, template)
42 end
42 end
43 end
43 end
44
44
45 def test_diff
45 def test_diff
46 if @adapter.class.client_version_above?([1, 2])
46 if @adapter.class.client_version_above?([1, 2])
47 assert_nil @adapter.diff(nil, '100000')
47 assert_nil @adapter.diff(nil, '100000')
48 end
48 end
49 assert_nil @adapter.diff(nil, '100000', '200000')
49 assert_nil @adapter.diff(nil, '100000', '200000')
50 [2, '400bb8672109', '400', 400].each do |r1|
50 [2, '400bb8672109', '400', 400].each do |r1|
51 diff1 = @adapter.diff(nil, r1)
51 diff1 = @adapter.diff(nil, r1)
52 if @adapter.class.client_version_above?([1, 2])
52 if @adapter.class.client_version_above?([1, 2])
53 assert_equal 28, diff1.size
53 assert_equal 28, diff1.size
54 buf = diff1[24].gsub(/\r\n|\r|\n/, "")
54 buf = diff1[24].gsub(/\r\n|\r|\n/, "")
55 assert_equal "+ return true unless klass.respond_to?('watched_by')", buf
55 assert_equal "+ return true unless klass.respond_to?('watched_by')", buf
56 else
56 else
57 assert_equal 0, diff1.size
57 assert_equal 0, diff1.size
58 end
58 end
59 [4, 'def6d2f1254a'].each do |r2|
59 [4, 'def6d2f1254a'].each do |r2|
60 diff2 = @adapter.diff(nil,r1,r2)
60 diff2 = @adapter.diff(nil,r1,r2)
61 assert_equal 50, diff2.size
61 assert_equal 49, diff2.size
62 buf = diff2[42].gsub(/\r\n|\r|\n/, "")
62 buf = diff2[41].gsub(/\r\n|\r|\n/, "")
63 assert_equal "+class WelcomeController < ApplicationController", buf
63 assert_equal "+class WelcomeController < ApplicationController", buf
64 diff3 = @adapter.diff('sources/watchers_controller.rb', r1, r2)
64 diff3 = @adapter.diff('sources/watchers_controller.rb', r1, r2)
65 assert_equal 20, diff3.size
65 assert_equal 20, diff3.size
66 buf = diff3[12].gsub(/\r\n|\r|\n/, "")
66 buf = diff3[12].gsub(/\r\n|\r|\n/, "")
67 assert_equal "+ @watched.remove_watcher(user)", buf
67 assert_equal "+ @watched.remove_watcher(user)", buf
68 end
68 end
69 end
69 end
70 end
70 end
71
71
72 def test_cat
72 def test_cat
73 [2, '400bb8672109', '400', 400].each do |r|
73 [2, '400bb8672109', '400', 400].each do |r|
74 buf = @adapter.cat('sources/welcome_controller.rb', r)
74 buf = @adapter.cat('sources/welcome_controller.rb', r)
75 assert buf
75 assert buf
76 lines = buf.split("\r\n")
76 lines = buf.split("\r\n")
77 assert_equal 25, lines.length
77 assert_equal 25, lines.length
78 assert_equal 'class WelcomeController < ApplicationController', lines[17]
78 assert_equal 'class WelcomeController < ApplicationController', lines[17]
79 end
79 end
80 assert_nil @adapter.cat('sources/welcome_controller.rb')
80 assert_nil @adapter.cat('sources/welcome_controller.rb')
81 end
81 end
82
82
83 def test_annotate
83 def test_annotate
84 assert_equal [], @adapter.annotate("sources/welcome_controller.rb").lines
84 assert_equal [], @adapter.annotate("sources/welcome_controller.rb").lines
85 [2, '400bb8672109', '400', 400].each do |r|
85 [2, '400bb8672109', '400', 400].each do |r|
86 ann = @adapter.annotate('sources/welcome_controller.rb', r)
86 ann = @adapter.annotate('sources/welcome_controller.rb', r)
87 assert ann
87 assert ann
88 assert_equal '1', ann.revisions[17].revision
88 assert_equal '1', ann.revisions[17].revision
89 assert_equal '9d5b5b004199', ann.revisions[17].identifier
89 assert_equal '9d5b5b004199', ann.revisions[17].identifier
90 assert_equal 'jsmith', ann.revisions[0].author
90 assert_equal 'jsmith', ann.revisions[0].author
91 assert_equal 25, ann.lines.length
91 assert_equal 25, ann.lines.length
92 assert_equal 'class WelcomeController < ApplicationController', ann.lines[17]
92 assert_equal 'class WelcomeController < ApplicationController', ann.lines[17]
93 end
93 end
94 end
94 end
95
95
96 def test_access_by_nodeid
96 def test_access_by_nodeid
97 path = 'sources/welcome_controller.rb'
97 path = 'sources/welcome_controller.rb'
98 assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109')
98 assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109')
99 end
99 end
100
100
101 def test_access_by_fuzzy_nodeid
101 def test_access_by_fuzzy_nodeid
102 path = 'sources/welcome_controller.rb'
102 path = 'sources/welcome_controller.rb'
103 # falls back to nodeid
103 # falls back to nodeid
104 assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400')
104 assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400')
105 end
105 end
106
106
107 private
107 private
108
108
109 def test_hgversion_for(hgversion, version)
109 def test_hgversion_for(hgversion, version)
110 @adapter.class.expects(:hgversion_from_command_line).returns(hgversion)
110 @adapter.class.expects(:hgversion_from_command_line).returns(hgversion)
111 assert_equal version, @adapter.class.hgversion
111 assert_equal version, @adapter.class.hgversion
112 end
112 end
113
113
114 def test_template_path_for(version, template)
114 def test_template_path_for(version, template)
115 assert_equal "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
115 assert_equal "#{TEMPLATES_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
116 @adapter.class.template_path_for(version)
116 @adapter.class.template_path_for(version)
117 assert File.exist?(@adapter.class.template_path_for(version))
117 assert File.exist?(@adapter.class.template_path_for(version))
118 end
118 end
119 else
119 else
120 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
120 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
121 def test_fake; assert true end
121 def test_fake; assert true end
122 end
122 end
123 end
123 end
124
124
125 rescue LoadError
125 rescue LoadError
126 class MercurialMochaFake < ActiveSupport::TestCase
126 class MercurialMochaFake < ActiveSupport::TestCase
127 def test_fake; assert(false, "Requires mocha to run those tests") end
127 def test_fake; assert(false, "Requires mocha to run those tests") end
128 end
128 end
129 end
129 end
130
130
General Comments 0
You need to be logged in to leave comments. Login now