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:

committed by
Junio C Hamano

parent
18fa13d0b3
commit
249da4c0dc
21
git-p4.py
21
git-p4.py
@ -129,6 +129,25 @@ def p4_has_command(cmd):
|
|||||||
p.communicate()
|
p.communicate()
|
||||||
return p.returncode == 0
|
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):
|
def system(cmd):
|
||||||
expand = isinstance(cmd,basestring)
|
expand = isinstance(cmd,basestring)
|
||||||
if verbose:
|
if verbose:
|
||||||
@ -894,7 +913,7 @@ class P4Submit(Command, P4UserMap):
|
|||||||
self.conflict_behavior = None
|
self.conflict_behavior = None
|
||||||
self.isWindows = (platform.system() == "Windows")
|
self.isWindows = (platform.system() == "Windows")
|
||||||
self.exportLabels = False
|
self.exportLabels = False
|
||||||
self.p4HasMoveCommand = p4_has_command("move")
|
self.p4HasMoveCommand = p4_has_move_command()
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
if len(p4CmdList("opened ...")) > 0:
|
if len(p4CmdList("opened ...")) > 0:
|
||||||
|
@ -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' '
|
test_expect_success 'kill p4d' '
|
||||||
kill_p4d
|
kill_p4d
|
||||||
'
|
'
|
||||||
|
Reference in New Issue
Block a user