1
0
Fork 0
mirror of https://github.com/capistrano/capistrano synced 2023-03-27 23:21:18 -04:00

Add support for password prompts for Mercurial SCM (closes #11187)

git-svn-id: http://svn.rubyonrails.org/rails/tools/capistrano@8925 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jamis Buck 2008-02-23 04:04:27 +00:00
parent c6ff8b9fe6
commit 07d777b746
3 changed files with 140 additions and 8 deletions

View file

@ -1,5 +1,7 @@
*SVN*
* Add support for password prompts from the Mercurial SCM [ches]
* Add support for :max_hosts option in task definition or run() [Rob Holland <rob@inversepath.com>]
* Distributed git support for better operability with remote_cache strategy [voidlock]

View file

@ -70,24 +70,25 @@ module Capistrano
logger.info "[#{stream}] #{text}"
case text
when /^user:/mi
if variable(:scm_user)
"#{variable(:scm_user)}\n"
# support :scm_user for backwards compatibility of this module
if user = variable(:scm_username) || variable(:scm_user)
"#{user}\n"
else
raise "No variable :scm_user specified and Mercurial asked!\n" +
raise "No variable :scm_username specified and Mercurial asked!\n" +
"Prompt was: #{text}"
end
when /^password:/mi
if variable(:scm_password)
"#{variable(:scm_password)}\n"
else
when /\bpassword:/mi
unless pass = scm_password_or_prompt
# fall back on old behavior of erroring out with msg
raise "No variable :scm_password specified and Mercurial asked!\n" +
"Prompt was: #{text}"
end
"#{pass}\n"
when /yes\/no/i
"yes\n"
end
end
private
# Fine grained mercurial commands
@ -122,6 +123,12 @@ module Capistrano
else "--verbose"
end
end
# honor Cap 2.1+'s :scm_prefer_prompt if present
def scm_password_or_prompt
@scm_password_or_prompt ||= variable(:scm_password) ||
(Capistrano::CLI.password_prompt("hg password: ") if variable(:scm_prefer_prompt))
end
end
end

View file

@ -0,0 +1,123 @@
require "#{File.dirname(__FILE__)}/../../utils"
require 'capistrano/recipes/deploy/scm/mercurial'
class DeploySCMMercurialTest < Test::Unit::TestCase
class TestSCM < Capistrano::Deploy::SCM::Mercurial
default_command "hg"
end
def setup
@config = { }
def @config.exists?(name); key?(name); end
@source = TestSCM.new(@config)
end
def test_head
assert_equal "tip", @source.head
end
def test_checkout
@config[:repository] = "http://example.com/project-hg"
dest = "/var/www"
assert_equal "hg clone --noupdate http://example.com/project-hg /var/www && hg update --repository /var/www --clean 8a8e00b8f11b", @source.checkout('8a8e00b8f11b', dest)
end
def test_diff
assert_equal "hg diff --rev tip", @source.diff('tip')
assert_equal "hg diff --rev 1 --rev 2", @source.diff('1', '2')
end
def test_log
assert_equal "hg log --rev 8a8e00b8f11b", @source.log('8a8e00b8f11b')
assert_equal "hg log --rev 0:3", @source.log('0', '3')
end
def test_query_revision
assert_equal "hg log -r 8a8e00b8f11b --template '{node|short}'", @source.query_revision('8a8e00b8f11b') { |o| o }
end
def test_username_should_be_backwards_compatible
# older versions of this module required :scm_user var instead
# of the currently preferred :scm_username
require 'capistrano/logger'
@config[:scm_user] = "fred"
text = "user:"
assert_equal "fred\n", @source.handle_data(:test_state, :test_stream, text)
# :scm_username takes priority
@config[:scm_username] = "wilma"
assert_equal "wilma\n", @source.handle_data(:test_state, :test_stream, text)
end
def test_sync
dest = "/var/www"
assert_equal "hg pull --repository /var/www && hg update --repository /var/www --clean 8a8e00b8f11b", @source.sync('8a8e00b8f11b', dest)
# With :scm_command
@config[:scm_command] = "/opt/local/bin/hg"
assert_equal "/opt/local/bin/hg pull --repository /var/www && /opt/local/bin/hg update --repository /var/www --clean 8a8e00b8f11b", @source.sync('8a8e00b8f11b', dest)
end
def test_export
dest = "/var/www"
assert_raise(NotImplementedError) { @source.export('8a8e00b8f11b', dest) }
end
def test_sends_password_if_set
require 'capistrano/logger'
text = "password:"
@config[:scm_password] = "opensesame"
assert_equal "opensesame\n", @source.handle_data(:test_state, :test_stream, text)
end
def test_prompts_for_password_if_preferred
require 'capistrano/logger'
require 'capistrano/cli'
Capistrano::CLI.stubs(:password_prompt).with("hg password: ").returns("opensesame")
@config[:scm_prefer_prompt] = true
text = "password:"
assert_equal "opensesame\n", @source.handle_data(:test_state, :test_stream, text)
end
# Tests from base_test.rb, makin' sure we didn't break anything up there!
def test_command_should_default_to_default_command
assert_equal "hg", @source.command
@source.local { assert_equal "hg", @source.command }
end
def test_command_should_use_scm_command_if_available
@config[:scm_command] = "/opt/local/bin/hg"
assert_equal "/opt/local/bin/hg", @source.command
end
def test_command_should_use_scm_command_in_local_mode_if_local_scm_command_not_set
@config[:scm_command] = "/opt/local/bin/hg"
@source.local { assert_equal "/opt/local/bin/hg", @source.command }
end
def test_command_should_use_local_scm_command_in_local_mode_if_local_scm_command_is_set
@config[:scm_command] = "/opt/local/bin/hg"
@config[:local_scm_command] = "/usr/local/bin/hg"
assert_equal "/opt/local/bin/hg", @source.command
@source.local { assert_equal "/usr/local/bin/hg", @source.command }
end
def test_command_should_use_default_if_scm_command_is_default
@config[:scm_command] = :default
assert_equal "hg", @source.command
end
def test_command_should_use_default_in_local_mode_if_local_scm_command_is_default
@config[:scm_command] = "/foo/bar/hg"
@config[:local_scm_command] = :default
@source.local { assert_equal "hg", @source.command }
end
def test_local_mode_proxy_should_treat_messages_as_being_in_local_mode
@config[:scm_command] = "/foo/bar/hg"
@config[:local_scm_command] = :default
assert_equal "hg", @source.local.command
assert_equal "/foo/bar/hg", @source.command
end
end