From b57e7d85d65cb237a0bbb9f6f2e3babd107749bb Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 22 Sep 2017 13:57:55 -0400 Subject: [PATCH] better handling of candidatenotfound exception Signed-off-by: Kenneth Reitz --- pipenv/utils.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/pipenv/utils.py b/pipenv/utils.py index deece2bc..49fae5a3 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -2,7 +2,10 @@ import os import hashlib import tempfile +import sys +import click +import crayons import delegator import pip import parse @@ -20,6 +23,7 @@ from piptools.resolver import Resolver from piptools.repositories.pypi import PyPIRepository from piptools.scripts.compile import get_pip_command from piptools import logging +from piptools.exceptions import NoCandidateFound from .environments import PIPENV_DONT_EAT_EDITABLES @@ -444,11 +448,25 @@ def resolve_deps(deps, which, which_pip, project, sources=None, verbose=False, p if verbose: logging.log.verbose = True - resolver = Resolver(constraints=constraints, repository=pypi, clear_caches=clear) + resolver = Resolver(constraints=constraints, repository=pypi, clear_caches=clear, allow_unsafe=True) results = [] # pre-resolve instead of iterating to avoid asking pypi for hashes of editable packages - resolved_tree = resolver.resolve() + try: + resolved_tree = resolver.resolve() + except NoCandidateFound as e: + click.echo( + '{0}: Your dependencies could not be resolved.\n ' + 'You can use {1} to bypass this mechanism, then run {2} to inspect the situation.' + ''.format( + crayons.red('Warning', bold=True), + crayons.red('$ pipenv install --skip-lock'), + crayons.red('$ pipenv graph') + ), + err=True) + click.echo(crayons.blue(e)) + sys.exit(1) + for result in resolved_tree: if not result.editable: