git-p4: better error reporting when p4 fails
Currently when p4 fails to run, git-p4 just crashes with an obscure error message. For example, if the P4 ticket has expired, you get: Error: Cannot locate perforce checkout of <path> in client view This change checks whether git-p4 can talk to the Perforce server when the first P4 operation is attempted, and tries to print a meaningful error message if it fails. Signed-off-by: Luke Diamand <luke@diamand.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
b9d34db9a2
commit
0ef67acdd7
55
git-p4.py
55
git-p4.py
@ -50,6 +50,8 @@ defaultLabelRegexp = r'[a-zA-Z0-9_\-.]+$'
|
||||
# Grab changes in blocks of this many revisions, unless otherwise requested
|
||||
defaultBlockSize = 512
|
||||
|
||||
p4_access_checked = False
|
||||
|
||||
def p4_build_cmd(cmd):
|
||||
"""Build a suitable p4 command line.
|
||||
|
||||
@ -91,6 +93,13 @@ def p4_build_cmd(cmd):
|
||||
real_cmd = ' '.join(real_cmd) + ' ' + cmd
|
||||
else:
|
||||
real_cmd += cmd
|
||||
|
||||
# now check that we can actually talk to the server
|
||||
global p4_access_checked
|
||||
if not p4_access_checked:
|
||||
p4_access_checked = True # suppress access checks in p4_check_access itself
|
||||
p4_check_access()
|
||||
|
||||
return real_cmd
|
||||
|
||||
def git_dir(path):
|
||||
@ -264,6 +273,52 @@ def p4_system(cmd):
|
||||
if retcode:
|
||||
raise CalledProcessError(retcode, real_cmd)
|
||||
|
||||
def die_bad_access(s):
|
||||
die("failure accessing depot: {0}".format(s.rstrip()))
|
||||
|
||||
def p4_check_access(min_expiration=1):
|
||||
""" Check if we can access Perforce - account still logged in
|
||||
"""
|
||||
results = p4CmdList(["login", "-s"])
|
||||
|
||||
if len(results) == 0:
|
||||
# should never get here: always get either some results, or a p4ExitCode
|
||||
assert("could not parse response from perforce")
|
||||
|
||||
result = results[0]
|
||||
|
||||
if 'p4ExitCode' in result:
|
||||
# p4 returned non-zero status, e.g. P4PORT invalid, or p4 not in path
|
||||
die_bad_access("could not run p4")
|
||||
|
||||
code = result.get("code")
|
||||
if not code:
|
||||
# we get here if we couldn't connect and there was nothing to unmarshal
|
||||
die_bad_access("could not connect")
|
||||
|
||||
elif code == "stat":
|
||||
expiry = result.get("TicketExpiration")
|
||||
if expiry:
|
||||
expiry = int(expiry)
|
||||
if expiry > min_expiration:
|
||||
# ok to carry on
|
||||
return
|
||||
else:
|
||||
die_bad_access("perforce ticket expires in {0} seconds".format(expiry))
|
||||
|
||||
else:
|
||||
# account without a timeout - all ok
|
||||
return
|
||||
|
||||
elif code == "error":
|
||||
data = result.get("data")
|
||||
if data:
|
||||
die_bad_access("p4 error: {0}".format(data))
|
||||
else:
|
||||
die_bad_access("unknown error")
|
||||
else:
|
||||
die_bad_access("unknown error code {0}".format(code))
|
||||
|
||||
_p4_version_string = None
|
||||
def p4_version_string():
|
||||
"""Read the version string, showing just the last line, which
|
||||
|
Reference in New Issue
Block a user