conan 2.22.1__tar.gz → 2.23.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {conan-2.22.1/conan.egg-info → conan-2.23.0}/PKG-INFO +2 -2
- {conan-2.22.1 → conan-2.23.0}/README.md +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/__init__.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/api/conan_api.py +0 -1
- {conan-2.22.1 → conan-2.23.0}/conan/api/input.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/api/model/remote.py +14 -2
- {conan-2.22.1 → conan-2.23.0}/conan/api/output.py +11 -3
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/audit.py +10 -8
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/cache.py +9 -5
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/graph.py +12 -7
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/install.py +15 -6
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/list.py +37 -15
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/new.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/remotes.py +6 -3
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/report.py +2 -1
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/workspace.py +18 -14
- {conan-2.22.1 → conan-2.23.0}/conan/cli/cli.py +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/command.py +10 -4
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/create.py +7 -3
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/install.py +33 -14
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/remote.py +8 -6
- conan-2.23.0/conan/cli/commands/run.py +55 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/workspace.py +17 -1
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/audit/vulnerabilities.py +137 -28
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/graph/info_graph_html.py +20 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/report/diff.py +28 -5
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/report/diff_html.py +200 -13
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/audit/providers.py +20 -6
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/config/config_installer.py +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/detect/detect_vs.py +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/export.py +3 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/basic.py +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/bazel_7_exe.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/db/packages_table.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/db/recipes_table.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/db/table.py +6 -20
- {conan-2.22.1 → conan-2.23.0}/conan/internal/default_settings.py +12 -12
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/graph_binaries.py +83 -11
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/graph_error.py +7 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/installer.py +14 -6
- {conan-2.22.1 → conan-2.23.0}/conan/internal/loader.py +2 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/conan_file.py +6 -2
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/conf.py +3 -7
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/workspace.py +20 -2
- {conan-2.22.1 → conan-2.23.0}/conan/internal/paths.py +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/client_routes.py +5 -2
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/conan_requester.py +8 -13
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/remote_manager.py +12 -6
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/rest_client.py +2 -2
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/rest_client_local_recipe_index.py +1 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/rest_client_v2.py +3 -3
- {conan-2.22.1 → conan-2.23.0}/conan/internal/runner/docker.py +2 -1
- {conan-2.22.1 → conan-2.23.0}/conan/internal/runner/output.py +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/premake.py +3 -2
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/visual_project_files.py +0 -2
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/tools.py +3 -3
- {conan-2.22.1 → conan-2.23.0}/conan/tools/android/utils.py +2 -1
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/cstd.py +2 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/flags.py +0 -37
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmake.py +33 -20
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +12 -9
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/toolchain/blocks.py +21 -4
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/toolchain/toolchain.py +18 -9
- {conan-2.22.1 → conan-2.23.0}/conan/tools/google/bazeldeps.py +17 -2
- {conan-2.22.1 → conan-2.23.0}/conan/tools/meson/meson.py +7 -2
- {conan-2.22.1 → conan-2.23.0}/conan/tools/meson/toolchain.py +0 -2
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/toolchain.py +4 -2
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/visual.py +11 -8
- {conan-2.22.1 → conan-2.23.0}/conan/tools/premake/premake.py +5 -2
- {conan-2.22.1 → conan-2.23.0}/conan/tools/system/package_manager.py +4 -4
- {conan-2.22.1 → conan-2.23.0}/conan/tools/system/pip_manager.py +26 -14
- {conan-2.22.1 → conan-2.23.0/conan.egg-info}/PKG-INFO +2 -2
- {conan-2.22.1 → conan-2.23.0}/conan.egg-info/SOURCES.txt +1 -0
- {conan-2.22.1 → conan-2.23.0}/conan.egg-info/requires.txt +1 -3
- {conan-2.22.1 → conan-2.23.0}/conans/requirements.txt +1 -1
- {conan-2.22.1 → conan-2.23.0}/conans/requirements_dev.txt +0 -1
- {conan-2.22.1 → conan-2.23.0}/LICENSE.md +0 -0
- {conan-2.22.1 → conan-2.23.0}/MANIFEST.in +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/model/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/model/list.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/model/refs.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/command.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/config.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/download.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/export.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/local.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/lockfile.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/profiles.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/remove.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/api/subapi/upload.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/args.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/audit.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/build.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/cache.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/config.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/download.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/editable.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/export.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/export_pkg.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/graph.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/inspect.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/list.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/lock.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/new.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/pkglist.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/profile.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/remove.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/report.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/search.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/source.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/test.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/upload.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/commands/version.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/exit_codes.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/audit/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/graph/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/graph/graph.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/list/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/list/list.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/list/search_table_html.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/formatters/report/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/printers/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cli/printers/graph.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cps/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/cps/cps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/errors.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/audit/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/config/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/detect/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/detect/detect_api.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/install/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/install/generators.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/list/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/list/query_parse.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/local/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/local/editable.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/migrations.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/alias_new.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/autoools_exe.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/autotools_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/bazel_exe.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/bazel_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/cmake_exe.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/cmake_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/header_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/local_recipes_index.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/meson_exe.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/meson_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/msbuild_exe.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/msbuild_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/premake_exe.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/premake_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/qbs_lib.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/new/workspace.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/profile/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/profile/detect.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/profile/profile_loader.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/remotes/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/remotes/encrypt.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/remotes/localdb.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/upload.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/api/uploader.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/cache.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/conan_reference_layout.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/db/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/db/cache_database.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/home_paths.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/cache/integrity_check.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/conan_app.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/deploy.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/errors.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/build_mode.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/compatibility.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/compute_pid.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/graph.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/graph_builder.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/install_graph.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/profile_node_definer.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/provides.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/proxy.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/python_requires.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/graph/range_resolver.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/hook_manager.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/internal_tools.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/methods.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/conanfile_interface.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/cpp_info.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/dependencies.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/info.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/layout.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/lockfile.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/manifest.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/options.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/pkg_type.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/profile.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/recipe_ref.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/requires.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/settings.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/version.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/model/version_range.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/auth_manager.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/caching_file_downloader.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/download_cache.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/file_downloader.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/file_uploader.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/pkg_sign.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/remote_credentials.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/rest/rest_routes.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/runner/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/runner/ssh.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/runner/wsl.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/source.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/subsystems.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/util/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/util/config_parser.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/util/dates.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/util/files.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/internal/util/runners.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/autotools.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/cmake.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/genconanfile.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/assets/sources.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/artifactory.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/env.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/file_server.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/mocks.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/profiles.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/scm.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/server_launcher.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/test/utils/test_files.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/android/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/apple/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/apple/apple.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/apple/xcodebuild.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/apple/xcodedeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/apple/xcodetoolchain.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/compiler.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/cppstd.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/cpu.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/cross_building.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/build/stdcpp_library.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps2/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps2/config.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/layout.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/presets.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cmake/utils.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cps/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/cps/cps_deps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/env/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/env/environment.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/env/virtualbuildenv.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/env/virtualrunenv.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/conandata.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/copy_pattern.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/files.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/patches.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/symlinks/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/files/symlinks/symlinks.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/autotools.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/autotoolstoolchain.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/gnutoolchain.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/makedeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/pkgconfig.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/google/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/google/bazel.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/google/layout.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/google/toolchain.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/intel/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/intel/intel_cc.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/layout/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/meson/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/meson/helpers.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/layout.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/msbuild.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/msbuilddeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/nmakedeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/microsoft/subsystems.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/premake/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/premake/constants.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/premake/premakedeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/premake/toolchain.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/qbs/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/qbs/common.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/qbs/qbs.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/qbs/qbsdeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/qbs/qbsprofile.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/ros/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/ros/rosenv.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/sbom/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/sbom/cyclonedx.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/sbom/spdx_licenses.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/scm/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/scm/git.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/scons/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/scons/sconsdeps.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan/tools/system/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan.egg-info/dependency_links.txt +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan.egg-info/entry_points.txt +0 -0
- {conan-2.22.1 → conan-2.23.0}/conan.egg-info/top_level.txt +0 -0
- {conan-2.22.1 → conan-2.23.0}/conans/__init__.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conans/conan.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conans/conan_server.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conans/migrations.py +0 -0
- {conan-2.22.1 → conan-2.23.0}/conans/requirements_runner.txt +0 -0
- {conan-2.22.1 → conan-2.23.0}/conans/requirements_server.txt +0 -0
- {conan-2.22.1 → conan-2.23.0}/pyproject.toml +0 -0
- {conan-2.22.1 → conan-2.23.0}/setup.cfg +0 -0
- {conan-2.22.1 → conan-2.23.0}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: conan
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.23.0
|
|
4
4
|
Summary: Conan C/C++ package manager
|
|
5
5
|
Home-page: https://conan.io
|
|
6
6
|
Author: JFrog LTD
|
|
@@ -23,7 +23,7 @@ Description: <picture>
|
|
|
23
23
|
- Homepage: https://conan.io/
|
|
24
24
|
- Github: https://github.com/conan-io/conan
|
|
25
25
|
- Docs: https://docs.conan.io
|
|
26
|
-
- Slack: https://cpplang.slack.com (#conan channel. Please, click [here](https://
|
|
26
|
+
- Slack: https://cpplang.slack.com (#conan channel. Please, click [here](https://cppalliance.org/slack/#cpp-slack) to get an invitation)
|
|
27
27
|
- Twitter: https://twitter.com/conan_io
|
|
28
28
|
- Blog: https://blog.conan.io
|
|
29
29
|
- Security reports: https://jfrog.com/trust/report-vulnerability
|
|
@@ -12,7 +12,7 @@ Decentralized, open-source (MIT), C/C++ package manager.
|
|
|
12
12
|
- Homepage: https://conan.io/
|
|
13
13
|
- Github: https://github.com/conan-io/conan
|
|
14
14
|
- Docs: https://docs.conan.io
|
|
15
|
-
- Slack: https://cpplang.slack.com (#conan channel. Please, click [here](https://
|
|
15
|
+
- Slack: https://cpplang.slack.com (#conan channel. Please, click [here](https://cppalliance.org/slack/#cpp-slack) to get an invitation)
|
|
16
16
|
- Twitter: https://twitter.com/conan_io
|
|
17
17
|
- Blog: https://blog.conan.io
|
|
18
18
|
- Security reports: https://jfrog.com/trust/report-vulnerability
|
|
@@ -78,7 +78,7 @@ class UserInput:
|
|
|
78
78
|
"""Request user to input a boolean"""
|
|
79
79
|
ret = None
|
|
80
80
|
while ret is None:
|
|
81
|
-
if default_option
|
|
81
|
+
if default_option:
|
|
82
82
|
s = self.request_string("%s (YES/no)" % msg)
|
|
83
83
|
elif default_option is False:
|
|
84
84
|
s = self.request_string("%s (NO/yes)" % msg)
|
|
@@ -3,11 +3,23 @@ LOCAL_RECIPES_INDEX = "local-recipes-index"
|
|
|
3
3
|
|
|
4
4
|
class Remote:
|
|
5
5
|
"""
|
|
6
|
-
The ``Remote`` class represents a remote registry of packages.
|
|
7
|
-
should not be created directly, but obtained from the relevant ``RemotesAPI`` subapi methods.
|
|
6
|
+
The ``Remote`` class represents a remote registry of packages.
|
|
8
7
|
"""
|
|
9
8
|
def __init__(self, name, url, verify_ssl=True, disabled=False, allowed_packages=None,
|
|
10
9
|
remote_type=None, recipes_only=False):
|
|
10
|
+
""" A Remote object can be constructed to be passed as an argument to
|
|
11
|
+
RemotesAPI methods. When possible, it is better to use Remote objects returned by the API,
|
|
12
|
+
but for the ``RemotesAPI.add()`` method, for which a new constructed object is necessary.
|
|
13
|
+
It is recommended to use named arguments like ``Remote(..., verify_ssl=False)`` in
|
|
14
|
+
the constructor.
|
|
15
|
+
:param name: The name of the remote.
|
|
16
|
+
:param url: The URL of the remote repository (or local folder for "local-recipes-index").
|
|
17
|
+
:param verify_ssl: Enable SSL Certificate validation.
|
|
18
|
+
:param disabled: Disable the remote repository.
|
|
19
|
+
:param allowed_packages: List of patterns of allowed packages from this remote
|
|
20
|
+
:param remote_type: Type of the remote repository, use "local-recipes-index" or ``None``
|
|
21
|
+
:param recipes_only: If True, binaries form this remote will be ignored and never used
|
|
22
|
+
"""
|
|
11
23
|
self.name = name # Read only, is the key
|
|
12
24
|
self.url = url
|
|
13
25
|
self.verify_ssl = verify_ssl
|
|
@@ -124,6 +124,14 @@ class ConanOutput:
|
|
|
124
124
|
def set_warnings_as_errors(cls, value):
|
|
125
125
|
cls._warnings_as_errors = value
|
|
126
126
|
|
|
127
|
+
@classmethod
|
|
128
|
+
def get_output_level(cls):
|
|
129
|
+
return cls._conan_output_level
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def set_output_level(cls, level):
|
|
133
|
+
cls._conan_output_level = level
|
|
134
|
+
|
|
127
135
|
@classmethod
|
|
128
136
|
def valid_log_levels(cls):
|
|
129
137
|
return {"quiet": LEVEL_QUIET, # -vquiet 80
|
|
@@ -151,7 +159,7 @@ class ConanOutput:
|
|
|
151
159
|
vals = "quiet, error, warning, notice, status, verbose, debug(v), trace(vv)"
|
|
152
160
|
raise ConanException(f"Invalid argument '-v{v}'{msg}.\nAllowed values: {vals}")
|
|
153
161
|
else:
|
|
154
|
-
cls.
|
|
162
|
+
cls.set_output_level(level)
|
|
155
163
|
|
|
156
164
|
@classmethod
|
|
157
165
|
def level_allowed(cls, level):
|
|
@@ -270,13 +278,13 @@ class ConanOutput:
|
|
|
270
278
|
self._write_message(msg, fg=fg, bg=bg)
|
|
271
279
|
return self
|
|
272
280
|
|
|
273
|
-
def status(self, msg: str, fg: str = None, bg: str = None):
|
|
281
|
+
def status(self, msg: str, fg: str = None, bg: str = None, newline: bool = True):
|
|
274
282
|
""" Provides general information about the system or ongoing operations.
|
|
275
283
|
|
|
276
284
|
Info messages are basic and used to inform about common events,
|
|
277
285
|
like the start or completion of processes, without implying specific problems or achievements."""
|
|
278
286
|
if self._conan_output_level <= LEVEL_STATUS:
|
|
279
|
-
self._write_message(msg, fg=fg, bg=bg)
|
|
287
|
+
self._write_message(msg, fg=fg, bg=bg, newline=newline)
|
|
280
288
|
return self
|
|
281
289
|
|
|
282
290
|
info = status
|
|
@@ -3,7 +3,6 @@ import json
|
|
|
3
3
|
import os
|
|
4
4
|
import base64
|
|
5
5
|
|
|
6
|
-
from conan.api.output import ConanOutput
|
|
7
6
|
from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvider
|
|
8
7
|
from conan.errors import ConanException
|
|
9
8
|
from conan.internal.api.remotes.encrypt import encode, decode
|
|
@@ -69,9 +68,9 @@ class AuditAPI:
|
|
|
69
68
|
)
|
|
70
69
|
|
|
71
70
|
raise ConanException(
|
|
72
|
-
f"Provider '{provider_name}' not found. Please specify a valid provider name or add
|
|
73
|
-
f"'conan audit provider add {provider_name} {add_arguments}
|
|
74
|
-
f"{register_message}"
|
|
71
|
+
f"Provider '{provider_name}' not found. Please specify a valid provider name or add "
|
|
72
|
+
f"it using: 'conan audit provider add {provider_name} {add_arguments} "
|
|
73
|
+
f"--token=<token>'\n{register_message}"
|
|
75
74
|
)
|
|
76
75
|
|
|
77
76
|
provider_data = providers[provider_name]
|
|
@@ -83,9 +82,11 @@ class AuditAPI:
|
|
|
83
82
|
provider_data["token"] = env_token
|
|
84
83
|
elif "token" in provider_data:
|
|
85
84
|
try:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
enc_token = base64.standard_b64decode(provider_data["token"]).decode()
|
|
86
|
+
provider_data["token"] = decode(enc_token, CYPHER_KEY)
|
|
87
|
+
except binascii.Error:
|
|
88
|
+
raise ConanException(f"Invalid token format for provider '{provider_name}'. "
|
|
89
|
+
f"The token might be corrupt.")
|
|
89
90
|
|
|
90
91
|
provider_cls = self._provider_cls.get(provider_data["type"])
|
|
91
92
|
|
|
@@ -143,7 +144,8 @@ class AuditAPI:
|
|
|
143
144
|
providers = _load_providers(self._providers_path)
|
|
144
145
|
|
|
145
146
|
assert provider.name in providers
|
|
146
|
-
|
|
147
|
+
encode_token = encode(token, CYPHER_KEY).encode()
|
|
148
|
+
providers[provider.name]["token"] = base64.standard_b64encode(encode_token).decode()
|
|
147
149
|
setattr(provider, "token", token)
|
|
148
150
|
_save_providers(self._providers_path, providers)
|
|
149
151
|
|
|
@@ -8,8 +8,9 @@ from conan.api.model import PackagesList
|
|
|
8
8
|
from conan.api.output import ConanOutput
|
|
9
9
|
from conan.internal.api.uploader import compress_files
|
|
10
10
|
from conan.internal.cache.cache import PkgCache
|
|
11
|
-
from conan.internal.cache.conan_reference_layout import EXPORT_SRC_FOLDER, EXPORT_FOLDER,
|
|
12
|
-
|
|
11
|
+
from conan.internal.cache.conan_reference_layout import (EXPORT_SRC_FOLDER, EXPORT_FOLDER,
|
|
12
|
+
SRC_FOLDER, METADATA,
|
|
13
|
+
DOWNLOAD_EXPORT_FOLDER)
|
|
13
14
|
from conan.internal.cache.home_paths import HomePaths
|
|
14
15
|
from conan.internal.cache.integrity_check import IntegrityChecker
|
|
15
16
|
from conan.internal.rest.download_cache import DownloadCache
|
|
@@ -104,7 +105,8 @@ class CacheAPI:
|
|
|
104
105
|
if not os.path.exists(manifest) or not os.path.exists(info):
|
|
105
106
|
rmdir(folder)
|
|
106
107
|
if backup_sources:
|
|
107
|
-
backup_files = self._conan_api.cache.get_backup_sources(package_list, exclude=False,
|
|
108
|
+
backup_files = self._conan_api.cache.get_backup_sources(package_list, exclude=False,
|
|
109
|
+
only_upload=False)
|
|
108
110
|
ConanOutput().verbose(f"Cleaning {len(backup_files)} backup sources")
|
|
109
111
|
for f in backup_files:
|
|
110
112
|
remove(f)
|
|
@@ -175,7 +177,8 @@ class CacheAPI:
|
|
|
175
177
|
pkglist_path = os.path.join(tempfile.gettempdir(), "pkglist.json")
|
|
176
178
|
save(pkglist_path, serialized)
|
|
177
179
|
tar_files["pkglist.json"] = pkglist_path
|
|
178
|
-
compress_files(tar_files, os.path.basename(tgz_path), os.path.dirname(tgz_path),
|
|
180
|
+
compress_files(tar_files, os.path.basename(tgz_path), os.path.dirname(tgz_path),
|
|
181
|
+
compresslevel, recursive=True)
|
|
179
182
|
remove(pkglist_path)
|
|
180
183
|
|
|
181
184
|
def restore(self, path):
|
|
@@ -260,7 +263,8 @@ class CacheAPI:
|
|
|
260
263
|
download_cache_path = config.get("core.sources:download_cache")
|
|
261
264
|
download_cache_path = download_cache_path or HomePaths(
|
|
262
265
|
self._conan_api.cache_folder).default_sources_backup_folder
|
|
263
|
-
excluded_urls = config.get("core.sources:exclude_urls",
|
|
266
|
+
excluded_urls = config.get("core.sources:exclude_urls",
|
|
267
|
+
check_type=list, default=[]) if exclude else []
|
|
264
268
|
download_cache = DownloadCache(download_cache_path)
|
|
265
269
|
return download_cache.get_backup_sources_files(excluded_urls, package_list, only_upload)
|
|
266
270
|
|
|
@@ -88,7 +88,8 @@ class GraphAPI:
|
|
|
88
88
|
return root_node
|
|
89
89
|
|
|
90
90
|
def _load_root_virtual_conanfile(self, profile_host, profile_build, requires, tool_requires,
|
|
91
|
-
lockfile, remotes, update, check_updates=False,
|
|
91
|
+
lockfile, remotes, update, check_updates=False,
|
|
92
|
+
python_requires=None):
|
|
92
93
|
if not python_requires and not requires and not tool_requires:
|
|
93
94
|
raise ConanException("Provide requires or tool_requires")
|
|
94
95
|
app = ConanApp(self._conan_api)
|
|
@@ -164,8 +165,8 @@ class GraphAPI:
|
|
|
164
165
|
""" Compute the dependency graph, starting from a root package, evaluation the graph with
|
|
165
166
|
the provided configuration in profile_build, and profile_host. The resulting graph is a
|
|
166
167
|
graph of recipes, but packages are not computed yet (package_ids) will be empty in the
|
|
167
|
-
result. The result might have errors, like version or configuration conflicts, but it is
|
|
168
|
-
possible to inspect it. Only trying to install such graph will fail
|
|
168
|
+
result. The result might have errors, like version or configuration conflicts, but it is
|
|
169
|
+
still possible to inspect it. Only trying to install such graph will fail
|
|
169
170
|
|
|
170
171
|
:param root_node: the starting point, an already initialized Node structure, as
|
|
171
172
|
returned by the "load_root_node" api
|
|
@@ -189,8 +190,8 @@ class GraphAPI:
|
|
|
189
190
|
deps_graph = builder.load_graph(root_node, profile_host, profile_build, lockfile)
|
|
190
191
|
return deps_graph
|
|
191
192
|
|
|
192
|
-
def analyze_binaries(self, graph, build_mode=None, remotes=None, update=None,
|
|
193
|
-
build_modes_test=None, tested_graph=None):
|
|
193
|
+
def analyze_binaries(self, graph, build_mode=None, remotes=None, update=None,
|
|
194
|
+
lockfile=None, build_modes_test=None, tested_graph=None):
|
|
194
195
|
""" Given a dependency graph, will compute the package_ids of all recipes in the graph, and
|
|
195
196
|
evaluate if they should be built from sources, downloaded from a remote server, of if the
|
|
196
197
|
packages are already in the local Conan cache
|
|
@@ -199,8 +200,12 @@ class GraphAPI:
|
|
|
199
200
|
:param graph: a Conan dependency graph, as returned by "load_graph()"
|
|
200
201
|
:param build_mode: TODO: Discuss if this should be a BuildMode object or list of arguments
|
|
201
202
|
:param remotes: list of remotes
|
|
202
|
-
:param update: (False by default), if Conan should look for newer versions or
|
|
203
|
-
revisions for already existing recipes in the Conan cache
|
|
203
|
+
:param update: (``False`` by default), if Conan should look for newer versions or
|
|
204
|
+
revisions for already existing recipes in the Conan cache. It also accepts an array of
|
|
205
|
+
reference patterns to limit the update to those references if any of the items match.
|
|
206
|
+
Eg. ``False``, ``None`` or ``[]`` *means no update*,
|
|
207
|
+
``True`` or ``["*"]`` *means update all*,
|
|
208
|
+
and ``["pkgA/*", "pkgB/1.0@user/channel"]`` *means to update only specific packages*.
|
|
204
209
|
:param build_modes_test: the --build-test argument
|
|
205
210
|
:param tested_graph: In case of a "test_package", the graph being tested
|
|
206
211
|
"""
|
|
@@ -6,7 +6,7 @@ from conan.internal.deploy import do_deploys
|
|
|
6
6
|
|
|
7
7
|
from conan.internal.graph.install_graph import InstallGraph
|
|
8
8
|
from conan.internal.graph.installer import BinaryInstaller
|
|
9
|
-
from conan.errors import ConanInvalidConfiguration
|
|
9
|
+
from conan.errors import ConanInvalidConfiguration, ConanException
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class InstallAPI:
|
|
@@ -15,10 +15,11 @@ class InstallAPI:
|
|
|
15
15
|
self._conan_api = conan_api
|
|
16
16
|
self._helpers = helpers
|
|
17
17
|
|
|
18
|
-
def install_binaries(self, deps_graph, remotes=None):
|
|
18
|
+
def install_binaries(self, deps_graph, remotes=None, return_install_error=False):
|
|
19
19
|
""" Install binaries for dependency graph
|
|
20
20
|
:param deps_graph: Dependency graph to intall packages for
|
|
21
21
|
:param remotes:
|
|
22
|
+
:param return_install_error: If True, do not raise an exception, but return it
|
|
22
23
|
"""
|
|
23
24
|
app = ConanBasicApp(self._conan_api)
|
|
24
25
|
installer = BinaryInstaller(app, self._helpers.global_conf, app.editable_packages,
|
|
@@ -27,7 +28,14 @@ class InstallAPI:
|
|
|
27
28
|
install_graph.raise_errors()
|
|
28
29
|
install_order = install_graph.install_order()
|
|
29
30
|
installer.install_system_requires(deps_graph, install_order=install_order)
|
|
30
|
-
|
|
31
|
+
try: # To be able to capture the output, report or save graph.json, then raise later
|
|
32
|
+
installer.install(deps_graph, remotes, install_order=install_order)
|
|
33
|
+
except ConanException as e:
|
|
34
|
+
# If true, allows to return the exception, so progress can be reported like the
|
|
35
|
+
# already built binaries to upload them
|
|
36
|
+
if not return_install_error:
|
|
37
|
+
raise
|
|
38
|
+
return e
|
|
31
39
|
|
|
32
40
|
def install_system_requires(self, graph, only_info=False):
|
|
33
41
|
""" Install binaries for dependency graph
|
|
@@ -52,7 +60,8 @@ class InstallAPI:
|
|
|
52
60
|
|
|
53
61
|
# TODO: Look for a better name
|
|
54
62
|
def install_consumer(self, deps_graph, generators=None, source_folder=None, output_folder=None,
|
|
55
|
-
deploy=False, deploy_package=None, deploy_folder=None,
|
|
63
|
+
deploy=False, deploy_package=None, deploy_folder=None,
|
|
64
|
+
envs_generation=None):
|
|
56
65
|
""" Once a dependency graph has been installed, there are things to be done, like invoking
|
|
57
66
|
generators for the root consumer.
|
|
58
67
|
This is necessary for example for conanfile.txt/py, or for "conan install <ref> -g
|
|
@@ -93,5 +102,5 @@ class InstallAPI:
|
|
|
93
102
|
envs_generation=envs_generation)
|
|
94
103
|
|
|
95
104
|
def deploy(self, graph, deployer, deploy_package=None, deploy_folder=None):
|
|
96
|
-
return do_deploys(self._conan_api.home_folder, graph, deployer,
|
|
97
|
-
deploy_folder=deploy_folder)
|
|
105
|
+
return do_deploys(self._conan_api.home_folder, graph, deployer,
|
|
106
|
+
deploy_package=deploy_package, deploy_folder=deploy_folder)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import copy
|
|
2
1
|
import os
|
|
3
2
|
from collections import OrderedDict
|
|
4
3
|
from typing import Dict
|
|
@@ -318,27 +317,50 @@ class ListAPI:
|
|
|
318
317
|
(Experimental) Find the remotes where the current package lists can be found
|
|
319
318
|
"""
|
|
320
319
|
result = MultiPackagesList()
|
|
320
|
+
app = ConanBasicApp(self._conan_api)
|
|
321
321
|
for r in remotes:
|
|
322
322
|
result_pkg_list = PackagesList()
|
|
323
|
-
for ref,
|
|
324
|
-
|
|
325
|
-
ref_no_rev.revision = None
|
|
323
|
+
for ref, ref_contents in package_list.serialize().items():
|
|
324
|
+
ref = RecipeReference.loads(ref)
|
|
326
325
|
try:
|
|
327
|
-
|
|
326
|
+
remote_rrevs = app.remote_manager.get_recipe_revisions(ref, remote=r)
|
|
328
327
|
except NotFoundException:
|
|
329
328
|
continue
|
|
330
|
-
|
|
329
|
+
revisions = ref_contents.get("revisions")
|
|
330
|
+
if revisions is None: # This is a package list just with name/version
|
|
331
|
+
if remote_rrevs:
|
|
332
|
+
result_pkg_list.add_ref(ref)
|
|
331
333
|
continue
|
|
332
|
-
|
|
333
|
-
for
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
except NotFoundException:
|
|
334
|
+
|
|
335
|
+
for revision, rev_content in revisions.items():
|
|
336
|
+
ref.revision = revision
|
|
337
|
+
# We look for the value of revision in server, to return timestamp too
|
|
338
|
+
found = next((r for r in remote_rrevs if r == ref), None)
|
|
339
|
+
if not found:
|
|
339
340
|
continue
|
|
340
|
-
|
|
341
|
-
|
|
341
|
+
result_pkg_list.add_ref(found)
|
|
342
|
+
packages = rev_content.get("packages")
|
|
343
|
+
if packages is None:
|
|
344
|
+
continue
|
|
345
|
+
for pkgid, pkgcontent in packages.items():
|
|
346
|
+
pref = PkgReference(ref, pkgid)
|
|
347
|
+
try:
|
|
348
|
+
remote_prefs = app.remote_manager.get_package_revisions(pref, remote=r)
|
|
349
|
+
except NotFoundException:
|
|
350
|
+
continue
|
|
351
|
+
pkg_revisions = pkgcontent.get("revisions")
|
|
352
|
+
if pkg_revisions is None: # This is a package_id, no prevs
|
|
353
|
+
if remote_prefs:
|
|
354
|
+
result_pkg_list.add_pref(pref, pkgcontent.get("info"))
|
|
355
|
+
continue
|
|
356
|
+
for pkg_revision, prev_content in pkg_revisions.items():
|
|
357
|
+
pref.revision = pkg_revision
|
|
358
|
+
# We look for the value of revision in server, to return timestamp too
|
|
359
|
+
pfound = next((r for r in remote_prefs if r == pref), None)
|
|
360
|
+
if not pfound:
|
|
361
|
+
continue
|
|
362
|
+
result_pkg_list.add_pref(pfound, pkgcontent.get("info"))
|
|
363
|
+
|
|
342
364
|
if result_pkg_list:
|
|
343
365
|
result.add(r.name, result_pkg_list)
|
|
344
366
|
return result
|
|
@@ -166,7 +166,7 @@ class NewAPI:
|
|
|
166
166
|
@staticmethod
|
|
167
167
|
def render(template_files, definitions):
|
|
168
168
|
result = {}
|
|
169
|
-
name = definitions.get("name", "
|
|
169
|
+
name = definitions.get("name", "mypkg")
|
|
170
170
|
if isinstance(name, list):
|
|
171
171
|
raise ConanException(f"name argument can't be multiple: {name}")
|
|
172
172
|
if name != name.lower():
|
|
@@ -58,7 +58,8 @@ class RemotesAPI:
|
|
|
58
58
|
|
|
59
59
|
:param pattern: single ``str`` or list of ``str``. If the pattern is an exact name without
|
|
60
60
|
wildcards like "*" and no remote is found matching that exact name, it will raise an error.
|
|
61
|
-
:return: the list of disabled :ref:`Remote <conan.api.model.Remote>` objects (even if they
|
|
61
|
+
:return: the list of disabled :ref:`Remote <conan.api.model.Remote>` objects (even if they
|
|
62
|
+
were already disabled)
|
|
62
63
|
"""
|
|
63
64
|
remotes = _load(self._remotes_file)
|
|
64
65
|
disabled = _filter(remotes, pattern, only_enabled=False)
|
|
@@ -76,7 +77,8 @@ class RemotesAPI:
|
|
|
76
77
|
|
|
77
78
|
:param pattern: single ``str`` or list of ``str``. If the pattern is an exact name without
|
|
78
79
|
wildcards like "*" and no remote is found matching that exact name, it will raise an error.
|
|
79
|
-
:return: the list of enabled :ref:`Remote <conan.api.model.Remote>` objects (even if they
|
|
80
|
+
:return: the list of enabled :ref:`Remote <conan.api.model.Remote>` objects (even if they
|
|
81
|
+
were already enabled)
|
|
80
82
|
"""
|
|
81
83
|
remotes = _load(self._remotes_file)
|
|
82
84
|
enabled = _filter(remotes, pattern, only_enabled=False)
|
|
@@ -93,7 +95,8 @@ class RemotesAPI:
|
|
|
93
95
|
Obtain a :ref:`Remote <conan.api.model.Remote>` object
|
|
94
96
|
|
|
95
97
|
:param remote_name: the exact name of the remote to be returned
|
|
96
|
-
:return: the :ref:`Remote <conan.api.model.Remote>` object, or raise an Exception if the
|
|
98
|
+
:return: the :ref:`Remote <conan.api.model.Remote>` object, or raise an Exception if the
|
|
99
|
+
remote does not exist.
|
|
97
100
|
"""
|
|
98
101
|
remotes = _load(self._remotes_file)
|
|
99
102
|
try:
|
|
@@ -41,7 +41,6 @@ class ReportAPI:
|
|
|
41
41
|
remotes)
|
|
42
42
|
return export_ref, cache_path
|
|
43
43
|
|
|
44
|
-
|
|
45
44
|
old_export_ref, old_cache_path = _source(old_path, old_reference)
|
|
46
45
|
new_export_ref, new_cache_path = _source(new_path, new_reference)
|
|
47
46
|
|
|
@@ -79,6 +78,7 @@ class ReportAPI:
|
|
|
79
78
|
"dst_prefix": dst_prefix,
|
|
80
79
|
}
|
|
81
80
|
|
|
81
|
+
|
|
82
82
|
def _configure_source(conan_api, hook_manager, conanfile_path, ref, remotes):
|
|
83
83
|
app = ConanApp(conan_api)
|
|
84
84
|
conanfile = app.loader.load_consumer(conanfile_path, name=ref.name, version=str(ref.version),
|
|
@@ -101,6 +101,7 @@ def _configure_source(conan_api, hook_manager, conanfile_path, ref, remotes):
|
|
|
101
101
|
conanfile.folders.set_base_recipe_metadata(recipe_layout.metadata())
|
|
102
102
|
config_source(export_source_folder, conanfile, hook_manager)
|
|
103
103
|
|
|
104
|
+
|
|
104
105
|
def _get_ref_from_cache_or_remote(conan_api, reference, enabled_remotes):
|
|
105
106
|
ref = RecipeReference.loads(reference)
|
|
106
107
|
full_ref, matching_remote = None, False
|
|
@@ -18,8 +18,8 @@ from conan.internal.methods import auto_language, auto_shared_fpic_config_option
|
|
|
18
18
|
from conan.internal.model.options import Options
|
|
19
19
|
from conan.internal.model.workspace import Workspace, WORKSPACE_YML, WORKSPACE_PY, WORKSPACE_FOLDER
|
|
20
20
|
from conan.tools.scm import Git
|
|
21
|
-
from conan.internal.graph.graph import RECIPE_EDITABLE, DepsGraph, CONTEXT_HOST, RECIPE_VIRTUAL,
|
|
22
|
-
|
|
21
|
+
from conan.internal.graph.graph import (RECIPE_EDITABLE, DepsGraph, CONTEXT_HOST, RECIPE_VIRTUAL,
|
|
22
|
+
Node, RECIPE_CONSUMER)
|
|
23
23
|
from conan.internal.graph.graph import TransitiveRequirement
|
|
24
24
|
from conan.internal.graph.profile_node_definer import consumer_definer, initialize_conanfile_profile
|
|
25
25
|
from conan.internal.loader import load_python_file
|
|
@@ -95,7 +95,6 @@ class WorkspaceAPI:
|
|
|
95
95
|
def enable(self, value):
|
|
96
96
|
self._enabled = value
|
|
97
97
|
|
|
98
|
-
@property
|
|
99
98
|
def name(self):
|
|
100
99
|
self._check_ws()
|
|
101
100
|
return self._ws.name()
|
|
@@ -118,7 +117,7 @@ class WorkspaceAPI:
|
|
|
118
117
|
rel_path = editable_info["path"]
|
|
119
118
|
path = os.path.normpath(os.path.join(self._folder, rel_path, "conanfile.py"))
|
|
120
119
|
if not os.path.isfile(path):
|
|
121
|
-
raise ConanException(f"Workspace
|
|
120
|
+
raise ConanException(f"Workspace package not found: {path}")
|
|
122
121
|
ref = editable_info.get("ref")
|
|
123
122
|
try:
|
|
124
123
|
if ref is None:
|
|
@@ -128,12 +127,12 @@ class WorkspaceAPI:
|
|
|
128
127
|
else:
|
|
129
128
|
reference = RecipeReference.loads(ref)
|
|
130
129
|
reference.validate_ref(reference)
|
|
131
|
-
except:
|
|
132
|
-
raise ConanException(f"Workspace
|
|
130
|
+
except Exception as e:
|
|
131
|
+
raise ConanException(f"Workspace package reference could not be deduced by"
|
|
133
132
|
f" {rel_path}/conanfile.py or it is not"
|
|
134
|
-
f" correctly defined in the conanws.yml file
|
|
133
|
+
f" correctly defined in the conanws.yml file: {e}")
|
|
135
134
|
if reference in packages:
|
|
136
|
-
raise ConanException(f"Workspace
|
|
135
|
+
raise ConanException(f"Workspace package '{str(reference)}' already exists.")
|
|
137
136
|
packages[reference] = {"path": path}
|
|
138
137
|
if editable_info.get("output_folder"):
|
|
139
138
|
packages[reference]["output_folder"] = (
|
|
@@ -238,7 +237,7 @@ class WorkspaceAPI:
|
|
|
238
237
|
|
|
239
238
|
def info(self):
|
|
240
239
|
self._check_ws()
|
|
241
|
-
return {"name": self.name,
|
|
240
|
+
return {"name": self._ws.name(),
|
|
242
241
|
"folder": self._folder,
|
|
243
242
|
"packages": self._ws.packages()}
|
|
244
243
|
|
|
@@ -281,17 +280,20 @@ class WorkspaceAPI:
|
|
|
281
280
|
root_class = self._ws.root_conanfile()
|
|
282
281
|
if root_class is not None:
|
|
283
282
|
conanfile = root_class(f"{WORKSPACE_PY} base project Conanfile")
|
|
283
|
+
# To inject things like cmd_wrapper to the consumer conanfile, so self.run() works
|
|
284
|
+
helpers = ConanApp(self._conan_api).loader._conanfile_helpers # noqa
|
|
285
|
+
conanfile._conan_helpers = helpers
|
|
284
286
|
initialize_conanfile_profile(conanfile, profile_build, profile_host, CONTEXT_HOST,
|
|
285
287
|
is_build_require=False)
|
|
286
288
|
# consumer_definer(conanfile, profile_host, profile_build)
|
|
287
289
|
self._init_options(conanfile, profile_host.options)
|
|
288
|
-
root = Node(None, conanfile, context=CONTEXT_HOST, recipe=RECIPE_CONSUMER,
|
|
289
|
-
path=self._folder) # path lets use the conanws.py folder
|
|
290
|
-
root.should_build = True # It is a consumer, this is something we are building
|
|
291
290
|
for field in ("requires", "build_requires", "test_requires", "requirements", "build",
|
|
292
291
|
"source", "package"):
|
|
293
292
|
if getattr(conanfile, field, None):
|
|
294
293
|
raise ConanException(f"Conanfile in conanws.py shouldn't have '{field}'")
|
|
294
|
+
root = Node(None, conanfile, context=CONTEXT_HOST, recipe=RECIPE_CONSUMER,
|
|
295
|
+
path=self._folder) # path lets use the conanws.py folder
|
|
296
|
+
root.should_build = True # It is a consumer, this is something we are building
|
|
295
297
|
else:
|
|
296
298
|
ConanOutput().info(f"Workspace {WORKSPACE_PY} not found in the workspace folder, "
|
|
297
299
|
"using default behavior")
|
|
@@ -301,7 +303,7 @@ class WorkspaceAPI:
|
|
|
301
303
|
|
|
302
304
|
result = DepsGraph() # TODO: We might need to copy more information from the original graph
|
|
303
305
|
result.add_node(root)
|
|
304
|
-
conanfile.
|
|
306
|
+
conanfile.workspace_packages = {}
|
|
305
307
|
for node in deps_graph.nodes[1:]: # Exclude the current root
|
|
306
308
|
if node.recipe != RECIPE_EDITABLE:
|
|
307
309
|
# sanity check, a pacakge in the cache cannot have dependencies to the workspace
|
|
@@ -313,7 +315,9 @@ class WorkspaceAPI:
|
|
|
313
315
|
f"in the workspace: {deps_edit}")
|
|
314
316
|
result.add_node(node)
|
|
315
317
|
continue
|
|
316
|
-
conanfile
|
|
318
|
+
# At the moment we are exposing the full conanfile, docs will warn against usage of
|
|
319
|
+
# non pure functions
|
|
320
|
+
conanfile.workspace_packages[node.ref] = node.conanfile
|
|
317
321
|
for r, t in node.transitive_deps.items():
|
|
318
322
|
if t.node.recipe == RECIPE_EDITABLE:
|
|
319
323
|
continue
|
|
@@ -95,6 +95,7 @@ class Cli:
|
|
|
95
95
|
if command_wrapper.doc:
|
|
96
96
|
name = f"{package}:{command_wrapper.name}" if package else command_wrapper.name
|
|
97
97
|
self._commands[name] = command_wrapper
|
|
98
|
+
command_wrapper._prog = name # set the program name with possible package, if any
|
|
98
99
|
# Avoiding duplicated command help messages
|
|
99
100
|
if name not in self._groups[command_wrapper.group]:
|
|
100
101
|
self._groups[command_wrapper.group].append(name)
|
|
@@ -49,7 +49,7 @@ class BaseConanCommand:
|
|
|
49
49
|
def _init_core_options(parser):
|
|
50
50
|
# Define possible levels, including "" for verbose
|
|
51
51
|
possible_levels = list(ConanOutput.valid_log_levels().keys())
|
|
52
|
-
possible_levels
|
|
52
|
+
possible_levels.pop(possible_levels.index(None))
|
|
53
53
|
parser.add_argument("-v", default="status", nargs='?',
|
|
54
54
|
help="Level of detail of the output. Valid options from less verbose "
|
|
55
55
|
"to more verbose: -vquiet, -verror, -vwarning, -vnotice, -vstatus, "
|
|
@@ -116,7 +116,12 @@ class BaseConanCommand:
|
|
|
116
116
|
def _dispatch_errors(info):
|
|
117
117
|
if info and isinstance(info, dict):
|
|
118
118
|
if info.get("conan_error"):
|
|
119
|
-
|
|
119
|
+
e = info["conan_error"]
|
|
120
|
+
# Storing and launching an exception is better than the string, as it keeps
|
|
121
|
+
# the correct backtrace for debugging.
|
|
122
|
+
if isinstance(e, Exception):
|
|
123
|
+
raise e
|
|
124
|
+
raise ConanException(e)
|
|
120
125
|
if info.get("conan_warning"):
|
|
121
126
|
ConanOutput().warning(info["conan_warning"])
|
|
122
127
|
|
|
@@ -152,6 +157,7 @@ class ConanCommand(BaseConanCommand):
|
|
|
152
157
|
self._subcommands = {}
|
|
153
158
|
self._group = group or "Other"
|
|
154
159
|
self._name = method.__name__.replace("_", "-")
|
|
160
|
+
self._prog = self._name
|
|
155
161
|
|
|
156
162
|
def add_subcommand(self, subcommand):
|
|
157
163
|
subcommand.set_name(self.name)
|
|
@@ -159,7 +165,7 @@ class ConanCommand(BaseConanCommand):
|
|
|
159
165
|
|
|
160
166
|
def run_cli(self, conan_api, *args):
|
|
161
167
|
parser = ConanArgumentParser(conan_api, description=self._doc,
|
|
162
|
-
prog="conan {}".format(self.
|
|
168
|
+
prog="conan {}".format(self._prog),
|
|
163
169
|
formatter_class=SmartFormatter)
|
|
164
170
|
self._init_formatters(parser)
|
|
165
171
|
self._init_core_options(parser)
|
|
@@ -182,7 +188,7 @@ class ConanCommand(BaseConanCommand):
|
|
|
182
188
|
|
|
183
189
|
def run(self, conan_api, *args):
|
|
184
190
|
parser = ConanArgumentParser(conan_api, description=self._doc,
|
|
185
|
-
prog="conan {}".format(self.
|
|
191
|
+
prog="conan {}".format(self._prog),
|
|
186
192
|
formatter_class=SmartFormatter)
|
|
187
193
|
self._init_formatters(parser)
|
|
188
194
|
self._init_core_options(parser)
|
|
@@ -68,6 +68,7 @@ def create(conan_api, parser, *args):
|
|
|
68
68
|
if args.build is not None and args.build_test is None:
|
|
69
69
|
args.build_test = args.build
|
|
70
70
|
|
|
71
|
+
install_error = None
|
|
71
72
|
if is_python_require:
|
|
72
73
|
deps_graph = conan_api.graph.load_graph_requires([], [],
|
|
73
74
|
profile_host=profile_host,
|
|
@@ -98,7 +99,9 @@ def create(conan_api, parser, *args):
|
|
|
98
99
|
update=args.update, lockfile=lockfile)
|
|
99
100
|
print_graph_packages(deps_graph)
|
|
100
101
|
|
|
101
|
-
conan_api.install.install_binaries(deps_graph=deps_graph, remotes=remotes
|
|
102
|
+
install_error = conan_api.install.install_binaries(deps_graph=deps_graph, remotes=remotes,
|
|
103
|
+
return_install_error=True)
|
|
104
|
+
|
|
102
105
|
# We update the lockfile, so it will be updated for later ``test_package``
|
|
103
106
|
lockfile = conan_api.lockfile.update_lockfile(lockfile, deps_graph, args.lockfile_packages,
|
|
104
107
|
clean=args.lockfile_clean)
|
|
@@ -111,7 +114,7 @@ def create(conan_api, parser, *args):
|
|
|
111
114
|
and deps_graph.root.edges[0].dst.binary != "Build":
|
|
112
115
|
test_conanfile_path = None # disable it
|
|
113
116
|
|
|
114
|
-
if test_conanfile_path:
|
|
117
|
+
if test_conanfile_path and not install_error:
|
|
115
118
|
# TODO: We need arguments for:
|
|
116
119
|
# - decide update policy "--test_package_update"
|
|
117
120
|
# If it is a string, it will be injected always, if it is a RecipeReference, then it will
|
|
@@ -126,7 +129,8 @@ def create(conan_api, parser, *args):
|
|
|
126
129
|
|
|
127
130
|
conan_api.lockfile.save_lockfile(lockfile, args.lockfile_out, cwd)
|
|
128
131
|
return {"graph": deps_graph,
|
|
129
|
-
"conan_api": conan_api
|
|
132
|
+
"conan_api": conan_api,
|
|
133
|
+
"conan_error": install_error}
|
|
130
134
|
|
|
131
135
|
|
|
132
136
|
def _check_tested_reference_matches(deps_graph, tested_ref, out):
|