On Tue, Jun 5, 2018 at 5:14 AM Luke Diamand <luke@xxxxxxxxxxx> 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 <luke@xxxxxxxxxxx> > --- > 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)