Browse files

Merge pull request #95 from ak47/master

Add support for labels in Perforce SCM.
  • Loading branch information...
2 parents 49cc1fa + cc0f601 commit 89fd0e0e6db19a13508f4c68283abe2c79dac466 @leehambley leehambley committed Sep 24, 2011
Showing with 47 additions and 15 deletions.
  1. +24 −15 lib/capistrano/recipes/deploy/scm/perforce.rb
  2. +23 −0 test/deploy/scm/perforce_test.rb
View
39 lib/capistrano/recipes/deploy/scm/perforce.rb
@@ -1,9 +1,9 @@
require 'capistrano/recipes/deploy/scm/base'
-# Notes:
+# Notes:
# no global verbose flag for scm_verbose
# sync, checkout and export are just sync in p4
-#
+#
module Capistrano
module Deploy
module SCM
@@ -27,7 +27,7 @@ def head
def checkout(revision, destination)
p4_sync(revision, destination, p4sync_flags)
end
-
+
# Returns the command that will sync the given revision to the given
# destination directory. The perforce client has a fixed destination so
# the files must be copied from there to their intended resting place.
@@ -41,7 +41,7 @@ def sync(revision, destination)
def export(revision, destination)
p4_sync(revision, destination, p4sync_flags)
end
-
+
# Returns the command that will do an "p4 diff2" for the two revisions.
def diff(from, to=head)
scm authentication, :diff2, "-u -db", "//#{p4client}/...#{rev_no(from)}", "//#{p4client}/...#{rev_no(to)}"
@@ -72,11 +72,11 @@ def handle_data(state, stream, text)
raise Capistrano::Error, "scm_password (or p4passwd) is incorrect or unset"
when /Can.t create a new user.*/i
raise Capistrano::Error, "scm_username (or p4user) is incorrect or unset"
- when /Perforce client error\:/i
+ when /Perforce client error\:/i
raise Capistrano::Error, "p4port is incorrect or unset"
when /Client \'[\w\-\_\.]+\' unknown.*/i
raise Capistrano::Error, "p4client is incorrect or unset"
- end
+ end
end
private
@@ -90,11 +90,11 @@ def authentication
end
# Returns the command that will sync the given revision to the given
- # destination directory with specific options. The perforce client has
- # a fixed destination so the files must be copied from there to their
- # intended resting place.
+ # destination directory with specific options. The perforce client has
+ # a fixed destination so the files must be copied from there to their
+ # intended resting place.
def p4_sync(revision, destination, options="")
- scm authentication, :sync, options, "#{rev_no(revision)}", "&& cp -rf #{p4client_root} #{destination}"
+ scm authentication, :sync, options, "#{rev_no(revision)}", "&& cp -rf #{p4client_root} #{destination}"
end
def p4client
@@ -108,7 +108,7 @@ def p4port
def p4user
variable(:p4user) || variable(:scm_username)
end
-
+
def p4passwd
variable(:p4passwd) || variable(:scm_password)
end
@@ -120,16 +120,25 @@ def p4sync_flags
def p4client_root
variable(:p4client_root) || "`#{command} #{authentication} client -o | grep ^Root | cut -f2`"
end
-
- def rev_no(revision)
+
+ def rev_no(revision)
+ if variable(:p4_label)
+ p4_label = if variable(:p4_label) =~ /\A@/
+ variable(:p4_label)
+ else
+ "@#{variable(:p4_label)}"
+ end
+ return p4_label
+ end
+
case revision.to_s
when "head"
"#head"
- when /^\d+/
+ when /^\d+/
"@#{revision}"
else
revision
- end
+ end
end
end
View
23 test/deploy/scm/perforce_test.rb
@@ -0,0 +1,23 @@
+require "utils"
+require 'capistrano/recipes/deploy/scm/perforce'
+
+class DeploySCMPerforceTest < Test::Unit::TestCase
+ class TestSCM < Capistrano::Deploy::SCM::Perforce
+ default_command "perforce"
+ end
+ def setup
+ @config = { :repository => "." }
+ @source = TestSCM.new(@config)
+ end
+
+ def test_p4_label
+ @config[:p4_label] = "some_p4_label"
+ assert_equal "@some_p4_label", @source.send(:rev_no, 'foo')
+ end
+
+ def test_p4_label_with_symbol
+ @config[:p4_label] = "@some_p4_label"
+ assert_equal "@some_p4_label", @source.send(:rev_no, 'foo')
+ end
+
+end

0 comments on commit 89fd0e0

Please sign in to comment.