conan 2.14.0__tar.gz → 2.15.1__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.14.0/conan.egg-info → conan-2.15.1}/PKG-INFO +1 -1
- {conan-2.14.0 → conan-2.15.1}/conan/__init__.py +1 -1
- {conan-2.14.0 → conan-2.15.1}/conan/api/model/list.py +49 -4
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/audit.py +6 -3
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/command.py +27 -3
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/list.py +79 -2
- {conan-2.14.0 → conan-2.15.1}/conan/cli/cli.py +2 -2
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/audit.py +11 -8
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/create.py +5 -22
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/graph.py +5 -50
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/list.py +5 -2
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/pkglist.py +4 -34
- conan-2.15.1/conan/cli/formatters/graph/graph.py +62 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/list/list.py +4 -2
- {conan-2.14.0 → conan-2.15.1}/conan/cli/printers/graph.py +10 -6
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/audit/providers.py +20 -23
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/detect/detect_api.py +5 -2
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/install/generators.py +15 -10
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/uploader.py +1 -1
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/home_paths.py +4 -4
- {conan-2.14.0 → conan-2.15.1}/conan/internal/default_settings.py +13 -11
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/conan_file.py +2 -1
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/conf.py +7 -9
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/cpp_info.py +11 -12
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/version_range.py +8 -1
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/tools.py +13 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/apple/apple.py +3 -3
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps2/target_configuration.py +6 -3
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/__init__.py +1 -1
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/files.py +86 -7
- {conan-2.14.0 → conan-2.15.1}/conan/tools/meson/helpers.py +11 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/meson/toolchain.py +13 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/msbuilddeps.py +9 -4
- {conan-2.14.0 → conan-2.15.1}/conan/tools/sbom/cyclonedx.py +15 -15
- {conan-2.14.0 → conan-2.15.1/conan.egg-info}/PKG-INFO +1 -1
- {conan-2.14.0 → conan-2.15.1}/conans/client/downloaders/download_cache.py +3 -2
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/graph.py +0 -7
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/proxy.py +1 -1
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/python_requires.py +1 -1
- {conan-2.14.0 → conan-2.15.1}/conans/client/installer.py +1 -4
- conan-2.14.0/conan/cli/formatters/graph/graph.py +0 -148
- {conan-2.14.0 → conan-2.15.1}/LICENSE.md +0 -0
- {conan-2.14.0 → conan-2.15.1}/MANIFEST.in +0 -0
- {conan-2.14.0 → conan-2.15.1}/README.md +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/conan_api.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/input.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/model/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/model/refs.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/model/remote.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/output.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/cache.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/config.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/download.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/export.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/graph.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/install.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/local.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/lockfile.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/new.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/profiles.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/remotes.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/remove.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/search.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/upload.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/api/subapi/workspace.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/args.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/command.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/build.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/cache.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/config.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/download.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/editable.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/export.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/export_pkg.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/inspect.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/install.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/lock.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/new.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/profile.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/remote.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/remove.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/search.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/source.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/test.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/upload.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/version.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/commands/workspace.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/exit_codes.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/audit/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/audit/vulnerabilities.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/graph/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/graph/build_order_html.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/graph/graph_info_text.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/graph/info_graph_html.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/list/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/formatters/list/search_table_html.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cli/printers/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cps/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/cps/cps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/errors.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/audit/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/config/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/config/config_installer.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/detect/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/detect/detect_vs.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/export.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/install/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/list/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/list/query_parse.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/local/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/local/editable.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/alias_new.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/autoools_exe.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/autotools_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/basic.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/bazel_7_exe.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/bazel_7_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/bazel_exe.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/bazel_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/cmake_exe.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/cmake_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/local_recipes_index.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/meson_exe.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/meson_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/msbuild_exe.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/msbuild_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/qbs_lib.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/new/workspace.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/profile/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/profile/detect.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/profile/profile_loader.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/remotes/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/remotes/encrypt.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/api/remotes/localdb.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/cache.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/conan_reference_layout.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/db/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/db/cache_database.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/db/packages_table.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/db/recipes_table.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/db/table.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/cache/integrity_check.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/conan_app.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/deploy.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/errors.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/internal_tools.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/methods.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/conanfile_interface.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/dependencies.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/info.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/layout.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/lockfile.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/manifest.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/options.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/pkg_type.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/profile.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/recipe_ref.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/requires.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/settings.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/version.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/model/workspace.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/paths.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/runner/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/runner/docker.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/runner/output.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/runner/ssh.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/internal/runner/wsl.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/assets/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/assets/autotools.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/assets/cmake.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/assets/genconanfile.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/assets/sources.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/assets/visual_project_files.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/artifactory.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/env.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/file_server.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/mocks.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/profiles.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/scm.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/server_launcher.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/test/utils/test_files.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/android/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/android/utils.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/apple/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/apple/xcodebuild.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/apple/xcodedeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/apple/xcodetoolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/cppstd.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/cpu.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/cross_building.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/cstd.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/flags.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/build/stdcpp_library.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmake.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/cmakedeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps2/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps2/cmakedeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps2/config.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/layout.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/presets.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/toolchain/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/toolchain/blocks.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/toolchain/toolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cmake/utils.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cps/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/cps/cps_deps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/env/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/env/environment.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/env/virtualbuildenv.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/env/virtualrunenv.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/conandata.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/copy_pattern.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/packager.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/patches.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/symlinks/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/files/symlinks/symlinks.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/autotools.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/autotoolsdeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/autotoolstoolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/get_gnu_triplet.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/gnudeps_flags.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/gnutoolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/makedeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/pkgconfig.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/gnu/pkgconfigdeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/google/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/google/bazel.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/google/bazeldeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/google/layout.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/google/toolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/intel/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/intel/intel_cc.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/layout/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/meson/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/meson/meson.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/layout.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/msbuild.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/nmakedeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/nmaketoolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/subsystems.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/toolchain.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/microsoft/visual.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/premake/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/premake/premake.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/premake/premakedeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/qbs/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/qbs/common.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/qbs/qbs.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/qbs/qbsdeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/qbs/qbsprofile.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/ros/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/ros/rosenv.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/sbom/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/scm/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/scm/git.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/scons/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/scons/sconsdeps.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/system/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan/tools/system/package_manager.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan.egg-info/SOURCES.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan.egg-info/dependency_links.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan.egg-info/entry_points.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan.egg-info/requires.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conan.egg-info/top_level.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/downloaders/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/downloaders/caching_file_downloader.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/downloaders/file_downloader.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/build_mode.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/compatibility.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/compute_pid.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/graph_binaries.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/graph_builder.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/graph_error.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/install_graph.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/profile_node_definer.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/provides.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/graph/range_resolver.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/hook_manager.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/loader.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/loader_txt.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/migrations.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/pkg_sign.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/remote_manager.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/auth_manager.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/client_routes.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/conan_requester.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/file_uploader.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/remote_credentials.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/rest_client.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/rest_client_v2.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest/rest_routes.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/rest_client_local_recipe_index.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/source.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/client/subsystems.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/conan.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/conan_server.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/migrations.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/model/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/model/package_ref.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/model/recipe_ref.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/requirements.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/requirements_dev.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/requirements_runner.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/requirements_server.txt +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/__init__.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/config_parser.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/dates.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/files.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/locks.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/runners.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/conans/util/thread.py +0 -0
- {conan-2.14.0 → conan-2.15.1}/pyproject.toml +0 -0
- {conan-2.14.0 → conan-2.15.1}/setup.cfg +0 -0
- {conan-2.14.0 → conan-2.15.1}/setup.py +0 -0
|
@@ -3,9 +3,10 @@ import json
|
|
|
3
3
|
import os
|
|
4
4
|
from json import JSONDecodeError
|
|
5
5
|
|
|
6
|
+
from conan.api.model import RecipeReference, PkgReference
|
|
7
|
+
from conan.cli import make_abs_path
|
|
6
8
|
from conan.errors import ConanException
|
|
7
9
|
from conan.internal.errors import NotFoundException
|
|
8
|
-
from conan.api.model import RecipeReference, PkgReference
|
|
9
10
|
from conan.internal.model.version_range import VersionRange
|
|
10
11
|
from conans.client.graph.graph import RECIPE_EDITABLE, RECIPE_CONSUMER, RECIPE_PLATFORM, \
|
|
11
12
|
RECIPE_VIRTUAL, BINARY_SKIP, BINARY_MISSING, BINARY_INVALID
|
|
@@ -36,6 +37,10 @@ class MultiPackagesList:
|
|
|
36
37
|
for k, v in other.lists.items():
|
|
37
38
|
self.lists.setdefault(k, PackagesList()).merge(v)
|
|
38
39
|
|
|
40
|
+
def keep_outer(self, other):
|
|
41
|
+
for namespace, other_pkg_list in other.lists.items():
|
|
42
|
+
self.lists.get(namespace, PackagesList()).keep_outer(other_pkg_list)
|
|
43
|
+
|
|
39
44
|
@staticmethod
|
|
40
45
|
def load(file):
|
|
41
46
|
try:
|
|
@@ -44,6 +49,14 @@ class MultiPackagesList:
|
|
|
44
49
|
raise ConanException(f"Package list file invalid JSON: {file}\n{e}")
|
|
45
50
|
except Exception as e:
|
|
46
51
|
raise ConanException(f"Package list file missing or broken: {file}\n{e}")
|
|
52
|
+
# Check if input json is not a graph file
|
|
53
|
+
if "graph" in content:
|
|
54
|
+
base_path = os.path.basename(file)
|
|
55
|
+
raise ConanException(
|
|
56
|
+
'Expected a package list file but found a graph file. You can create a "package list" JSON file by running:\n\n'
|
|
57
|
+
f"\tconan list --graph {base_path} --format=json > pkglist.json\n\n"
|
|
58
|
+
"More Info at 'https://docs.conan.io/2/examples/commands/pkglists.html"
|
|
59
|
+
)
|
|
47
60
|
result = {}
|
|
48
61
|
for remote, pkglist in content.items():
|
|
49
62
|
if "error" in pkglist:
|
|
@@ -55,19 +68,40 @@ class MultiPackagesList:
|
|
|
55
68
|
return pkglist
|
|
56
69
|
|
|
57
70
|
@staticmethod
|
|
58
|
-
def load_graph(graphfile, graph_recipes=None, graph_binaries=None):
|
|
71
|
+
def load_graph(graphfile, graph_recipes=None, graph_binaries=None, context=None):
|
|
59
72
|
if not os.path.isfile(graphfile):
|
|
60
73
|
raise ConanException(f"Graph file not found: {graphfile}")
|
|
61
74
|
try:
|
|
75
|
+
base_context = context.split("-")[0] if context else None
|
|
62
76
|
graph = json.loads(load(graphfile))
|
|
63
|
-
|
|
77
|
+
# Check if input json is a graph file
|
|
78
|
+
if "graph" not in graph:
|
|
79
|
+
raise ConanException(
|
|
80
|
+
'Expected a graph file but found an unexpected JSON file format. You can create a "graph" JSON file by running:\n\n'
|
|
81
|
+
f"\tconan [ graph-info | create | export-pkg | install | test ] --format=json > graph.json\n\n"
|
|
82
|
+
"More Info at 'https://docs.conan.io/2/reference/commands/formatters/graph_info_json_formatter.html"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
mpkglist = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
|
|
86
|
+
context=base_context)
|
|
87
|
+
if context == "build-only":
|
|
88
|
+
host = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
|
|
89
|
+
context="host")
|
|
90
|
+
mpkglist.keep_outer(host)
|
|
91
|
+
elif context == "host-only":
|
|
92
|
+
build = MultiPackagesList._define_graph(graph, graph_recipes, graph_binaries,
|
|
93
|
+
context="build")
|
|
94
|
+
mpkglist.keep_outer(build)
|
|
95
|
+
return mpkglist
|
|
64
96
|
except JSONDecodeError as e:
|
|
65
97
|
raise ConanException(f"Graph file invalid JSON: {graphfile}\n{e}")
|
|
98
|
+
except ConanException as e:
|
|
99
|
+
raise e
|
|
66
100
|
except Exception as e:
|
|
67
101
|
raise ConanException(f"Graph file broken: {graphfile}\n{e}")
|
|
68
102
|
|
|
69
103
|
@staticmethod
|
|
70
|
-
def _define_graph(graph, graph_recipes=None, graph_binaries=None):
|
|
104
|
+
def _define_graph(graph, graph_recipes=None, graph_binaries=None, context=None):
|
|
71
105
|
pkglist = MultiPackagesList()
|
|
72
106
|
cache_list = PackagesList()
|
|
73
107
|
if graph_recipes is None and graph_binaries is None:
|
|
@@ -79,6 +113,9 @@ class MultiPackagesList:
|
|
|
79
113
|
|
|
80
114
|
pkglist.lists["Local Cache"] = cache_list
|
|
81
115
|
for node in graph["graph"]["nodes"].values():
|
|
116
|
+
if context and node['context'] != context:
|
|
117
|
+
continue
|
|
118
|
+
|
|
82
119
|
# We need to add the python_requires too
|
|
83
120
|
python_requires = node.get("python_requires")
|
|
84
121
|
if python_requires is not None:
|
|
@@ -142,6 +179,14 @@ class PackagesList:
|
|
|
142
179
|
return d
|
|
143
180
|
recursive_dict_update(self.recipes, other.recipes)
|
|
144
181
|
|
|
182
|
+
def keep_outer(self, other):
|
|
183
|
+
if not self.recipes:
|
|
184
|
+
return
|
|
185
|
+
|
|
186
|
+
for ref, info in other.recipes.items():
|
|
187
|
+
if self.recipes.get(ref, {}) == info:
|
|
188
|
+
self.recipes.pop(ref)
|
|
189
|
+
|
|
145
190
|
def split(self):
|
|
146
191
|
"""
|
|
147
192
|
Returns a list of PackageList, splitted one per reference.
|
|
@@ -12,6 +12,7 @@ from conans.util.files import save, load
|
|
|
12
12
|
CONAN_CENTER_AUDIT_PROVIDER_NAME = "conancenter"
|
|
13
13
|
CYPHER_KEY = "private"
|
|
14
14
|
|
|
15
|
+
|
|
15
16
|
class AuditAPI:
|
|
16
17
|
"""
|
|
17
18
|
This class provides the functionality to scan references for vulnerabilities.
|
|
@@ -26,15 +27,17 @@ class AuditAPI:
|
|
|
26
27
|
"private": PrivateProvider,
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
@staticmethod
|
|
31
|
+
def scan(deps_graph, provider):
|
|
30
32
|
"""
|
|
31
33
|
Scan a given recipe for vulnerabilities in its dependencies.
|
|
32
34
|
"""
|
|
33
35
|
refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
|
|
34
|
-
|
|
36
|
+
for node in deps_graph.nodes[1:]), key=lambda ref: ref.name)
|
|
35
37
|
return provider.get_cves(refs)
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
@staticmethod
|
|
40
|
+
def list(references, provider):
|
|
38
41
|
"""
|
|
39
42
|
List the vulnerabilities of the given reference.
|
|
40
43
|
"""
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
1
3
|
from conan.api.output import ConanOutput
|
|
2
4
|
from conan.errors import ConanException
|
|
3
5
|
|
|
@@ -25,9 +27,9 @@ class CommandAPI:
|
|
|
25
27
|
# get redefined when running a command and leak to the calling scope
|
|
26
28
|
# if running from a custom command.
|
|
27
29
|
# Store the old one and restore it after the command execution as a workaround.
|
|
28
|
-
_conan_output_level = ConanOutput._conan_output_level
|
|
29
|
-
_silent_warn_tags = ConanOutput._silent_warn_tags
|
|
30
|
-
_warnings_as_errors = ConanOutput._warnings_as_errors
|
|
30
|
+
_conan_output_level = ConanOutput._conan_output_level # noqa
|
|
31
|
+
_silent_warn_tags = ConanOutput._silent_warn_tags # noqa
|
|
32
|
+
_warnings_as_errors = ConanOutput._warnings_as_errors # noqa
|
|
31
33
|
|
|
32
34
|
try:
|
|
33
35
|
result = command.run_cli(self.conan_api, args)
|
|
@@ -36,3 +38,25 @@ class CommandAPI:
|
|
|
36
38
|
ConanOutput._silent_warn_tags = _silent_warn_tags
|
|
37
39
|
ConanOutput._warnings_as_errors = _warnings_as_errors
|
|
38
40
|
return result
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def get_runner(profile_host):
|
|
44
|
+
if profile_host.runner and not os.environ.get("CONAN_RUNNER_ENVIRONMENT"):
|
|
45
|
+
from conan.internal.runner.docker import DockerRunner
|
|
46
|
+
from conan.internal.runner.ssh import SSHRunner
|
|
47
|
+
from conan.internal.runner.wsl import WSLRunner
|
|
48
|
+
try:
|
|
49
|
+
runner_type = profile_host.runner['type'].lower()
|
|
50
|
+
except KeyError:
|
|
51
|
+
raise ConanException(f"Invalid runner configuration. 'type' must be defined")
|
|
52
|
+
runner_instances_map = {
|
|
53
|
+
'docker': DockerRunner,
|
|
54
|
+
# 'ssh': SSHRunner,
|
|
55
|
+
# 'wsl': WSLRunner,
|
|
56
|
+
}
|
|
57
|
+
try:
|
|
58
|
+
runner_instance = runner_instances_map[runner_type]
|
|
59
|
+
except KeyError:
|
|
60
|
+
raise ConanException(f"Invalid runner type '{runner_type}'. "
|
|
61
|
+
f"Allowed values: {', '.join(runner_instances_map.keys())}")
|
|
62
|
+
return runner_instance
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import copy
|
|
1
2
|
import os
|
|
2
3
|
from collections import OrderedDict
|
|
3
4
|
from typing import Dict
|
|
4
5
|
|
|
5
|
-
from conan.api.model import PackagesList
|
|
6
|
+
from conan.api.model import PackagesList, MultiPackagesList, ListPattern
|
|
6
7
|
from conan.api.output import ConanOutput, TimedOutput
|
|
7
8
|
from conan.internal.api.list.query_parse import filter_package_configs
|
|
8
9
|
from conan.internal.conan_app import ConanBasicApp
|
|
@@ -242,7 +243,7 @@ class ListAPI:
|
|
|
242
243
|
ConanOutput().info(f"Finding binaries in remote {remote.name}")
|
|
243
244
|
pkg_configurations = self.packages_configurations(ref, remote=remote)
|
|
244
245
|
except Exception as e:
|
|
245
|
-
ConanOutput(f"
|
|
246
|
+
ConanOutput().error(f"Error in remote '{remote.name}': {e}")
|
|
246
247
|
else:
|
|
247
248
|
candidates.extend(_BinaryDistance(pref, data, conaninfo, remote)
|
|
248
249
|
for pref, data in pkg_configurations.items())
|
|
@@ -266,6 +267,82 @@ class ListAPI:
|
|
|
266
267
|
rev_dict["packages"][pref.package_id]["remote"] = remote
|
|
267
268
|
return pkglist
|
|
268
269
|
|
|
270
|
+
def find_remotes(self, package_list, remotes):
|
|
271
|
+
"""
|
|
272
|
+
(Experimental) Find the remotes where the current package lists can be found
|
|
273
|
+
"""
|
|
274
|
+
result = MultiPackagesList()
|
|
275
|
+
for r in remotes:
|
|
276
|
+
result_pkg_list = PackagesList()
|
|
277
|
+
for ref, recipe_bundle in package_list.refs().items():
|
|
278
|
+
ref_no_rev = copy.copy(ref) # TODO: Improve ugly API
|
|
279
|
+
ref_no_rev.revision = None
|
|
280
|
+
try:
|
|
281
|
+
revs = self.recipe_revisions(ref_no_rev, remote=r)
|
|
282
|
+
except NotFoundException:
|
|
283
|
+
continue
|
|
284
|
+
if ref not in revs: # not found
|
|
285
|
+
continue
|
|
286
|
+
result_pkg_list.add_refs([ref])
|
|
287
|
+
for pref, pref_bundle in package_list.prefs(ref, recipe_bundle).items():
|
|
288
|
+
pref_no_rev = copy.copy(pref) # TODO: Improve ugly API
|
|
289
|
+
pref_no_rev.revision = None
|
|
290
|
+
try:
|
|
291
|
+
prevs = self.package_revisions(pref_no_rev, remote=r)
|
|
292
|
+
except NotFoundException:
|
|
293
|
+
continue
|
|
294
|
+
if pref in prevs:
|
|
295
|
+
result_pkg_list.add_prefs(ref, [pref])
|
|
296
|
+
info = recipe_bundle["packages"][pref.package_id]["info"]
|
|
297
|
+
result_pkg_list.add_configurations({pref: info})
|
|
298
|
+
if result_pkg_list.recipes:
|
|
299
|
+
result.add(r.name, result_pkg_list)
|
|
300
|
+
return result
|
|
301
|
+
|
|
302
|
+
def outdated(self, deps_graph, remotes):
|
|
303
|
+
# DO NOT USE YET
|
|
304
|
+
# Data structure to store info per library
|
|
305
|
+
dependencies = deps_graph.nodes[1:]
|
|
306
|
+
dict_nodes = {}
|
|
307
|
+
|
|
308
|
+
# When there are no dependencies command should stop
|
|
309
|
+
if len(dependencies) == 0:
|
|
310
|
+
return dict_nodes
|
|
311
|
+
|
|
312
|
+
ConanOutput().title("Checking remotes")
|
|
313
|
+
|
|
314
|
+
for node in dependencies:
|
|
315
|
+
dict_nodes.setdefault(node.name, {"cache_refs": set(), "version_ranges": [],
|
|
316
|
+
"latest_remote": None})["cache_refs"].add(node.ref)
|
|
317
|
+
|
|
318
|
+
for version_range in deps_graph.resolved_ranges.keys():
|
|
319
|
+
dict_nodes[version_range.name]["version_ranges"].append(version_range)
|
|
320
|
+
|
|
321
|
+
# find in remotes
|
|
322
|
+
for node_name, node_info in dict_nodes.items():
|
|
323
|
+
ref_pattern = ListPattern(node_name, rrev=None, prev=None)
|
|
324
|
+
for remote in remotes:
|
|
325
|
+
try:
|
|
326
|
+
remote_ref_list = self.select(ref_pattern, package_query=None, remote=remote)
|
|
327
|
+
except NotFoundException:
|
|
328
|
+
continue
|
|
329
|
+
if not remote_ref_list.recipes:
|
|
330
|
+
continue
|
|
331
|
+
str_latest_ref = list(remote_ref_list.recipes.keys())[-1]
|
|
332
|
+
recipe_ref = RecipeReference.loads(str_latest_ref)
|
|
333
|
+
if (node_info["latest_remote"] is None
|
|
334
|
+
or node_info["latest_remote"]["ref"] < recipe_ref):
|
|
335
|
+
node_info["latest_remote"] = {"ref": recipe_ref, "remote": remote.name}
|
|
336
|
+
|
|
337
|
+
# Filter nodes with no outdated versions
|
|
338
|
+
filtered_nodes = {}
|
|
339
|
+
for node_name, node in dict_nodes.items():
|
|
340
|
+
if node['latest_remote'] is not None and sorted(list(node['cache_refs']))[0] < \
|
|
341
|
+
node['latest_remote']['ref']:
|
|
342
|
+
filtered_nodes[node_name] = node
|
|
343
|
+
|
|
344
|
+
return filtered_nodes
|
|
345
|
+
|
|
269
346
|
|
|
270
347
|
class _BinaryDistance:
|
|
271
348
|
def __init__(self, pref, binary, expected, remote=None):
|
|
@@ -15,7 +15,6 @@ from conan.api.output import ConanOutput, Color, cli_out_write, LEVEL_TRACE
|
|
|
15
15
|
from conan.cli.command import ConanSubCommand
|
|
16
16
|
from conan.cli.exit_codes import SUCCESS, ERROR_MIGRATION, ERROR_GENERAL, USER_CTRL_C, \
|
|
17
17
|
ERROR_SIGTERM, USER_CTRL_BREAK, ERROR_INVALID_CONFIGURATION, ERROR_UNEXPECTED
|
|
18
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
19
18
|
from conan import __version__
|
|
20
19
|
from conan.errors import ConanException, ConanInvalidConfiguration, ConanMigrationError
|
|
21
20
|
|
|
@@ -49,7 +48,8 @@ class Cli:
|
|
|
49
48
|
for k, v in self._commands.items(): # Fill groups data too
|
|
50
49
|
self._groups[v.group].append(k)
|
|
51
50
|
|
|
52
|
-
conan_custom_commands_path =
|
|
51
|
+
conan_custom_commands_path = os.path.join(self._conan_api.cache_folder, "extensions",
|
|
52
|
+
"commands")
|
|
53
53
|
# Important! This variable should be only used for testing/debugging purpose
|
|
54
54
|
developer_custom_commands_path = os.getenv(_CONAN_INTERNAL_CUSTOM_COMMANDS_PATH)
|
|
55
55
|
# Notice that in case of having same custom commands file names, the developer one has
|
|
@@ -80,8 +80,8 @@ def audit_list(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
80
80
|
List the vulnerabilities of the given reference.
|
|
81
81
|
"""
|
|
82
82
|
subparser.add_argument("reference", help="Reference to list vulnerabilities for", nargs="?")
|
|
83
|
-
subparser.add_argument("-l", "--list", help="pkglist file to list vulnerabilities for"
|
|
84
|
-
subparser.add_argument("-r", "--remote", help="Remote to use for listing"
|
|
83
|
+
subparser.add_argument("-l", "--list", help="pkglist file to list vulnerabilities for")
|
|
84
|
+
subparser.add_argument("-r", "--remote", help="Remote to use for listing")
|
|
85
85
|
_add_provider_arg(subparser)
|
|
86
86
|
args = parser.parse_args(*args)
|
|
87
87
|
|
|
@@ -93,7 +93,6 @@ def audit_list(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
93
93
|
|
|
94
94
|
provider = conan_api.audit.get_provider(args.provider or CONAN_CENTER_AUDIT_PROVIDER_NAME)
|
|
95
95
|
|
|
96
|
-
references = []
|
|
97
96
|
if args.list:
|
|
98
97
|
listfile = make_abs_path(args.list)
|
|
99
98
|
multi_package_list = MultiPackagesList.load(listfile)
|
|
@@ -107,7 +106,8 @@ def audit_list(conan_api: ConanAPI, parser, subparser, *args):
|
|
|
107
106
|
references = [args.reference]
|
|
108
107
|
return conan_api.audit.list(references, provider)
|
|
109
108
|
|
|
110
|
-
|
|
109
|
+
|
|
110
|
+
def _text_provider_formatter(providers_action):
|
|
111
111
|
providers = providers_action[0]
|
|
112
112
|
action = providers_action[1]
|
|
113
113
|
|
|
@@ -125,7 +125,8 @@ def text_provider_formatter(providers_action):
|
|
|
125
125
|
if provider:
|
|
126
126
|
cli_out_write(f"{provider.name} (type: {provider.type}) - {provider.url}")
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
|
|
129
|
+
def _json_provider_formatter(providers_action):
|
|
129
130
|
ret = []
|
|
130
131
|
for provider in providers_action[0]:
|
|
131
132
|
if provider:
|
|
@@ -133,13 +134,14 @@ def json_provider_formatter(providers_action):
|
|
|
133
134
|
cli_out_write(json.dumps(ret, indent=4))
|
|
134
135
|
|
|
135
136
|
|
|
136
|
-
@conan_subcommand(formatters={"text":
|
|
137
|
+
@conan_subcommand(formatters={"text": _text_provider_formatter, "json": _json_provider_formatter})
|
|
137
138
|
def audit_provider(conan_api, parser, subparser, *args):
|
|
138
139
|
"""
|
|
139
140
|
Manage security providers for the 'conan audit' command.
|
|
140
141
|
"""
|
|
141
142
|
|
|
142
|
-
subparser.add_argument("action", choices=["add", "list", "auth", "remove"],
|
|
143
|
+
subparser.add_argument("action", choices=["add", "list", "auth", "remove"],
|
|
144
|
+
help="Action to perform from 'add', 'list' , 'remove' or 'auth'")
|
|
143
145
|
subparser.add_argument("name", help="Provider name", nargs="?")
|
|
144
146
|
|
|
145
147
|
subparser.add_argument("--url", help="Provider URL")
|
|
@@ -188,8 +190,9 @@ def audit_provider(conan_api, parser, subparser, *args):
|
|
|
188
190
|
conan_api.audit.auth_provider(provider, token)
|
|
189
191
|
return [provider], args.action
|
|
190
192
|
|
|
193
|
+
|
|
191
194
|
@conan_command(group="Security")
|
|
192
|
-
def audit(conan_api, parser, *args):
|
|
195
|
+
def audit(conan_api, parser, *args): # noqa
|
|
193
196
|
"""
|
|
194
197
|
Find vulnerabilities in your dependencies.
|
|
195
198
|
"""
|
|
@@ -9,8 +9,6 @@ from conan.cli.formatters.graph import format_graph_json
|
|
|
9
9
|
from conan.cli.printers import print_profiles
|
|
10
10
|
from conan.cli.printers.graph import print_graph_packages, print_graph_basic
|
|
11
11
|
from conan.errors import ConanException
|
|
12
|
-
from conans.client.graph.graph import BINARY_BUILD
|
|
13
|
-
from conans.util.files import mkdir
|
|
14
12
|
|
|
15
13
|
|
|
16
14
|
@conan_command(group="Creator", formatters={"json": format_graph_json})
|
|
@@ -63,24 +61,9 @@ def create(conan_api, parser, *args):
|
|
|
63
61
|
lockfile = conan_api.lockfile.update_lockfile_export(lockfile, conanfile, ref, is_build)
|
|
64
62
|
|
|
65
63
|
print_profiles(profile_host, profile_build)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
from conan.internal.runner.wsl import WSLRunner
|
|
70
|
-
try:
|
|
71
|
-
runner_type = profile_host.runner['type'].lower()
|
|
72
|
-
except KeyError:
|
|
73
|
-
raise ConanException(f"Invalid runner configuration. 'type' must be defined")
|
|
74
|
-
runner_instances_map = {
|
|
75
|
-
'docker': DockerRunner,
|
|
76
|
-
# 'ssh': SSHRunner,
|
|
77
|
-
# 'wsl': WSLRunner,
|
|
78
|
-
}
|
|
79
|
-
try:
|
|
80
|
-
runner_instance = runner_instances_map[runner_type]
|
|
81
|
-
except KeyError:
|
|
82
|
-
raise ConanException(f"Invalid runner type '{runner_type}'. Allowed values: {', '.join(runner_instances_map.keys())}")
|
|
83
|
-
return runner_instance(conan_api, 'create', profile_host, profile_build, args, raw_args).run()
|
|
64
|
+
runner = conan_api.command.get_runner(profile_host)
|
|
65
|
+
if runner is not None:
|
|
66
|
+
return runner(conan_api, 'create', profile_host, profile_build, args, raw_args).run()
|
|
84
67
|
|
|
85
68
|
if args.build is not None and args.build_test is None:
|
|
86
69
|
args.build_test = args.build
|
|
@@ -125,7 +108,7 @@ def create(conan_api, parser, *args):
|
|
|
125
108
|
test_conanfile_path = _get_test_conanfile_path(test_package_folder, path)
|
|
126
109
|
# If the user provide --test-missing and the binary was not built from source, skip test_package
|
|
127
110
|
if args.test_missing and deps_graph.root.dependencies\
|
|
128
|
-
and deps_graph.root.dependencies[0].dst.binary !=
|
|
111
|
+
and deps_graph.root.dependencies[0].dst.binary != "Build":
|
|
129
112
|
test_conanfile_path = None # disable it
|
|
130
113
|
|
|
131
114
|
if test_conanfile_path:
|
|
@@ -176,7 +159,7 @@ def test_package(conan_api, deps_graph, test_conanfile_path):
|
|
|
176
159
|
out.info("Removing previously existing 'test_package' build folder: "
|
|
177
160
|
f"{conanfile.build_folder}")
|
|
178
161
|
shutil.rmtree(conanfile.build_folder, ignore_errors=True)
|
|
179
|
-
|
|
162
|
+
os.makedirs(conanfile.build_folder, exist_ok=True)
|
|
180
163
|
conanfile.output.info(f"Test package build: {conanfile.folders.build}")
|
|
181
164
|
conanfile.output.info(f"Test package build folder: {conanfile.build_folder}")
|
|
182
165
|
conan_api.install.install_consumer(deps_graph=deps_graph,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
|
-
from conan.api.model import ListPattern
|
|
5
4
|
from conan.api.output import ConanOutput, cli_out_write, Color
|
|
6
5
|
from conan.cli import make_abs_path
|
|
7
6
|
from conan.cli.args import common_graph_args, validate_common_graph_args
|
|
@@ -14,8 +13,6 @@ from conan.cli.printers import print_profiles
|
|
|
14
13
|
from conan.cli.printers.graph import print_graph_packages, print_graph_basic
|
|
15
14
|
from conan.errors import ConanException
|
|
16
15
|
from conans.client.graph.install_graph import InstallGraph, ProfileArgs
|
|
17
|
-
from conan.internal.errors import NotFoundException
|
|
18
|
-
from conan.api.model import RecipeReference
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
def explain_formatter_text(data):
|
|
@@ -38,7 +35,7 @@ def explain_formatter_json(data):
|
|
|
38
35
|
|
|
39
36
|
|
|
40
37
|
@conan_command(group="Consumer")
|
|
41
|
-
def graph(conan_api, parser, *args):
|
|
38
|
+
def graph(conan_api, parser, *args): # noqa
|
|
42
39
|
"""
|
|
43
40
|
Compute a dependency graph, without installing or building the binaries.
|
|
44
41
|
"""
|
|
@@ -135,7 +132,7 @@ def graph_build_order(conan_api, parser, subparser, *args):
|
|
|
135
132
|
|
|
136
133
|
@conan_subcommand(formatters={"text": cli_build_order, "json": json_build_order,
|
|
137
134
|
"html": format_build_order_html})
|
|
138
|
-
def graph_build_order_merge(conan_api, parser, subparser, *args):
|
|
135
|
+
def graph_build_order_merge(conan_api, parser, subparser, *args): # noqa
|
|
139
136
|
"""
|
|
140
137
|
Merge more than 1 build-order file.
|
|
141
138
|
"""
|
|
@@ -378,48 +375,6 @@ def graph_outdated(conan_api, parser, subparser, *args):
|
|
|
378
375
|
print_graph_basic(deps_graph)
|
|
379
376
|
|
|
380
377
|
# Data structure to store info per library
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
# When there are no dependencies command should stop
|
|
385
|
-
if len(dependencies) == 0:
|
|
386
|
-
return dict_nodes
|
|
387
|
-
|
|
388
|
-
ConanOutput().title("Checking remotes")
|
|
389
|
-
|
|
390
|
-
for node in dependencies:
|
|
391
|
-
dict_nodes.setdefault(node.name, {"cache_refs": set(), "version_ranges": [],
|
|
392
|
-
"latest_remote": None})["cache_refs"].add(node.ref)
|
|
393
|
-
|
|
394
|
-
for version_range in deps_graph.resolved_ranges.keys():
|
|
395
|
-
dict_nodes[version_range.name]["version_ranges"].append(version_range)
|
|
396
|
-
|
|
397
|
-
# find in remotes
|
|
398
|
-
_find_in_remotes(conan_api, dict_nodes, remotes)
|
|
399
|
-
|
|
400
|
-
# Filter nodes with no outdated versions
|
|
401
|
-
filtered_nodes = {}
|
|
402
|
-
for node_name, node in dict_nodes.items():
|
|
403
|
-
if node['latest_remote'] is not None and sorted(list(node['cache_refs']))[0] < \
|
|
404
|
-
node['latest_remote']['ref']:
|
|
405
|
-
filtered_nodes[node_name] = node
|
|
406
|
-
|
|
407
|
-
return filtered_nodes
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
def _find_in_remotes(conan_api, dict_nodes, remotes):
|
|
411
|
-
for node_name, node_info in dict_nodes.items():
|
|
412
|
-
ref_pattern = ListPattern(node_name, rrev=None, prev=None)
|
|
413
|
-
for remote in remotes:
|
|
414
|
-
try:
|
|
415
|
-
remote_ref_list = conan_api.list.select(ref_pattern, package_query=None,
|
|
416
|
-
remote=remote)
|
|
417
|
-
except NotFoundException:
|
|
418
|
-
continue
|
|
419
|
-
if not remote_ref_list.recipes:
|
|
420
|
-
continue
|
|
421
|
-
str_latest_ref = list(remote_ref_list.recipes.keys())[-1]
|
|
422
|
-
recipe_ref = RecipeReference.loads(str_latest_ref)
|
|
423
|
-
if (node_info["latest_remote"] is None
|
|
424
|
-
or node_info["latest_remote"]["ref"] < recipe_ref):
|
|
425
|
-
node_info["latest_remote"] = {"ref": recipe_ref, "remote": remote.name}
|
|
378
|
+
# DO NOT USE this API call yet, it is not stable
|
|
379
|
+
outdated = conan_api.list.outdated(deps_graph, remotes)
|
|
380
|
+
return outdated
|
|
@@ -9,7 +9,6 @@ from conan.cli.formatters.list import list_packages_html
|
|
|
9
9
|
from conan.errors import ConanException
|
|
10
10
|
from conans.util.dates import timestamp_to_str
|
|
11
11
|
|
|
12
|
-
|
|
13
12
|
# Keep them so we don't break other commands that import them, but TODO: Remove later
|
|
14
13
|
remote_color = Color.BRIGHT_BLUE
|
|
15
14
|
recipe_name_color = Color.GREEN
|
|
@@ -225,6 +224,9 @@ def list(conan_api: ConanAPI, parser, *args):
|
|
|
225
224
|
parser.add_argument("-g", "--graph", help="Graph json file")
|
|
226
225
|
parser.add_argument("-gb", "--graph-binaries", help="Which binaries are listed", action="append")
|
|
227
226
|
parser.add_argument("-gr", "--graph-recipes", help="Which recipes are listed", action="append")
|
|
227
|
+
parser.add_argument("-gc", "--graph-context", help="Filter the results by the given context",
|
|
228
|
+
default=None, action=OnceArgument,
|
|
229
|
+
choices=["build", "host", "build-only", "host-only"])
|
|
228
230
|
parser.add_argument('--lru', default=None, action=OnceArgument,
|
|
229
231
|
help="List recipes and binaries that have not been recently used. Use a"
|
|
230
232
|
" time limit like --lru=5d (days) or --lru=4w (weeks),"
|
|
@@ -248,7 +250,8 @@ def list(conan_api: ConanAPI, parser, *args):
|
|
|
248
250
|
|
|
249
251
|
if args.graph:
|
|
250
252
|
graphfile = make_abs_path(args.graph)
|
|
251
|
-
pkglist = MultiPackagesList.load_graph(graphfile, args.graph_recipes, args.graph_binaries
|
|
253
|
+
pkglist = MultiPackagesList.load_graph(graphfile, args.graph_recipes, args.graph_binaries,
|
|
254
|
+
context=args.graph_context)
|
|
252
255
|
else:
|
|
253
256
|
ref_pattern = ListPattern(args.pattern, rrev=None, prev=None)
|
|
254
257
|
if not ref_pattern.package_id and (args.package_query or args.filter_profile or
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import copy
|
|
2
|
-
|
|
3
1
|
from conan.api.conan_api import ConanAPI
|
|
4
|
-
from conan.api.model import MultiPackagesList
|
|
2
|
+
from conan.api.model import MultiPackagesList
|
|
5
3
|
from conan.cli import make_abs_path
|
|
6
4
|
from conan.cli.command import conan_command, conan_subcommand
|
|
7
5
|
from conan.cli.commands.list import print_list_text, print_list_json
|
|
8
6
|
from conan.cli.formatters.list import list_packages_html
|
|
9
|
-
from conan.internal.errors import NotFoundException
|
|
10
7
|
|
|
11
8
|
|
|
12
9
|
@conan_command(group="Consumer")
|
|
@@ -33,34 +30,7 @@ def pkglist_find_remote(conan_api, parser, subparser, *args):
|
|
|
33
30
|
multi_pkglist = MultiPackagesList.load(listfile)
|
|
34
31
|
package_list = multi_pkglist["Local Cache"]
|
|
35
32
|
selected_remotes = conan_api.remotes.list(args.remote)
|
|
36
|
-
|
|
37
|
-
result = MultiPackagesList()
|
|
38
|
-
for r in selected_remotes:
|
|
39
|
-
result_pkg_list = PackagesList()
|
|
40
|
-
for ref, recipe_bundle in package_list.refs().items():
|
|
41
|
-
ref_no_rev = copy.copy(ref) # TODO: Improve ugly API
|
|
42
|
-
ref_no_rev.revision = None
|
|
43
|
-
try:
|
|
44
|
-
revs = conan_api.list.recipe_revisions(ref_no_rev, remote=r)
|
|
45
|
-
except NotFoundException:
|
|
46
|
-
continue
|
|
47
|
-
if ref not in revs: # not found
|
|
48
|
-
continue
|
|
49
|
-
result_pkg_list.add_refs([ref])
|
|
50
|
-
for pref, pref_bundle in package_list.prefs(ref, recipe_bundle).items():
|
|
51
|
-
pref_no_rev = copy.copy(pref) # TODO: Improve ugly API
|
|
52
|
-
pref_no_rev.revision = None
|
|
53
|
-
try:
|
|
54
|
-
prevs = conan_api.list.package_revisions(pref_no_rev, remote=r)
|
|
55
|
-
except NotFoundException:
|
|
56
|
-
continue
|
|
57
|
-
if pref in prevs:
|
|
58
|
-
result_pkg_list.add_prefs(ref, [pref])
|
|
59
|
-
info = recipe_bundle["packages"][pref.package_id]["info"]
|
|
60
|
-
result_pkg_list.add_configurations({pref: info})
|
|
61
|
-
if result_pkg_list.recipes:
|
|
62
|
-
result.add(r.name, result_pkg_list)
|
|
63
|
-
|
|
33
|
+
result = conan_api.list.find_remotes(package_list, selected_remotes)
|
|
64
34
|
return {
|
|
65
35
|
"results": result.serialize(),
|
|
66
36
|
"conan_api": conan_api,
|
|
@@ -80,8 +50,8 @@ def pkglist_merge(conan_api, parser, subparser, *args):
|
|
|
80
50
|
args = parser.parse_args(*args)
|
|
81
51
|
|
|
82
52
|
result = MultiPackagesList()
|
|
83
|
-
for
|
|
84
|
-
listfile = make_abs_path(
|
|
53
|
+
for pkg_list in args.list:
|
|
54
|
+
listfile = make_abs_path(pkg_list)
|
|
85
55
|
multi_pkglist = MultiPackagesList.load(listfile)
|
|
86
56
|
result.merge(multi_pkglist)
|
|
87
57
|
|