diff --git a/CHANGELOG b/CHANGELOG index 5447b07e0..c645bff27 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Subversion module recognizes the password prompt for HTTP authentication + * Preserve +x on scripts when using darcs #1929 [Scott Barron] * When executing multiline commands, use a backslash to escape the newline diff --git a/Rakefile b/Rakefile index 2e99a9924..69ac03c9a 100644 --- a/Rakefile +++ b/Rakefile @@ -15,7 +15,7 @@ desc "Build documentation" task :doc => [ :rdoc ] Rake::TestTask.new do |t| - t.test_files = Dir["test/*_test.rb"] + t.test_files = Dir["test/**/*_test.rb"] t.verbose = true end diff --git a/lib/switchtower/scm/subversion.rb b/lib/switchtower/scm/subversion.rb index 79cb6aef8..cc5d78c3e 100644 --- a/lib/switchtower/scm/subversion.rb +++ b/lib/switchtower/scm/subversion.rb @@ -27,7 +27,8 @@ def latest_revision configuration.logger.debug "querying latest revision..." unless @latest_revision repo = configuration.repository until @latest_revision - @latest_revision = latest_revision_at(repo) + match = svn_log(repo).scan(/r(\d+)/).first + @latest_revision = match ? match.first : nil if @latest_revision.nil? # if a revision number was not reported, move up a level in the path # and try again. @@ -55,7 +56,7 @@ def checkout(actor) actor.run(command) do |ch, stream, out| prefix = "#{stream} :: #{ch[:host]}" actor.logger.info out, prefix - if out =~ /^Password:/ + if out =~ /^Password.*:/ actor.logger.info "subversion is asking for a password", prefix ch.send_data "#{actor.password}\n" elsif out =~ %r{\(yes/no\)} @@ -76,9 +77,8 @@ def checkout(actor) private - def latest_revision_at(path) - match = `svn log -q -rhead #{path}`.scan(/r(\d+)/).first - match ? match.first : nil + def svn_log(path) + `svn log -q -rhead #{path}` end end diff --git a/test/scm/subversion_test.rb b/test/scm/subversion_test.rb new file mode 100644 index 000000000..47942d9b9 --- /dev/null +++ b/test/scm/subversion_test.rb @@ -0,0 +1,118 @@ +$:.unshift File.dirname(__FILE__) + "/../../lib" + +require 'test/unit' +require 'switchtower/scm/subversion' + +class ScmSubversionTest < Test::Unit::TestCase + class MockLogger + def info(msg,pfx=nil) end + def debug(msg,pfx=nil) end + end + + class MockConfiguration < Hash + def logger + @logger ||= MockLogger.new + end + + def method_missing(sym, *args) + if args.length == 0 + self[sym] + else + super + end + end + end + + class SubversionTest < SwitchTower::SCM::Subversion + attr_accessor :story + attr_reader :last_path + + def svn_log(path) + @last_path = path + story.shift + end + end + + class MockChannel + attr_reader :sent_data + + def send_data(data) + @sent_data ||= [] + @sent_data << data + end + + def [](name) + "value" + end + end + + class MockActor + attr_reader :command + attr_reader :channels + attr_accessor :story + + def initialize(config) + @config = config + end + + def run(command) + @command = command + @channels ||= [] + @channels << MockChannel.new + story.each { |stream, line| yield @channels.last, stream, line } + end + + def method_missing(sym, *args) + @config.send(sym, *args) + end + end + + def setup + @config = MockConfiguration.new + @config[:repository] = "/hello/world" + @config[:svn] = "/path/to/svn" + @config[:password] = "chocolatebrownies" + @scm = SubversionTest.new(@config) + @actor = MockActor.new(@config) + @log_msg = <