git p4: handle servers without move support

Support for the "p4 move" command was added in 8e9497c (git p4:
add support for 'p4 move' in P4Submit, 2012-07-12), which checks
to make sure that the client and server support the command.

But older versions of p4d may not handle the "-k" argument, and
newer p4d allow disabling "p4 move" with a configuration setting.
Check for both these cases by testing a p4 move command on bogus
filenames and looking for strings in the error messages.

Reported-by: Vitor Antunes <vitor.hda@gmail.com>
Signed-off-by: Pete Wyckoff <pw@padd.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Pete Wyckoff 2012-11-23 17:35:35 -05:00 committed by Junio C Hamano
parent 18fa13d0b3
commit 249da4c0dc
2 changed files with 55 additions and 1 deletions

View File

@ -129,6 +129,25 @@ def p4_has_command(cmd):
p.communicate()
return p.returncode == 0
def p4_has_move_command():
"""See if the move command exists, that it supports -k, and that
it has not been administratively disabled. The arguments
must be correct, but the filenames do not have to exist. Use
ones with wildcards so even if they exist, it will fail."""
if not p4_has_command("move"):
return False
cmd = p4_build_cmd(["move", "-k", "@from", "@to"])
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()
# return code will be 1 in either case
if err.find("Invalid option") >= 0:
return False
if err.find("disabled") >= 0:
return False
# assume it failed because @... was invalid changelist
return True
def system(cmd):
expand = isinstance(cmd,basestring)
if verbose:
@ -894,7 +913,7 @@ class P4Submit(Command, P4UserMap):
self.conflict_behavior = None
self.isWindows = (platform.system() == "Windows")
self.exportLabels = False
self.p4HasMoveCommand = p4_has_command("move")
self.p4HasMoveCommand = p4_has_move_command()
def check(self):
if len(p4CmdList("opened ...")) > 0:

View File

@ -199,6 +199,41 @@ test_expect_success 'detect copies' '
)
'
# See if configurables can be set, and in particular if the run.move.allow
# variable exists, which allows admins to disable the "p4 move" command.
test_expect_success 'p4 configure command and run.move.allow are available' '
p4 configure show run.move.allow >out ; retval=$? &&
test $retval = 0 &&
{
egrep ^run.move.allow: out &&
test_set_prereq P4D_HAVE_CONFIGURABLE_RUN_MOVE_ALLOW ||
true
} || true
'
# If move can be disabled, turn it off and test p4 move handling
test_expect_success P4D_HAVE_CONFIGURABLE_RUN_MOVE_ALLOW \
'do not use p4 move when administratively disabled' '
test_when_finished "p4 configure set run.move.allow=1" &&
p4 configure set run.move.allow=0 &&
(
cd "$cli" &&
echo move-disallow-file >move-disallow-file &&
p4 add move-disallow-file &&
p4 submit -d "add move-disallow-file"
) &&
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot &&
(
cd "$git" &&
git config git-p4.skipSubmitEdit true &&
git config git-p4.detectRenames true &&
git mv move-disallow-file move-disallow-file-moved &&
git commit -m "move move-disallow-file" &&
git p4 submit
)
'
test_expect_success 'kill p4d' '
kill_p4d
'