Skip to content

Commit

Permalink
Merge pull request conan-io#3438 from jgsogo/issue/3316
Browse files Browse the repository at this point in the history
Add dependencies to package output info when binary is not found (close conan-io#3316)
  • Loading branch information
memsharded committed Aug 31, 2018
2 parents d008e6a + e45e492 commit 4a8cabf
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 4 deletions.
12 changes: 8 additions & 4 deletions conans/client/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,15 +220,17 @@ def call_system_requirements(conanfile, output):
raise ConanException("Error in system requirements")


def raise_package_not_found_error(conan_file, conan_ref, package_id, out, recorder):
def raise_package_not_found_error(conan_file, conan_ref, package_id, dependencies, out, recorder):
settings_text = ", ".join(conan_file.info.full_settings.dumps().splitlines())
options_text = ", ".join(conan_file.info.full_options.dumps().splitlines())
dependencies_text = ', '.join(dependencies)

msg = '''Can't find a '%s' package for the specified options and settings:
msg = '''Can't find a '%s' package for the specified settings, options and dependencies:
- Settings: %s
- Options: %s
- Dependencies: %s
- Package ID: %s
''' % (conan_ref, settings_text, options_text, package_id)
''' % (conan_ref, settings_text, options_text, dependencies_text, package_id)
out.warn(msg)
recorder.package_install_error(PackageReference(conan_ref, package_id),
INSTALL_ERROR_MISSING, msg)
Expand Down Expand Up @@ -268,7 +270,9 @@ def _build(self, nodes_by_level, deps_graph, keep_build, root_node):
output = ScopedOutput(str(conan_ref), self._out)
package_id = conan_file.info.package_id()
if node.binary == BINARY_MISSING:
raise_package_not_found_error(conan_file, conan_ref, package_id, output, self._recorder)
dependencies = [str(dep.dst) for dep in node.dependencies]
raise_package_not_found_error(conan_file, conan_ref, package_id, dependencies,
out=output, recorder=self._recorder)

self._propagate_info(node, inverse_levels, deps_graph, output)
if node.binary == BINARY_SKIP: # Privates not necessary
Expand Down
46 changes: 46 additions & 0 deletions conans/test/integration/install_missing_dep_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import unittest
from conans.test.utils.tools import TestClient


class InstallMissingDependency(unittest.TestCase):

def missing_dep_test(self):
client = TestClient(users={"myremote": [("lasote", "mypass")]})

# Create deps packages
dep1_conanfile = """from conans import ConanFile
class Dep1Pkg(ConanFile):
name = "dep1"
"""

dep2_conanfile = """from conans import ConanFile
class Dep2Pkg(ConanFile):
name = "dep2"
version = "1.0"
requires = "dep1/1.0@lasote/testing"
"""

client.save({"conanfile.py": dep1_conanfile}, clean_first=True)
client.run("create . dep1/1.0@lasote/testing")
client.run("create . dep1/2.0@lasote/testing")

client.save({"conanfile.py": dep2_conanfile}, clean_first=True)
client.run("create . lasote/testing")

# Create final package
foo_conanfile = """from conans import ConanFile
class FooPkg(ConanFile):
name = "foo"
version = "1.0"
requires = "dep1/{dep1_version}@lasote/testing", "dep2/1.0@lasote/testing"
"""
client.save({"conanfile.py": foo_conanfile.format(dep1_version="1.0")}, clean_first=True)
client.run("create . lasote/testing")

# Bump version of one dependency
client.save({"conanfile.py": foo_conanfile.format(dep1_version="2.0")}, clean_first=True)
error = client.run("create . lasote/testing", ignore_error=True)
self.assertTrue(error)
self.assertIn("Can't find a 'dep2/1.0@lasote/testing' package", client.user_io.out)
self.assertIn("- Dependencies: dep1/2.0@lasote/testing", client.user_io.out)

0 comments on commit 4a8cabf

Please sign in to comment.