Skip to content

Commit

Permalink
Merge pull request #3463 from AdamGold/bugfix/catch-command-errors
Browse files Browse the repository at this point in the history
conservative check for known exceptions in subprocess stderr.
  • Loading branch information
techalchemy authored Apr 2, 2019
2 parents 8aa9283 + 2d75f1a commit 6c62d23
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 2 deletions.
1 change: 1 addition & 0 deletions news/2553.behavior.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Make conservative checks of known exceptions when subprocess returns output, so user won't see the whole traceback - just the error.
5 changes: 3 additions & 2 deletions pipenv/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -925,9 +925,10 @@ def do_create_virtualenv(python=None, site_packages=False, pypi_mirror=None):
)
click.echo(crayons.blue("{0}".format(c.out)), err=True)
if c.returncode != 0:
sp.fail(environments.PIPENV_SPINNER_FAIL_TEXT.format(u"Failed creating virtual environment"))
sp.fail(environments.PIPENV_SPINNER_FAIL_TEXT.format("Failed creating virtual environment"))
error = c.err if environments.is_verbose() else exceptions.prettify_exc(c.err)
raise exceptions.VirtualenvCreationException(
extra=[crayons.blue("{0}".format(c.err)),]
extra=[crayons.red("{0}".format(error)),]
)
else:

Expand Down
19 changes: 19 additions & 0 deletions pipenv/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
)
from .vendor.click.types import Path
from .vendor.click.utils import echo as click_echo
import vistir

KNOWN_EXCEPTIONS = {
"PermissionError": "Permission denied:",
}

def handle_exception(exc_type, exception, traceback, hook=sys.excepthook):
if environments.is_verbose() or not issubclass(exc_type, ClickException):
Expand Down Expand Up @@ -402,3 +406,18 @@ def __init__(self, req=None):
)
extra = [crayons.normal(decode_for_output(str(req)))]
super(RequirementError, self).__init__(message, extra=extra)
super(ResolutionFailure, self).__init__(fix_utf8(message), extra=extra)


def prettify_exc(error):
"""Catch known errors and prettify them instead of showing the
entire traceback, for better UX"""
matched_exceptions = [k for k in KNOWN_EXCEPTIONS.keys() if k in error]
if not matched_exceptions:
return "{}".format(vistir.misc.decode_for_output(error))
errors = []
for match in matched_exceptions:
_, error, info = error.rpartition(KNOWN_EXCEPTIONS[match])
errors.append("{} {}".format(error, info))

return "\n".join(errors)

0 comments on commit 6c62d23

Please sign in to comment.