On Tue, Jun 5, 2018 at 5:14 AM Luke Diamand <[email protected]> wrote:
> This change lays some groundwork for better handling of rowcount errors
> from the server, where it fails to send us results because we requested
> too many.
>
> It adds an option to p4CmdList() to return errors as a Python exception.
>
> The exceptions are derived from P4Exception (something went wrong),
> P4ServerException (the server sent us an error code) and
> P4RequestSizeException (we requested too many rows/results from the
> server database).
>
> This makes makes the code that handles the errors a bit easier.
>
> The default behavior is unchanged; the new code is enabled with a flag.
>
> Signed-off-by: Luke Diamand <[email protected]>
> ---
> diff --git a/git-p4.py b/git-p4.py
> @@ -566,10 +566,30 @@ def isModeExec(mode):
> +class P4ServerException(Exception):
> + """ Base class for exceptions where we get some kind of marshalled up
> result from the server """
> + def __init__(self, exit_code, p4_result):
> + super(P4ServerException, self).__init__(exit_code)
> + self.p4_result = p4_result
> + self.code = p4_result[0]['code']
> + self.data = p4_result[0]['data']
The subsequent patches never seem to access any of these fields, so
it's difficult to judge whether it's worthwhile having 'code' and
'data' bits split out like this.
> @@ -616,9 +636,25 @@ def p4CmdList(cmd, stdin=None, stdin_mode='w+b',
> cb=None, skip_info=False):
> if exitCode != 0:
> - entry = {}
> - entry["p4ExitCode"] = exitCode
> - result.append(entry)
> + if errors_as_exceptions:
> + if len(result) > 0:
> + data = result[0].get('data')
> + if data:
> + m = re.search('Too many rows scanned \(over (\d+)\)',
> data)
> + if not m:
> + m = re.search('Request too large \(over (\d+)\)',
> data)
Does 'p4' localize these error messages?
> + if m:
> + limit = int(m.group(1))
> + raise P4RequestSizeException(exitCode, result, limit)
> +
> + raise P4ServerException(exitCode, result)
> + else:
> + raise P4Exception(exitCode)
> + else:
> + entry = {}
> + entry["p4ExitCode"] = exitCode
> + result.append(entry)