conan 2.13.0__tar.gz → 2.15.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.13.0/conan.egg-info → conan-2.15.0}/PKG-INFO +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/__init__.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/api/conan_api.py +9 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/model/list.py +49 -4
- conan-2.15.0/conan/api/subapi/audit.py +162 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/command.py +27 -3
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/config.py +3 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/export.py +2 -4
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/install.py +7 -6
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/list.py +79 -2
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/local.py +2 -4
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/workspace.py +10 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/cli.py +2 -2
- conan-2.15.0/conan/cli/commands/audit.py +198 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/create.py +5 -22
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/graph.py +5 -50
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/list.py +5 -2
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/pkglist.py +4 -34
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/workspace.py +7 -6
- conan-2.15.0/conan/cli/formatters/audit/vulnerabilities.py +271 -0
- conan-2.15.0/conan/cli/formatters/graph/graph.py +62 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/list/list.py +4 -2
- {conan-2.13.0 → conan-2.15.0}/conan/cli/printers/graph.py +10 -6
- conan-2.15.0/conan/internal/api/audit/providers.py +205 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/install/generators.py +15 -10
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/profile/profile_loader.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/uploader.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/home_paths.py +4 -4
- {conan-2.13.0 → conan-2.15.0}/conan/internal/conan_app.py +22 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/default_settings.py +2 -1
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/conan_file.py +2 -1
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/conf.py +7 -9
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/cpp_info.py +37 -28
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/requires.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/version_range.py +8 -1
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/tools.py +13 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/apple.py +3 -3
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/cmakedeps.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/target_configuration.py +6 -18
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/cmakedeps.py +12 -6
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/target_configuration.py +50 -14
- {conan-2.13.0 → conan-2.15.0}/conan/tools/env/environment.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/__init__.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/files.py +86 -7
- {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/helpers.py +11 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/toolchain.py +13 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/msbuilddeps.py +11 -6
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/visual.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan/tools/sbom/cyclonedx.py +15 -15
- {conan-2.13.0 → conan-2.15.0/conan.egg-info}/PKG-INFO +1 -1
- {conan-2.13.0 → conan-2.15.0}/conan.egg-info/SOURCES.txt +6 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/downloaders/download_cache.py +3 -2
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/compute_pid.py +7 -3
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph.py +0 -7
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph_binaries.py +3 -2
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph_builder.py +17 -6
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/install_graph.py +13 -1
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/proxy.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/python_requires.py +1 -1
- {conan-2.13.0 → conan-2.15.0}/conans/client/hook_manager.py +1 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/installer.py +3 -8
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest_client_local_recipe_index.py +4 -7
- conan-2.15.0/conans/model/__init__.py +0 -0
- conan-2.15.0/conans/util/__init__.py +0 -0
- conan-2.13.0/conan/cli/formatters/graph/graph.py +0 -148
- {conan-2.13.0 → conan-2.15.0}/LICENSE.md +0 -0
- {conan-2.13.0 → conan-2.15.0}/MANIFEST.in +0 -0
- {conan-2.13.0 → conan-2.15.0}/README.md +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/input.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/model/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/model/refs.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/model/remote.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/output.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/cache.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/download.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/graph.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/lockfile.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/new.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/profiles.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/remotes.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/remove.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/search.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/api/subapi/upload.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/args.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/command.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/build.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/cache.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/config.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/download.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/editable.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/export.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/export_pkg.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/inspect.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/install.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/lock.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/new.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/profile.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/remote.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/remove.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/search.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/source.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/test.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/upload.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/commands/version.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/exit_codes.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api → conan-2.15.0/conan/cli/formatters/audit}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/build_order_html.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/graph_info_text.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/info_graph_dot.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/graph/info_graph_html.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/list/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/formatters/list/search_table_html.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cli/printers/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cps/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/cps/cps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/errors.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/config → conan-2.15.0/conan/internal/api}/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/detect → conan-2.15.0/conan/internal/api/audit}/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/install → conan-2.15.0/conan/internal/api/config}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/config/config_installer.py +0 -0
- {conan-2.13.0/conan/internal/api/list → conan-2.15.0/conan/internal/api/detect}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/detect/detect_api.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/detect/detect_vs.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/export.py +0 -0
- {conan-2.13.0/conan/internal/api/local → conan-2.15.0/conan/internal/api/install}/__init__.py +0 -0
- {conan-2.13.0/conan/internal/api/new → conan-2.15.0/conan/internal/api/list}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/list/query_parse.py +0 -0
- {conan-2.13.0/conan/internal/api/profile → conan-2.15.0/conan/internal/api/local}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/local/editable.py +0 -0
- {conan-2.13.0/conan/internal/api/remotes → conan-2.15.0/conan/internal/api/new}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/alias_new.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/autoools_exe.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/autotools_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/basic.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_7_exe.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_7_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_exe.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/bazel_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/cmake_exe.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/cmake_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/local_recipes_index.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/meson_exe.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/meson_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/msbuild_exe.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/msbuild_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/qbs_lib.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/new/workspace.py +0 -0
- {conan-2.13.0/conan/internal/cache → conan-2.15.0/conan/internal/api/profile}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/profile/detect.py +0 -0
- {conan-2.13.0/conan/internal/cache/db → conan-2.15.0/conan/internal/api/remotes}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/remotes/encrypt.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/api/remotes/localdb.py +0 -0
- {conan-2.13.0/conan/internal/model → conan-2.15.0/conan/internal/cache}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/cache.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/conan_reference_layout.py +0 -0
- {conan-2.13.0/conan/test → conan-2.15.0/conan/internal/cache/db}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/cache_database.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/packages_table.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/recipes_table.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/db/table.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/cache/integrity_check.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/deploy.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/errors.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/internal_tools.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/methods.py +0 -0
- {conan-2.13.0/conan/test/assets → conan-2.15.0/conan/internal/model}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/conanfile_interface.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/dependencies.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/info.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/layout.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/lockfile.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/manifest.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/options.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/pkg_type.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/profile.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/recipe_ref.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/settings.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/version.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/model/workspace.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/paths.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/docker.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/output.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/ssh.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/internal/runner/wsl.py +0 -0
- {conan-2.13.0/conan/test/utils → conan-2.15.0/conan/test}/__init__.py +0 -0
- {conan-2.13.0/conan/tools/cmake/cmakedeps2 → conan-2.15.0/conan/test/assets}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/assets/autotools.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/assets/cmake.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/assets/genconanfile.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/assets/sources.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/assets/visual_project_files.py +0 -0
- {conan-2.13.0/conan/tools/system → conan-2.15.0/conan/test/utils}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/artifactory.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/env.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/file_server.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/mocks.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/profiles.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/scm.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/server_launcher.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/test/utils/test_files.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/android/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/android/utils.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/xcodebuild.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/xcodedeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/apple/xcodetoolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cppstd.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cpu.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cross_building.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/cstd.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/flags.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/build/stdcpp_library.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmake.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/config.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/config_version.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/macros.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/target_data.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps/templates/targets.py +0 -0
- {conan-2.13.0/conans → conan-2.15.0/conan/tools/cmake/cmakedeps2}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/config.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/config_version.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/cmakedeps2/targets.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/layout.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/presets.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/toolchain/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/toolchain/blocks.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/toolchain/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cmake/utils.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cps/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/cps/cps_deps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/env/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/env/virtualbuildenv.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/env/virtualrunenv.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/conandata.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/copy_pattern.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/packager.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/patches.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/symlinks/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/files/symlinks/symlinks.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/autotools.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/autotoolsdeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/autotoolstoolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/get_gnu_triplet.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/gnudeps_flags.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/gnutoolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/makedeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/pkgconfig.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/gnu/pkgconfigdeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/google/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/google/bazel.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/google/bazeldeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/google/layout.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/google/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/intel/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/intel/intel_cc.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/layout/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/meson/meson.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/layout.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/msbuild.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/nmakedeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/nmaketoolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/subsystems.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/microsoft/toolchain.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/premake/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/premake/premake.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/premake/premakedeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/common.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/qbs.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/qbsdeps.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/qbs/qbsprofile.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/ros/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/ros/rosenv.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/sbom/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/scm/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/scm/git.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/scons/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/scons/sconsdeps.py +0 -0
- {conan-2.13.0/conans/client → conan-2.15.0/conan/tools/system}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan/tools/system/package_manager.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan.egg-info/dependency_links.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan.egg-info/entry_points.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan.egg-info/requires.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conan.egg-info/top_level.txt +0 -0
- {conan-2.13.0/conans/client/downloaders → conan-2.15.0/conans}/__init__.py +0 -0
- {conan-2.13.0/conans/client/graph → conan-2.15.0/conans/client}/__init__.py +0 -0
- {conan-2.13.0/conans/model → conan-2.15.0/conans/client/downloaders}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/downloaders/caching_file_downloader.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/downloaders/file_downloader.py +0 -0
- {conan-2.13.0/conans/util → conan-2.15.0/conans/client/graph}/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/build_mode.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/compatibility.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/graph_error.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/profile_node_definer.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/provides.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/graph/range_resolver.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/loader.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/loader_txt.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/migrations.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/pkg_sign.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/remote_manager.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/__init__.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/auth_manager.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/client_routes.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/conan_requester.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/file_uploader.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/remote_credentials.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/rest_client.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/rest_client_v2.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/rest/rest_routes.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/source.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/client/subsystems.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/conan.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/conan_server.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/migrations.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/model/package_ref.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/model/recipe_ref.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/requirements.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/requirements_dev.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/requirements_runner.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/requirements_server.txt +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/util/config_parser.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/util/dates.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/util/files.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/util/locks.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/util/runners.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/conans/util/thread.py +0 -0
- {conan-2.13.0 → conan-2.15.0}/pyproject.toml +0 -0
- {conan-2.13.0 → conan-2.15.0}/setup.cfg +0 -0
- {conan-2.13.0 → conan-2.15.0}/setup.py +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import sys
|
|
2
3
|
|
|
3
4
|
from conan.api.output import init_colorama
|
|
5
|
+
from conan.api.subapi.audit import AuditAPI
|
|
4
6
|
from conan.api.subapi.cache import CacheAPI
|
|
5
7
|
from conan.api.subapi.command import CommandAPI
|
|
6
8
|
from conan.api.subapi.local import LocalAPI
|
|
@@ -31,10 +33,16 @@ class ConanAPI:
|
|
|
31
33
|
not be created directly.
|
|
32
34
|
"""
|
|
33
35
|
def __init__(self, cache_folder=None):
|
|
36
|
+
"""
|
|
37
|
+
:param cache_folder: Conan cache/home folder. It will have less priority than the
|
|
38
|
+
"home_folder" defined in a Workspace.
|
|
39
|
+
"""
|
|
34
40
|
|
|
35
41
|
version = sys.version_info
|
|
36
42
|
if version.major == 2 or version.minor < 6:
|
|
37
43
|
raise ConanException("Conan needs Python >= 3.6")
|
|
44
|
+
if cache_folder is not None and not os.path.isabs(cache_folder):
|
|
45
|
+
raise ConanException("cache_folder has to be an absolute path")
|
|
38
46
|
|
|
39
47
|
init_colorama(sys.stderr)
|
|
40
48
|
self.workspace = WorkspaceAPI(self)
|
|
@@ -62,6 +70,7 @@ class ConanAPI:
|
|
|
62
70
|
self.cache = CacheAPI(self)
|
|
63
71
|
self.lockfile = LockfileAPI(self)
|
|
64
72
|
self.local = LocalAPI(self)
|
|
73
|
+
self.audit = AuditAPI(self)
|
|
65
74
|
|
|
66
75
|
_check_conan_version(self)
|
|
67
76
|
|
|
@@ -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.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import binascii
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import base64
|
|
5
|
+
|
|
6
|
+
from conan.internal.api.audit.providers import ConanCenterProvider, PrivateProvider
|
|
7
|
+
from conan.errors import ConanException
|
|
8
|
+
from conan.internal.api.remotes.encrypt import encode, decode
|
|
9
|
+
from conan.internal.model.recipe_ref import RecipeReference
|
|
10
|
+
from conans.util.files import save, load
|
|
11
|
+
|
|
12
|
+
CONAN_CENTER_AUDIT_PROVIDER_NAME = "conancenter"
|
|
13
|
+
CYPHER_KEY = "private"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class AuditAPI:
|
|
17
|
+
"""
|
|
18
|
+
This class provides the functionality to scan references for vulnerabilities.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, conan_api):
|
|
22
|
+
self.conan_api = conan_api
|
|
23
|
+
self._home_folder = conan_api.home_folder
|
|
24
|
+
self._providers_path = os.path.join(self._home_folder, "audit_providers.json")
|
|
25
|
+
self._provider_cls = {
|
|
26
|
+
"conan-center-proxy": ConanCenterProvider,
|
|
27
|
+
"private": PrivateProvider,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def scan(deps_graph, provider):
|
|
32
|
+
"""
|
|
33
|
+
Scan a given recipe for vulnerabilities in its dependencies.
|
|
34
|
+
"""
|
|
35
|
+
refs = sorted(set(RecipeReference.loads(f"{node.ref.name}/{node.ref.version}")
|
|
36
|
+
for node in deps_graph.nodes[1:]), key=lambda ref: ref.name)
|
|
37
|
+
return provider.get_cves(refs)
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def list(references, provider):
|
|
41
|
+
"""
|
|
42
|
+
List the vulnerabilities of the given reference.
|
|
43
|
+
"""
|
|
44
|
+
refs = [RecipeReference.loads(ref) for ref in references]
|
|
45
|
+
for ref in refs:
|
|
46
|
+
ref.validate_ref()
|
|
47
|
+
return provider.get_cves(refs)
|
|
48
|
+
|
|
49
|
+
def get_provider(self, provider_name):
|
|
50
|
+
"""
|
|
51
|
+
Get the provider by name.
|
|
52
|
+
"""
|
|
53
|
+
# TODO: More work remains to be done here, hardcoded for now for testing
|
|
54
|
+
providers = _load_providers(self._providers_path)
|
|
55
|
+
if provider_name not in providers:
|
|
56
|
+
add_arguments = (
|
|
57
|
+
"--url=https://audit.conan.io/ --type=conan-center-proxy"
|
|
58
|
+
if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
|
|
59
|
+
else "--url=<url> --type=<type>"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
register_message = (
|
|
63
|
+
f"If you don't have a valid token, register at: https://audit.conan.io/register."
|
|
64
|
+
if provider_name == CONAN_CENTER_AUDIT_PROVIDER_NAME
|
|
65
|
+
else ""
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
raise ConanException(
|
|
69
|
+
f"Provider '{provider_name}' not found. Please specify a valid provider name or add it using: "
|
|
70
|
+
f"'conan audit provider add {provider_name} {add_arguments} --token=<token>'\n"
|
|
71
|
+
f"{register_message}"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
provider_data = providers[provider_name]
|
|
75
|
+
safe_provider_name = provider_name.replace("-", "_")
|
|
76
|
+
env_token = os.getenv(f"CONAN_AUDIT_PROVIDER_TOKEN_{safe_provider_name.upper()}")
|
|
77
|
+
|
|
78
|
+
if env_token:
|
|
79
|
+
# Always override the token with the environment variable
|
|
80
|
+
provider_data["token"] = env_token
|
|
81
|
+
elif "token" in provider_data:
|
|
82
|
+
try:
|
|
83
|
+
provider_data["token"] = decode(base64.standard_b64decode(provider_data["token"]).decode(), CYPHER_KEY)
|
|
84
|
+
except binascii.Error as e:
|
|
85
|
+
raise ConanException(f"Invalid token format for provider '{provider_name}'. The token might be corrupt.")
|
|
86
|
+
|
|
87
|
+
provider_cls = self._provider_cls.get(provider_data["type"])
|
|
88
|
+
|
|
89
|
+
return provider_cls(self.conan_api, provider_name, provider_data)
|
|
90
|
+
|
|
91
|
+
def list_providers(self):
|
|
92
|
+
"""
|
|
93
|
+
Get all available providers.
|
|
94
|
+
"""
|
|
95
|
+
providers = _load_providers(self._providers_path)
|
|
96
|
+
result = []
|
|
97
|
+
for name, provider_data in providers.items():
|
|
98
|
+
provider_cls = self._provider_cls.get(provider_data["type"])
|
|
99
|
+
result.append(provider_cls(self.conan_api, name, provider_data))
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
def add_provider(self, name, url, provider_type):
|
|
103
|
+
"""
|
|
104
|
+
Add a provider.
|
|
105
|
+
"""
|
|
106
|
+
providers = _load_providers(self._providers_path)
|
|
107
|
+
if name in providers:
|
|
108
|
+
raise ConanException(f"Provider '{name}' already exists")
|
|
109
|
+
|
|
110
|
+
if provider_type not in self._provider_cls:
|
|
111
|
+
raise ConanException(f"Provider type '{provider_type}' not found")
|
|
112
|
+
|
|
113
|
+
providers[name] = {
|
|
114
|
+
"name": name,
|
|
115
|
+
"url": url,
|
|
116
|
+
"type": provider_type
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
_save_providers(self._providers_path, providers)
|
|
120
|
+
|
|
121
|
+
def remove_provider(self, provider_name):
|
|
122
|
+
"""
|
|
123
|
+
Remove a provider.
|
|
124
|
+
"""
|
|
125
|
+
providers = _load_providers(self._providers_path)
|
|
126
|
+
if provider_name not in providers:
|
|
127
|
+
raise ConanException(f"Provider '{provider_name}' not found")
|
|
128
|
+
|
|
129
|
+
del providers[provider_name]
|
|
130
|
+
|
|
131
|
+
_save_providers(self._providers_path, providers)
|
|
132
|
+
|
|
133
|
+
def auth_provider(self, provider, token):
|
|
134
|
+
"""
|
|
135
|
+
Authenticate a provider.
|
|
136
|
+
"""
|
|
137
|
+
if not provider:
|
|
138
|
+
raise ConanException("Provider not found")
|
|
139
|
+
|
|
140
|
+
providers = _load_providers(self._providers_path)
|
|
141
|
+
|
|
142
|
+
assert provider.name in providers
|
|
143
|
+
providers[provider.name]["token"] = base64.standard_b64encode(encode(token, CYPHER_KEY).encode()).decode()
|
|
144
|
+
setattr(provider, "token", token)
|
|
145
|
+
_save_providers(self._providers_path, providers)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _load_providers(providers_path):
|
|
149
|
+
if not os.path.exists(providers_path):
|
|
150
|
+
default_providers = {
|
|
151
|
+
CONAN_CENTER_AUDIT_PROVIDER_NAME: {
|
|
152
|
+
"url": "https://audit.conan.io/",
|
|
153
|
+
"type": "conan-center-proxy"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
save(providers_path, json.dumps(default_providers, indent=4))
|
|
157
|
+
|
|
158
|
+
return json.loads(load(providers_path))
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _save_providers(providers_path, providers):
|
|
162
|
+
save(providers_path, json.dumps(providers, indent=4))
|
|
@@ -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
|
|
@@ -20,6 +20,7 @@ from conan.internal.model.conf import ConfDefinition, BUILT_IN_CONFS, CORE_CONF_
|
|
|
20
20
|
from conan.internal.model.pkg_type import PackageType
|
|
21
21
|
from conan.api.model import RecipeReference
|
|
22
22
|
from conan.internal.model.settings import Settings
|
|
23
|
+
from conans.client.hook_manager import HookManager
|
|
23
24
|
from conans.util.files import load, save, rmdir, remove
|
|
24
25
|
|
|
25
26
|
|
|
@@ -29,6 +30,7 @@ class ConfigAPI:
|
|
|
29
30
|
self.conan_api = conan_api
|
|
30
31
|
self._new_config = None
|
|
31
32
|
self._cli_core_confs = None
|
|
33
|
+
self.hook_manager = HookManager(HomePaths(conan_api.home_folder).hooks_path)
|
|
32
34
|
|
|
33
35
|
def home(self):
|
|
34
36
|
return self.conan_api.cache_folder
|
|
@@ -234,3 +236,4 @@ class ConfigAPI:
|
|
|
234
236
|
if self._new_config is not None:
|
|
235
237
|
self._new_config.clear()
|
|
236
238
|
self._populate_global_conf()
|
|
239
|
+
self.hook_manager = HookManager(HomePaths(self.conan_api.home_folder).hooks_path)
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
from conan.api.output import ConanOutput
|
|
2
2
|
from conan.internal.cache.cache import PkgCache
|
|
3
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
4
3
|
from conan.internal.conan_app import ConanApp
|
|
5
4
|
from conan.internal.api.export import cmd_export
|
|
6
5
|
from conan.internal.methods import run_package_method
|
|
7
6
|
from conans.client.graph.graph import BINARY_BUILD, RECIPE_INCACHE
|
|
8
|
-
from conans.client.hook_manager import HookManager
|
|
9
7
|
from conan.api.model import PkgReference
|
|
10
8
|
from conans.util.files import mkdir
|
|
11
9
|
|
|
@@ -18,13 +16,13 @@ class ExportAPI:
|
|
|
18
16
|
def export(self, path, name, version, user, channel, lockfile=None, remotes=None):
|
|
19
17
|
ConanOutput().title("Exporting recipe to the cache")
|
|
20
18
|
app = ConanApp(self.conan_api)
|
|
21
|
-
hook_manager =
|
|
19
|
+
hook_manager = self.conan_api.config.hook_manager
|
|
22
20
|
return cmd_export(app, hook_manager, self.conan_api.config.global_conf, path, name, version,
|
|
23
21
|
user, channel, graph_lock=lockfile, remotes=remotes)
|
|
24
22
|
|
|
25
23
|
def export_pkg(self, deps_graph, source_folder, output_folder):
|
|
26
24
|
cache = PkgCache(self.conan_api.cache_folder, self.conan_api.config.global_conf)
|
|
27
|
-
hook_manager =
|
|
25
|
+
hook_manager = self.conan_api.config.hook_manager
|
|
28
26
|
|
|
29
27
|
# The graph has to be loaded with build_mode=[ref.name], so that node is not tried
|
|
30
28
|
# to be downloaded from remotes
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
3
|
from conan.internal.api.install.generators import write_generators
|
|
4
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
5
4
|
from conan.internal.conan_app import ConanBasicApp
|
|
6
5
|
from conan.internal.deploy import do_deploys
|
|
7
6
|
|
|
8
7
|
from conans.client.graph.install_graph import InstallGraph
|
|
9
|
-
from conans.client.hook_manager import HookManager
|
|
10
8
|
from conans.client.installer import BinaryInstaller
|
|
11
9
|
from conan.errors import ConanInvalidConfiguration
|
|
12
10
|
|
|
@@ -22,7 +20,8 @@ class InstallAPI:
|
|
|
22
20
|
:param remotes:
|
|
23
21
|
"""
|
|
24
22
|
app = ConanBasicApp(self.conan_api)
|
|
25
|
-
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages
|
|
23
|
+
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
|
|
24
|
+
self.conan_api.config.hook_manager)
|
|
26
25
|
install_graph = InstallGraph(deps_graph)
|
|
27
26
|
install_graph.raise_errors()
|
|
28
27
|
install_order = install_graph.install_order()
|
|
@@ -35,7 +34,8 @@ class InstallAPI:
|
|
|
35
34
|
:param graph: Dependency graph to intall packages for
|
|
36
35
|
"""
|
|
37
36
|
app = ConanBasicApp(self.conan_api)
|
|
38
|
-
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages
|
|
37
|
+
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
|
|
38
|
+
self.conan_api.config.hook_manager)
|
|
39
39
|
installer.install_system_requires(graph, only_info)
|
|
40
40
|
|
|
41
41
|
def install_sources(self, graph, remotes):
|
|
@@ -45,7 +45,8 @@ class InstallAPI:
|
|
|
45
45
|
:param graph: Dependency graph to install packages for
|
|
46
46
|
"""
|
|
47
47
|
app = ConanBasicApp(self.conan_api)
|
|
48
|
-
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages
|
|
48
|
+
installer = BinaryInstaller(app, self.conan_api.config.global_conf, app.editable_packages,
|
|
49
|
+
self.conan_api.config.hook_manager)
|
|
49
50
|
installer.install_sources(graph, remotes)
|
|
50
51
|
|
|
51
52
|
# TODO: Look for a better name
|
|
@@ -86,7 +87,7 @@ class InstallAPI:
|
|
|
86
87
|
if gen not in final_generators:
|
|
87
88
|
final_generators.append(gen)
|
|
88
89
|
conanfile.generators = final_generators
|
|
89
|
-
hook_manager =
|
|
90
|
+
hook_manager = self.conan_api.config.hook_manager
|
|
90
91
|
write_generators(conanfile, hook_manager, self.conan_api.home_folder,
|
|
91
92
|
envs_generation=envs_generation)
|
|
92
93
|
|
|
@@ -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):
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
3
|
from conan.cli import make_abs_path
|
|
4
|
-
from conan.internal.cache.home_paths import HomePaths
|
|
5
4
|
from conan.internal.conan_app import ConanApp
|
|
6
5
|
from conan.internal.api.local.editable import EditablePackages
|
|
7
6
|
from conan.internal.methods import run_build_method, run_source_method
|
|
@@ -9,7 +8,6 @@ from conans.client.graph.graph import CONTEXT_HOST
|
|
|
9
8
|
from conans.client.graph.profile_node_definer import initialize_conanfile_profile
|
|
10
9
|
from conan.internal.errors import conanfile_exception_formatter
|
|
11
10
|
from conan.errors import ConanException
|
|
12
|
-
from conans.client.hook_manager import HookManager
|
|
13
11
|
from conan.api.model import RecipeReference
|
|
14
12
|
from conans.util.files import chdir
|
|
15
13
|
|
|
@@ -93,13 +91,13 @@ class LocalAPI:
|
|
|
93
91
|
conanfile.folders.set_base_build(None)
|
|
94
92
|
conanfile.folders.set_base_package(None)
|
|
95
93
|
|
|
96
|
-
hook_manager =
|
|
94
|
+
hook_manager = self._conan_api.config.hook_manager
|
|
97
95
|
run_source_method(conanfile, hook_manager)
|
|
98
96
|
|
|
99
97
|
def build(self, conanfile):
|
|
100
98
|
""" calls the 'build()' method of the current (user folder) conanfile.py
|
|
101
99
|
"""
|
|
102
|
-
hook_manager =
|
|
100
|
+
hook_manager = self._conan_api.config.hook_manager
|
|
103
101
|
conanfile.folders.set_base_package(conanfile.folders.base_build)
|
|
104
102
|
conanfile.folders.set_base_pkg_metadata(os.path.join(conanfile.build_folder, "metadata"))
|
|
105
103
|
run_build_method(conanfile, hook_manager)
|
|
@@ -122,6 +122,16 @@ class WorkspaceAPI:
|
|
|
122
122
|
v["output_folder"]))
|
|
123
123
|
return editables
|
|
124
124
|
|
|
125
|
+
def select_editables(self, paths):
|
|
126
|
+
filtered_refs = [self.editable_from_path(p) for p in paths or []]
|
|
127
|
+
editables = self.editable_packages
|
|
128
|
+
requires = [ref for ref in editables]
|
|
129
|
+
if filtered_refs:
|
|
130
|
+
ConanOutput().info(f"Filtering and installing only selected editable packages")
|
|
131
|
+
requires = [ref for ref in requires if ref in filtered_refs]
|
|
132
|
+
ConanOutput().info(f"Filtered references: {requires}")
|
|
133
|
+
return requires
|
|
134
|
+
|
|
125
135
|
@property
|
|
126
136
|
def products(self):
|
|
127
137
|
self._check_ws()
|
|
@@ -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
|